#web-apps #web-framework #axum #web #spring #http #framework

springtime-web-axum

基于Springtime和axum的Web框架

4个版本 (稳定版)

2.0.1 2024年5月7日
2.0.0 2023年11月27日
1.0.0 2023年4月26日
0.2.0 2023年4月21日

#1088 in HTTP服务器

每月37次下载

MIT许可证

165KB
3K SLoC

Springtime Web Axum

crates.io version build status

基于Springtime应用程序框架和axum的Web框架。受Java中的Spring框架的启发,Springtime Web Axum通过确保应用程序的所有组件都相互正确解耦,并由依赖注入系统管理,提供了一种创建高级模块化Rust Web应用程序的方法。

虽然axum提供了一种以命令式方式显式创建Web处理程序的方法,但此crate提供了以声明式方式创建多层应用程序并利用底层依赖注入的选项。这有助于快速应用程序开发和组件之间的松耦合。

特性

  • 自动控制器发现(带有依赖注入的Web处理程序)
  • 分层路由路径
  • 支持多个服务器实例和控制器过滤
  • 内置外部文件和可编程配置
  • 高级路由配置
  • 提供所有由axum提供的功能

基本用法

Springtime Web Axum高度可配置,但最基本的使用示例非常简单,包括声明控制器、创建一个Application实例并调用run()。有关教程、高级功能和模式,请参阅示例,它构成了逐步指南。

以下示例假设您熟悉springtimespringtime-di

use axum::extract::Path;
use springtime::application;
use springtime_di::instance_provider::ComponentInstancePtr;
use springtime_di::{injectable, Component, component_alias};
use springtime_web_axum::controller;

// injectable example trait representing a domain service
#[injectable]
trait DomainService {
    fn get_important_message(&self, user: &str) -> String;
}

// concrete service implementation
#[derive(Component)]
struct ExampleDomainService;

// register ExampleDomainService as providing dyn DomainService
#[component_alias]
impl DomainService for ExampleDomainService {
    fn get_important_message(&self, user: &str) -> String {
        format!("Hello {}!", user)
    }
}

// create a struct which will serve as our Controller - this implies it needs to be a Component for
// the dependency injection to work
#[derive(Component)]
struct ExampleController {
    // inject the domain service (alternatively, inject concrete type instead of a trait)
    service: ComponentInstancePtr<dyn DomainService + Send + Sync>,
}

// mark the struct as a Controller - this will scan all functions for the controller attributes and
// create axum handlers out of them
#[controller]
impl ExampleController {
    // this function will respond to GET request for https://127.0.0.1/ (or any network interface)
    #[get("/")]
    async fn hello_world(&self) -> &'static str {
        "Hello world!"
    }

    // all axum features are available for controllers
    #[get("/:user")]
    async fn hello_user(&self, Path(user): Path<String>) -> String {
        // delegate work to our domain service
        self.service.get_important_message(&user)
    }
}

// note: for the sake of simplicity, errors are unwrapped, rather than gracefully handled
#[tokio::main]
async fn main() {
    let mut application =
        application::create_default().expect("unable to create application");

    // run our server with default configuration - requests should be forwarded to ExampleController
    application.run().await.expect("error running application");
}

依赖项

~16MB
~272K SLoC