1use std::sync::Arc;
2
3use rs_bean::bean::{BeanContainer, Scope};
4
5struct Database {
7 connection_string: String,
8}
9
10impl Database {
11 fn new(connection_string: String) -> Self {
12 println!("Creating Database with connection: {}", connection_string);
13 Database { connection_string }
14 }
15
16 fn query(&self, sql: &str) {
17 println!("Executing query on {}: {}", self.connection_string, sql);
18 }
19}
20
21struct UserService {
22 db: Arc<Database>,
23}
24
25impl UserService {
26 fn new(db: Arc<Database>) -> Self {
27 println!("Creating UserService");
28 UserService { db }
29 }
30
31 fn get_user(&self, id: u32) {
32 self.db
33 .query(&format!("SELECT * FROM users WHERE id = {}", id));
34 }
35}
36
37struct OrderService {
38 db: Arc<Database>,
39 user_service: Arc<UserService>,
40}
41
42impl OrderService {
43 fn new(db: Arc<Database>, user_service: Arc<UserService>) -> Self {
44 println!("Creating OrderService");
45 OrderService { db, user_service }
46 }
47
48 fn create_order(&self, user_id: u32, product: &str) {
49 self.user_service.get_user(user_id);
50 self.db.query(&format!(
51 "INSERT INTO orders (user_id, product) VALUES ({}, '{}')",
52 user_id, product
53 ));
54 }
55}
56
57fn main() -> Result<(), String> {
58 let container = BeanContainer::new();
60
61 container.register::<Database, _>(Scope::Singleton, |_deps| {
63 Ok(Database::new(
64 "postgresql://localhost:5432/mydb".to_string(),
65 ))
66 })?;
67
68 container.register::<UserService, _>(Scope::Singleton, |deps| {
70 let db = deps.get::<Database>()?;
71 Ok(UserService::new(db))
72 })?;
73
74 container.register::<OrderService, _>(Scope::Singleton, |deps| {
76 let db = deps.get::<Database>()?;
77 let user_service = deps.get::<UserService>()?;
78 Ok(OrderService::new(db, user_service))
79 })?;
80
81 println!("\n=== Get and use OrderService ===");
82 let order_service = container.get::<OrderService>();
83 order_service.create_order(1, "Laptop");
84
85 println!("\n=== Get OrderService again (should reuse singleton) ===");
86 let order_service2 = container.get::<OrderService>();
87 order_service2.create_order(2, "Phone");
88
89 println!("\n=== Verify same instance ===");
90 println!(
91 "Same instance: {}",
92 Arc::ptr_eq(&order_service, &order_service2)
93 );
94
95 Ok(())
96}