1个不稳定版本

0.0.1 2021年8月11日

#18#inversion-of-control

Download history 7/week @ 2024-04-06 104/week @ 2024-04-13 51/week @ 2024-04-20 17/week @ 2024-04-27 1/week @ 2024-05-04 7/week @ 2024-05-11 24/week @ 2024-05-18 14/week @ 2024-05-25 75/week @ 2024-06-01 51/week @ 2024-06-08 19/week @ 2024-06-15 35/week @ 2024-06-22 11/week @ 2024-06-29 70/week @ 2024-07-06 32/week @ 2024-07-13 11/week @ 2024-07-20

124 每月下载次数

MIT 许可证

69KB
1.5K SLoC

轻量级控制反转

use {minfac::{Registered, ServiceCollection}};

let mut collection = ServiceCollection::new();
collection
    .with::<Registered<u8>>()
    .register(|byte| byte as i16 * 2);
collection.register(|| 1u8);
let provider = collection.build().expect("Configuration is valid");

assert_eq!(Some(2i16), provider.get::<i16>());

特性

  • 注册不属于您的crate的类型/特质(例如 std::*)。无需宏。
  • 从单独编译的动态库中进行服务注册。有关更多详细信息,请参阅 examples/distributed_simple
  • 临时服务作为 T 获取,没有任何额外的装饰,共享服务作为 Arc<T>
  • 继承而非作用域服务(服务请求可以委派给父 ServiceProvider
  • 服务发现,(provider.get_all::<MyService>() 返回一个迭代器,它延迟生成所有注册的 MyService 实例)
  • 快速失败。在构建 ServiceProvider 时,会检查所有注册的服务
    • 是否包含所有依赖项
    • 不包含依赖循环
  • 通过设计防止了传统IOC的常见陷阱
    • 单例服务不能引用作用域服务,因为作用域服务不存在
    • 共享服务不能超出其 ServiceProvider 的生命周期(在启用 debug_assertions 时在运行时进行检查)
  • ServiceProvider 实现 Send+Sync,且无需使用锁即可线程安全
  • #[no_std]

访问示例/文档以获取更多详细信息

依赖项

~49KB