Skip to main content

basic/
basic.rs

1use std::sync::Arc;
2
3use rs_bean::bean::{BeanContainer, Scope};
4
5// Define some simple structs
6struct 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    // Create container
59    let container = BeanContainer::new();
60
61    // Register Database (Singleton)
62    container.register::<Database, _>(Scope::Singleton, |_deps| {
63        Ok(Database::new(
64            "postgresql://localhost:5432/mydb".to_string(),
65        ))
66    })?;
67
68    // Register UserService (Singleton)
69    container.register::<UserService, _>(Scope::Singleton, |deps| {
70        let db = deps.get::<Database>()?;
71        Ok(UserService::new(db))
72    })?;
73
74    // Register OrderService (Singleton)
75    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}