1个不稳定版本
0.1.0-alpha.1 | 2024年7月15日 |
---|
#14 in #ioc
104 每月下载量
17KB
249 行代码
Shive - 服务蜂巢
🐝 简介
Shive,即服务蜂巢,是为Rust应用程序编写的轻量级IOC服务容器。这是IOC的基本实现,用于管理容器中的服务。
🏁 安装
要在项目中使用库,您可以在Cargo.toml文件中添加以下行
shive= {版本= "0.1.0-alpha.1",功能= ["衍生"] }
正在进行中,这不是生产就绪版本,请谨慎操作。
🚀 开始使用
创建服务
服务是一个结构体,它通过服务提供者进行初始化并实现了Service
特质。如果服务依赖于其他服务,则必须在结构体属性中添加这些服务,并且它们必须位于一个Arc指针中。
示例
#[derive(Clone)]
pub struct TestService {
test_repository: Arc<TestRepository>,
}
impl Service for TestService {
fn as_any(&self) -> &dyn std::any::Any {
self
}
fn init(service_provider: &ServiceProvider) -> Arc<dyn Service>
where
Self: Sized,
{
let test_repository = ServiceManager::get_instance::<TestRepository>(service_provider)
.expect("Error to retrieve instance");
Arc::new(Self { test_repository })
}
}
通过使用derive
功能,您可以使用Service
衍生宏简化此声明
#[derive(Service, Clone)]
pub struct TestService {
test_repository: Arc<TestRepository>,
}
创建服务容器
要创建服务容器,请使用new
方法。
示例
let mut service_container = ServiceContainer::new();
声明服务
服务容器中可以声明4个生命周期
- singleton:与容器具有相同生命周期的服务。
service_container.add_singleton::<TestType>();
- scoped:直到服务提供者结束为止存在的服务。
service_container.add_scoped::<TestType>();
- transient:为服务提供者每次调用创建的服务。
service_container.add_transient::<TestType>();
- unmanaged:不由服务提供者管理的服务。当在容器中声明时,服务将手动提供。
service_container.add_unmanaged::<TestType>(TestType::new());
获取服务提供者
服务提供者包含具有其生命周期范围的服务,单例服务和未管理服务。
对于transient服务,它们在每次从服务提供者请求时都会创建。
要从容器获取服务提供者,您需要构建服务容器以获取根服务提供者。然后,您可以通过从该容器创建一个新的范围来获取服务提供者。
示例
let root_service_provider = service_container.build();
let service_provider = root_provider.create_scope();
获取服务
可以使用get_instance
方法从服务提供者获取服务。
示例
let service = service_provider.get_instance::<TestType>();
依赖项
~110KB