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次下载
165KB
3K SLoC
Springtime Web Axum
基于Springtime应用程序框架和axum的Web框架。受Java中的Spring框架的启发,Springtime Web Axum通过确保应用程序的所有组件都相互正确解耦,并由依赖注入系统管理,提供了一种创建高级模块化Rust Web应用程序的方法。
虽然axum
提供了一种以命令式方式显式创建Web处理程序的方法,但此crate提供了以声明式方式创建多层应用程序并利用底层依赖注入的选项。这有助于快速应用程序开发和组件之间的松耦合。
特性
- 自动控制器发现(带有依赖注入的Web处理程序)
- 分层路由路径
- 支持多个服务器实例和控制器过滤
- 内置外部文件和可编程配置
- 高级路由配置
- 提供所有由
axum
提供的功能
基本用法
Springtime Web Axum高度可配置,但最基本的使用示例非常简单,包括声明控制器、创建一个Application
实例并调用run()
。有关教程、高级功能和模式,请参阅示例,它构成了逐步指南。
以下示例假设您熟悉springtime和springtime-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