1 unstable release
Uses new Rust 2024
| 0.1.0 | Dec 21, 2025 |
|---|
#54 in #di
Used in dependency-injector
12KB
130 lines
dependency-injector-derive
Derive macros for dependency-injector.
Overview
This crate provides the #[derive(Inject)] macro for automatic compile-time dependency injection. It generates a from_container() method that resolves dependencies from a Container instance.
Installation
This crate is typically used through the derive feature of dependency-injector:
[dependencies]
dependency-injector = { version = "0.2", features = ["derive"] }
Or directly:
[dependencies]
dependency-injector-derive = "0.1"
dependency-injector = "0.2"
Usage
use dependency_injector::{Container, Inject};
use std::sync::Arc;
#[derive(Clone)]
struct Database {
url: String,
}
#[derive(Clone)]
struct Cache {
size: usize,
}
#[derive(Inject)]
struct UserService {
#[inject]
db: Arc<Database>,
#[inject]
cache: Arc<Cache>,
#[inject(optional)]
logger: Option<Arc<Logger>>, // Won't fail if not registered
// Non-injected fields use Default::default()
request_count: u64,
}
fn main() -> dependency_injector::Result<()> {
let container = Container::new();
container.singleton(Database { url: "postgres://localhost".into() });
container.singleton(Cache { size: 1024 });
// Automatically resolve all #[inject] fields
let service = UserService::from_container(&container)?;
Ok(())
}
Attributes
| Attribute | Field Type | Description |
|---|---|---|
#[inject] |
Arc<T> |
Required dependency. Fails if not registered. |
#[inject(optional)] |
Option<Arc<T>> |
Optional dependency. None if not registered. |
| (none) | Any Default type |
Uses Default::default(). |
Generated Code
The macro generates an impl block with a from_container method:
impl UserService {
pub fn from_container(
container: &Container
) -> Result<Self, DiError> {
Ok(Self {
db: container.get::<Database>()?,
cache: container.get::<Cache>()?,
logger: container.try_get::<Logger>(),
request_count: Default::default(),
})
}
}
Requirements
- Struct must have named fields (no tuple structs)
#[inject]fields must beArc<T>#[inject(optional)]fields must beOption<Arc<T>>- Non-injected fields must implement
Default
License
Licensed under either of Apache License, Version 2.0 or MIT license at your option.
Dependencies
~105–465KB
~11K SLoC