#service #container #ioc

shive

Shive是一个为Rust应用程序编写的轻量级IOC服务容器

1个不稳定版本

0.1.0-alpha.12024年7月15日

#14 in #ioc

Download history 104/week @ 2024-07-14

104 每月下载量

MIT 协议

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