elif_core/container/
phase5_demo.rs1use crate::container::{IocContainer, ServiceBinder};
9use std::sync::Arc;
10
11#[derive(Default, Clone)]
13pub struct DemoService {
14 pub name: String,
15}
16
17impl DemoService {
18 pub fn new(name: &str) -> Self {
19 Self {
20 name: name.to_string(),
21 }
22 }
23
24 pub fn get_name(&self) -> &str {
25 &self.name
26 }
27}
28
29unsafe impl Send for DemoService {}
30unsafe impl Sync for DemoService {}
31
32pub struct DemoController {
34 pub service: Arc<DemoService>,
35}
36
37impl DemoController {
38 pub fn from_ioc_container(
40 container: &IocContainer,
41 _scope: Option<&crate::container::ScopeId>,
42 ) -> Result<Self, String> {
43 let service = container
44 .resolve::<DemoService>()
45 .map_err(|e| format!("Failed to inject DemoService: {}", e))?;
46
47 Ok(Self { service })
48 }
49
50 pub fn handle_request(&self) -> String {
51 format!(
52 "Controller handled request with service: {}",
53 self.service.get_name()
54 )
55 }
56}
57
58pub struct DemoMiddleware {
60 pub service: Arc<DemoService>,
61}
62
63impl DemoMiddleware {
64 pub fn from_ioc_container(
65 container: &IocContainer,
66 _scope: Option<&crate::container::ScopeId>,
67 ) -> Result<Self, String> {
68 let service = container
69 .resolve::<DemoService>()
70 .map_err(|e| format!("Failed to inject DemoService: {}", e))?;
71
72 Ok(Self { service })
73 }
74
75 pub fn process_request(&self, request: &str) -> String {
76 format!(
77 "Middleware processed '{}' with service: {}",
78 request,
79 self.service.get_name()
80 )
81 }
82}
83
84pub async fn demonstrate_phase5_integration() -> Result<(), Box<dyn std::error::Error>> {
86 println!("=== IOC Phase 5 Integration Demo ===");
87
88 println!("\n1. Setting up IoC Container...");
90 let mut container = IocContainer::new();
91
92 let demo_service = DemoService::new("Phase5Service");
94 container.bind_instance::<DemoService, DemoService>(demo_service);
95
96 container.build()?;
97 println!(" ✓ Container built successfully");
98
99 println!("\n2. Testing Controller with Dependency Injection...");
101 let controller = DemoController::from_ioc_container(&container, None)?;
102 let response = controller.handle_request();
103 println!(" ✓ {}", response);
104
105 println!("\n3. Testing Middleware with Dependency Injection...");
107 let middleware = DemoMiddleware::from_ioc_container(&container, None)?;
108 let processed = middleware.process_request("GET /api/users");
109 println!(" ✓ {}", processed);
110
111 println!("\n4. Testing Scoped Services...");
113 let scope_id = container.create_scope()?;
114
115 let scoped_service1 = container.resolve_scoped::<DemoService>(&scope_id)?;
116 let scoped_service2 = container.resolve_scoped::<DemoService>(&scope_id)?;
117
118 if Arc::ptr_eq(&scoped_service1, &scoped_service2) {
119 println!(" ✓ Scoped services are properly cached within scope");
120 }
121
122 container.dispose_scope(&scope_id).await?;
124 println!(" ✓ Scope disposed successfully");
125
126 println!("\n5. Testing Named Services...");
128 let mut named_container = IocContainer::new();
129
130 let primary_service = DemoService::new("Primary");
131 let _secondary_service = DemoService::new("Secondary");
132
133 named_container.bind_instance::<DemoService, DemoService>(primary_service);
134 named_container.build()?;
138
139 let primary = named_container.resolve::<DemoService>()?;
140 println!(" ✓ Named service resolved: {}", primary.get_name());
141
142 println!("\n6. Container Statistics...");
144 let stats = container.get_statistics();
145 println!(" ✓ Total services: {}", stats.total_services);
146 println!(" ✓ Cached instances: {}", stats.cached_instances);
147
148 println!("\n=== Phase 5 Integration Complete ===");
149 println!("✅ All IoC Phase 5 features demonstrated successfully!");
150
151 Ok(())
152}
153
154#[cfg(test)]
155mod tests {
156 use super::*;
157
158 #[tokio::test]
159 async fn test_phase5_integration_demo() {
160 demonstrate_phase5_integration()
161 .await
162 .expect("Phase 5 integration demo should succeed");
163 }
164
165 #[test]
166 fn test_controller_factory() {
167 let mut container = IocContainer::new();
168
169 let service = DemoService::new("TestService");
170 container.bind_instance::<DemoService, DemoService>(service);
171 container.build().expect("Container build should succeed");
172
173 let controller = DemoController::from_ioc_container(&container, None)
174 .expect("Controller creation should succeed");
175
176 assert_eq!(controller.service.get_name(), "TestService");
177 }
178
179 #[test]
180 fn test_middleware_factory() {
181 let mut container = IocContainer::new();
182
183 let service = DemoService::new("MiddlewareService");
184 container.bind_instance::<DemoService, DemoService>(service);
185 container.build().expect("Container build should succeed");
186
187 let middleware = DemoMiddleware::from_ioc_container(&container, None)
188 .expect("Middleware creation should succeed");
189
190 assert_eq!(middleware.service.get_name(), "MiddlewareService");
191 }
192}