在router中使用依赖注入
时间: 2024-11-20 18:56:32 浏览: 4
JavaScript反射与依赖注入实例详解
在 Actix Router 中,依赖注入是一种常见的设计模式,用于管理路由处理器的依赖项。Router 负责匹配 URL 并调度相应的处理函数或 actor 来处理请求。为了提高模块化和复用性,我们可以利用依赖注入来提供外部服务到路由处理器。
以下是路由器中使用依赖注入的一个基本示例:
```rust
use actix_web::{web, App, Error, HttpServer, Responder};
use actix_mailer::Sender;
// 定义一个依赖于邮件发送服务的路由处理器
struct EmailHandler(Sender);
impl Actor for EmailHandler {
type Context = Context<Self>;
}
impl Handler<SendEmail> for EmailHandler {
type Result = Result<(), Error>;
fn handle(&mut self, msg: SendEmail, _: &mut Self::Context) -> Self::Result {
// 使用邮件发送服务发送电子邮件
self.0.send_email(...);
Ok(())
}
}
#[post("/send-email")]
async fn send_email(email: web::Json<SendEmailData>, handler: web::Data<EmailHandler>) -> Result<Responder, Error> {
// 将 EmailHandler 作为数据传递给路由处理函数
let email_handler = handler.get().await?;
email_handler.handle(email.into_inner(), ...)
}
fn main() -> std::io::Result<()> {
let app = App::new()
.data(EmailHandler(Sender::default())) // 创建邮件发送服务实例并绑定到应用上下文
.route("/send-email", web::post().to(send_email));
HttpServer::new(move || app).bind("127.0.0.1:8080").serve().await?
}
```
在这个例子中,`EmailHandler` 需要 `Sender` 来发送邮件,而在 `send_email` 函数中,我们直接从 `web::Data` 的键中获取这个依赖。这样,在每次处理 `/send-email` 请求时,都会自动使用预配置的邮件发送服务。
阅读全文