Predawn
Predawn,一个类似 Spring Boot 的 web 框架。
在目前的 Rust 社区中,web 框架有很多,比如 axum
、rocket
、poem
等等,但是这些框架有一些问题,比如需要开发者添加一些模板启动代码、需要自己定义配置文件、没有自动依赖注入、集中式注册路由等等,有一些新的框架,如 loco
、pavex
在尝试解决这些问题,但是它们的 API 设计对用惯了 Spring Boot
的我来说,还是不够顺手。
我决定写一个像 Spring Boot
那样的 web 框架。
要写 Spring Boot
,先要写 Spring
,所以我之前写了一个依赖注入框架 Rudi
,目前已经发布到 0.8.1
版本,API 基本已经稳定了,可以用来写 web 框架了。
在 Rudi
的基础上,我完成了 Predawn
的第一个版本。
示例
use std::sync::Arc;
use async_trait::async_trait;
use predawn::{
app::{run_app, Hooks},
controller,
};
use rudi::Singleton;
struct App;
impl Hooks for App {}
#[tokio::main]
async fn main() {
run_app::<App>().await;
}
#[async_trait]
trait Service: Send + Sync {
fn arc(self) -> Arc<dyn Service>
where
Self: Sized + 'static,
{
Arc::new(self)
}
async fn hello(&self) -> String;
}
#[derive(Clone)]
#[Singleton(binds = [Service::arc])]
struct ServiceImpl;
#[async_trait]
impl Service for ServiceImpl {
async fn hello(&self) -> String {
"Hello, World!".to_string()
}
}
#[derive(Clone)]
#[Singleton]
struct Controller {
svc: Arc<dyn Service>,
}
#[controller]
impl Controller {
#[handler(paths = ["/"], methods = [GET])]
async fn hello(&self) -> String {
self.svc.hello().await
}
}
更详细的示例可以在仓库里面看到,虽然目前只有一个。
特性
- 自动依赖注入。
- 自动注册路由。
- 内建 OpenAPI 文档生成。
- 自动扫描配置文件。
目前项目仍处于开发阶段,很多功能都没有,文档和测试也聊胜于无,但是我会尽快完善。
还没有实现的功能在 todo.txt
里面,如果有什么建议、意见、需求,欢迎提 issue。如果觉得有点意思,可以点个 star。
1
共 4 条评论, 1 页
评论区
写评论循环依赖如何解决?
看着使用了dyn trait,能用泛型吗?
代码数量多了之后,就得用设计模式、控制反转等等这些方法减少代码之间的耦合,这和什么语言无关。反过来说,为什么 Rust 不需要依赖注入呢?为什么 Java 就需要依赖注入呢?代码量带来复杂性对所有语言来说都是要面对的。
--
👇
liangyongrui: rust 有必要依赖注入吗?
rust 有必要依赖注入吗?