1个不稳定版本
0.1.0-alpha.1 | 2024年7月15日 |
---|
#57 在 #ioc
106 每月下载次数
用于 shive
8KB
71 行
Shive - 服务蜂群
🐝 简介
Shive,服务蜂群,是针对Rust应用程序编写的轻量级IOC服务容器。这是IOC的基本实现,用于管理容器中的服务。
🏁 安装
要在项目中使用此库,您可以在Cargo.toml文件中添加以下行
shive= {版本= "0.1.0-alpha.1",功能= ["derive"] }
正在开发中,这不是生产就绪版本,请谨慎使用。
🚀 开始使用
创建服务
服务是一个实现了Service
trait的结构体,由服务提供者初始化。如果服务依赖于其他服务,则必须将这些服务添加到结构体属性中,并且它们必须托管在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宏简化此声明
#[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());
获取服务提供者
服务提供者包含由其生命周期限定的服务、单例服务和非托管服务。
对于瞬态服务,它们在每次从服务提供者请求时都会创建。
要从容器中获取服务提供者,您需要构建服务容器以获取根服务提供者。然后,您可以通过从这个根服务提供者创建新作用域来获取服务提供者。
示例
let root_service_provider = service_container.build();
let service_provider = root_provider.create_scope();
获取服务
可以使用get_instance
方法从服务提供者获取服务。
示例
let service = service_provider.get_instance::<TestType>();
依赖项
~265–710KB
~17K SLoC