4 个版本

0.1.4 2023年1月23日
0.1.3 2021年8月16日
0.1.2 2021年8月16日
0.1.1 2021年8月16日
0.1.0 2021年8月16日

#611 in Rust 模式

Download history 71/week @ 2024-03-14 41/week @ 2024-03-21 79/week @ 2024-03-28 76/week @ 2024-04-04 71/week @ 2024-04-11 37/week @ 2024-04-18 25/week @ 2024-04-25 40/week @ 2024-05-02 104/week @ 2024-05-09 129/week @ 2024-05-16 55/week @ 2024-05-23 105/week @ 2024-05-30 125/week @ 2024-06-06 52/week @ 2024-06-13 67/week @ 2024-06-20 61/week @ 2024-06-27

每月 327 次下载

MIT 许可证

52KB
330 代码行

Singleton Manager

是一个 Singleton 服务的管理服务。如果需要服务在多个线程之间保持其状态,则此单例服务可以从单例存储中拉取服务。

注意:Singleton Manager 本身不是线程安全的,因此您需要使您的服务线程安全。

使用方法

假设我们想使用一个自定义 struct 作为我们的单例

pub struct MyService {
    message: String,
    guard: Mutex<()>,
}

impl MyService {
    pub fn set(&mut self, msg: &str) {
        let mut _guard = self.guard.lock().expect("Failed to get guard");
        self.message = msg.to_string();
    }

    pub fn get(&self) -> String {
        let _guard = self.guard.lock();
        self.message.clone()
    }
}

使用对象实例

如果这是我们服务,现在我们想将其存储为单例,我们可以这样做

SingletonManager::instance().set(
        "my_service",
        "MyService",
        None,
        Some(MyService {
            message: "".to_string(),
            guard: Mutex::new(()),
        }),
    )
    .ok();

这将设置服务,现在可以通过以下方式检索

    let service = SingletonManager::instance()
        .get::<MyService>("my_service")
        .expect("Failed to get service");
    service.set("My Message");
    
    let different_service = SingletonManager::instance()
        .get::<MyService>("my_service")
        .expect("Failed to get service");
    assert_eq!("My Message".to_string(), different_service.get());

完整示例

pub struct MyService {
    message: String,
    guard: Mutex<()>,
}

impl MyService {
    pub fn set(&mut self, msg: &str) {
        let mut _guard = self.guard.lock().expect("Failed to get guard");
        self.message = msg.to_string();
    }

    pub fn get(&self) -> String {
        let _guard = self.guard.lock();
        self.message.clone()
    }
}

fn main() {
    SingletonManager::instance().set(
        "my_service",
        "MyService",
        None,
        Some(MyService {
            message: "".to_string(),
            guard: Mutex::new(()),
        }),
    )
    .ok();
    let service = SingletonManager::instance()
        .get::<MyService>("my_service")
        .expect("Failed to get service");
    service.set("My Message");
    
    let different_service = SingletonManager::instance()
        .get::<MyService>("my_service")
        .expect("Failed to get service");
    assert_eq!("My Message".to_string(), different_service.get());
}

使用工厂实例

可以使用工厂创建服务以按需实例化

SingletonManager::instance()
    .set_factory(
        "my_service_factory",
        Box::new(|| {
            Box::new(MyService {
                message: "".to_string(),
                guard: Mutex::new(()),
            })
        }),
    )
    .ok();

这将设置服务,现在可以通过以下方式检索

fn main() {
    set_service();
    let service = SingletonManager::instance()
        .get::<MyService>("my_service_factory")
        .expect("Failed to get service");
    service.set("My Message");
    
    let different_service = SingletonManager::instance()
        .get::<MyService>("my_service_factory")
        .expect("Failed to get service");
    assert_eq!("My Message".to_string(), different_service.get());
}

完整示例

pub struct MyService {
    message: String,
    guard: Mutex<()>,
}

impl MyService {
    pub fn set(&mut self, msg: &str) {
        let mut _guard = self.guard.lock().expect("Failed to get guard");
        self.message = msg.to_string();
    }

    pub fn get(&self) -> String {
        let _guard = self.guard.lock();
        self.message.clone()
    }
}

fn main() {
    SingletonManager::instance()
        .set_factory(
            "my_service_factory",
            Box::new(|| {
                Box::new(MyService {
                    message: "".to_string(),
                    guard: Mutex::new(()),
                })
            }),
        )
        .ok();

    let service = SingletonManager::instance()
        .get::<MyService>("my_service_factory")
        .unwrap();
    service.set("My Message");

    let different_service = SingletonManager::instance()
        .get::<MyService>("my_service_factory")
        .unwrap();
    assert_eq!("My Message".to_string(), different_service.get());
}

贡献/问题

贡献目前尚未开放,因为这是在私有服务器上运行的。可以在 nebula.technology 上的 guest 账户中随时提交问题。

依赖项

~225KB