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 |
|
#611 in Rust 模式
每月 327 次下载
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