< 返回版块

ZihanType 发表于 2024-03-06 01:05

Tags:web, framework, dependency-injection, OpenAPI

Predawn

Predawn,一个类似 Spring Boot 的 web 框架。

在目前的 Rust 社区中,web 框架有很多,比如 axumrocketpoem 等等,但是这些框架有一些问题,比如需要开发者添加一些模板启动代码、需要自己定义配置文件、没有自动依赖注入、集中式注册路由等等,有一些新的框架,如 locopavex 在尝试解决这些问题,但是它们的 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 文档生成。
  • 自动扫描配置文件。

Rudi

Predawn

目前项目仍处于开发阶段,很多功能都没有,文档和测试也聊胜于无,但是我会尽快完善。

还没有实现的功能在 todo.txt 里面,如果有什么建议、意见、需求,欢迎提 issue。如果觉得有点意思,可以点个 star。

评论区

写评论
miaomiao1992 2024-05-06 22:45

循环依赖如何解决?

lagudomeze 2024-04-09 20:36

看着使用了dyn trait,能用泛型吗?

作者 ZihanType 2024-03-06 19:29

代码数量多了之后,就得用设计模式、控制反转等等这些方法减少代码之间的耦合,这和什么语言无关。反过来说,为什么 Rust 不需要依赖注入呢?为什么 Java 就需要依赖注入呢?代码量带来复杂性对所有语言来说都是要面对的。

--
👇
liangyongrui: rust 有必要依赖注入吗?

liangyongrui 2024-03-06 11:07

rust 有必要依赖注入吗?

1 共 4 条评论, 1 页