#container #service #ioc #macro-derive #shive

shive-derive

为Shive实现#[derive(Service)]宏

1个不稳定版本

0.1.0-alpha.12024年7月15日

#57#ioc

Download history 92/week @ 2024-07-11 14/week @ 2024-07-18

106 每月下载次数
用于 shive

MIT 协议

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