6个版本
0.1.5 | 2024年7月21日 |
---|---|
0.1.4 | 2024年7月21日 |
#56 in #dependency-injection
每月 399 次下载
用于 yadir
17KB
256 行
Yadir
Yadir是另一个Rust依赖注入注册表。
关于
Yadir的API深受.NET的Microsoft.Extensions.DependencyInjection库的启发。它提供了一种简单易用的方法,可以在运行时注册和解析Rust应用程序中的依赖项。
它的初始实现基于Will Crichton在其关于Rust类型驱动API设计的书籍中提出的注册设计模式。
用法
将Yadir添加到您的Cargo.toml
文件中
[dependencies]
yadir = { version = "0.3.0", features = ["derive"] }
创建一个新的注册表并注册您的依赖项,之后为每个依赖项实现DIBuilder
trait
use yadir::core::contracts::DIBuilder;
use yadir::core::primitives::{DIManager, DIObj};
use yadir::{deps, let_deps};
use async_trait::async_trait;
use dyn_clone::{clone_trait_object, DynClone};
use yadir_derive::DIBuilder;
clone_trait_object!(Printer);
clone_trait_object!(Writer);
trait Printer: Sync + Send + DynClone {
fn print(&self) -> String;
}
trait Writer: Sync + Send + DynClone {
fn write(&self) -> String;
}
#[derive(Clone, DIBuilder)]
#[build_as(Box<dyn Printer>)]
struct Bar;
impl Printer for Bar {
fn print(&self) -> String {
"bar".to_string()
}
}
#[derive(Clone, DIBuilder)]
#[build_as(Box<dyn Writer>)]
struct Baz;
impl Writer for Baz {
fn write(&self) -> String {
"baz".to_string()
}
}
#[derive(Clone, DIBuilder)]
#[build_method("new")]
struct Foo {
#[deps]
printer: Box<dyn Printer>,
#[deps]
writer: Box<dyn Writer>,
}
impl Foo {
fn new(printer: Box<dyn Printer>, writer: Box<dyn Writer>) -> Self {
Self { printer, writer }
}
fn print(&self) -> String {
format!("foo {} {}", self.printer.print(), self.writer.write())
}
}
#[tokio::main]
async fn main() {
let mut manager = DIManager::default();
manager.build::<Bar>().await;
manager.build::<Baz>().await;
let foo = manager.build::<Foo>().await.unwrap().extract();
assert_eq!(foo.print(), "foo bar baz");
}
许可
本项目采用MIT许可 - 有关详细信息,请参阅LICENSE文件。
依赖项
~245–680KB
~16K SLoC