use dependency_injector::{Container, ScopePool};
#[derive(Clone)]
struct AppConfig {
name: String,
}
#[derive(Clone)]
struct Database {
url: String,
}
#[derive(Clone)]
struct RequestId(u64);
fn main() {
println!("=== Dependency Injector Performance Demo ===\n");
let root = Container::new();
root.singleton(AppConfig {
name: "MyApp".into(),
});
root.singleton(Database {
url: "postgres://localhost:5432/app".into(),
});
println!("ScopePool with 4 pre-allocated scopes...");
let pool = ScopePool::new(&root, 4);
println!(" available scopes: {}", pool.available_count());
{
let scope = pool.acquire();
println!(" after acquire: {} available", pool.available_count());
scope.singleton(RequestId(1));
let id = scope.get::<RequestId>().expect("registered in this scope");
assert!(scope.contains::<AppConfig>());
println!(" request {} sees parent AppConfig: true", id.0);
}
println!(" after drop: {} available", pool.available_count());
{
let scope = pool.acquire();
assert!(!scope.contains::<RequestId>());
println!(
" reused scope still holds RequestId: {}",
scope.contains::<RequestId>()
);
}
println!();
println!("Warming the thread-local hot cache...");
root.warm_cache::<Database>();
root.warm_cache::<AppConfig>();
let db = root.get::<Database>().expect("served from the hot cache");
println!(" resolved {} via warmed cache", db.url);
root.clear_cache();
println!(" hot cache cleared\n");
println!("Locking the container after startup...");
root.lock();
println!(" root locked: {}", root.is_locked());
let config = root.get::<AppConfig>().expect("resolution still works");
println!(" {} still resolvable after lock\n", config.name);
#[cfg(feature = "perfect-hash")]
{
use std::any::TypeId;
use std::sync::Arc;
println!("Freezing the container (perfect-hash)...");
let frozen = root.freeze();
println!(" frozen {} services", frozen.len());
let entry = frozen
.resolve(&TypeId::of::<Database>())
.expect("Database is in the frozen storage");
let frozen_db: Arc<Database> = entry.downcast().expect("stored as Database");
println!(" frozen lookup -> {}", frozen_db.url);
assert!(frozen.contains(&TypeId::of::<AppConfig>()));
assert!(!frozen.contains(&TypeId::of::<RequestId>()));
println!(" contains(AppConfig) = true, contains(RequestId) = false\n");
}
#[cfg(not(feature = "perfect-hash"))]
println!(
"FrozenStorage section skipped - run with:\n \
cargo run --example performance --features perfect-hash\n"
);
println!("=== Demo Complete ===");
println!("\nPerformance toolbox:");
println!(" - ScopePool: recycle request scopes (~20ns acquire vs ~134ns fresh)");
println!(" - warm_cache/clear_cache: control the thread-local hot cache");
println!(" - lock(): forbid registrations after startup");
println!(" - freeze(): perfect-hash storage for collision-free O(1) lookups");
}