use ctor::ctor;
use ruwebframe::rudi::dicontainer::direg;
use ruwebframe::rudomain::dbexample;
use std::sync::Arc;
#[derive(Debug, Clone)]
struct Database {
id: u64,
}
impl Database {
fn new() -> Self {
println!(">>> Database::new() 被调用了!");
Self { id: rand::random() }
}
}
#[derive(Debug, Clone)]
struct Logger {
id: usize,
}
impl Logger {
fn new() -> Self {
use std::sync::atomic::{AtomicUsize, Ordering};
static COUNTER: AtomicUsize = AtomicUsize::new(0);
let id = COUNTER.fetch_add(1, Ordering::SeqCst);
println!(">>> Logger::new() 第 {} 次", id);
Self { id }
}
}
#[test]
fn test_greg() {
direg::register_singleton("db", Database::new);
direg::register("logger", Logger::new);
let db1 = direg::get_singleton::<Database>("db").unwrap();
let db2 = direg::get_singleton::<Database>("db").unwrap();
println!("Arc::ptr_eq(db1, db2) = {}", Arc::ptr_eq(&db1, &db2));
let log1 = direg::get::<Logger>("logger").unwrap();
let log2 = direg::get::<Logger>("logger").unwrap();
println!("多例: log1={:?}, log2={:?}", log1, log2);
}
const DB_BEAN__NAME_S: &str = "db111sss.Database.bean_XXXX_db";
const DB_BEAN__NAME: &str = "db111.Database.bean_XXXX_db";
pub fn find_bean_database() -> Option<Arc<Database>> {
direg::get_bean::<Database>(DB_BEAN__NAME)
}
pub fn find_bean_database_single() -> Option<Arc<Database>> {
direg::get_bean::<Database>(DB_BEAN__NAME_S)
}
#[ctor(unsafe)]
pub fn register_bean_database() {
direg::register_singleton(DB_BEAN__NAME_S, Database::new);
}
#[test]
fn test1_greg_bean_s() {
if let Some(db) = find_bean_database_single() {
println!("{:?}", *db); println!("{:?}", db);
}
if let Some(db) = find_bean_database_single() {
println!("{:?}", *db); println!("{:?}", db);
}
}
#[test]
fn test2_greg_bean() {
if let Some(db) = find_bean_database() {
println!("{:?}", *db); println!("{:?}", db);
}
if let Some(db) = find_bean_database() {
println!("{:?}", *db); println!("{:?}", db);
}
}
#[test]
fn test3_greg_bean() {
direg::register_singleton("db1", Database::new);
direg::register("logger1", Logger::new);
let db1 = direg::get_bean::<Database>("db1").unwrap();
let db2 = direg::get_bean::<Database>("db1").unwrap();
println!("Arc::ptr_eq(db1, db2) = {}", Arc::ptr_eq(&db1, &db2));
let log1 = direg::get_bean::<Logger>("logger1").unwrap();
let log2 = direg::get_bean::<Logger>("logger1").unwrap();
println!("多例: log1={:?}, log2={:?}", log1, log2);
}
#[test]
fn test4_greg_bean() {
let mut p = dbexample::find_bean_person().unwrap();
if let Ok(mut person) = Arc::try_unwrap(p) {
person.name = "person1".to_string();
println!("{}", person);
}
}