| Crates.io | dependency-injector-derive |
| lib.rs | dependency-injector-derive |
| version | 0.1.0 |
| created_at | 2025-12-21 15:03:27.288344+00 |
| updated_at | 2025-12-21 15:03:27.288344+00 |
| description | Derive macros for dependency-injector |
| homepage | |
| repository | https://github.com/pegasusheavy/dependency-injector |
| max_upload_size | |
| id | 1998092 |
| size | 14,043 |
Derive macros for dependency-injector.
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.
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"
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(())
}
| 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(). |
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(),
})
}
}
#[inject] fields must be Arc<T>#[inject(optional)] fields must be Option<Arc<T>>DefaultLicensed under either of Apache License, Version 2.0 or MIT license at your option.