# More Dependency Injection &emsp; ![CI][ci-badge] [![Crates.io][crates-badge]][crates-url] [![MIT licensed][mit-badge]][mit-url] 

[crates-badge]: https://img.shields.io/crates/v/more-di.svg
[crates-url]: https://crates.io/crates/more-di
[mit-badge]: https://img.shields.io/badge/license-MIT-blueviolet.svg
[mit-url]: https://github.com/commonsensesoftware/more-rs-di/blob/main/LICENSE
[ci-badge]: https://github.com/commonsensesoftware/more-rs-di/actions/workflows/ci.yml/badge.svg

More DI is a dependency injection (DI) library for Rust. A `trait` or `struct` can be used as the injected type.

You may be looking for:

- [User Guide](https://commonsensesoftware.github.io/more-rs-di)
- [API Documentation](https://docs.rs/more-di)
- [Release Notes](https://github.com/commonsensesoftware/more-rs-di/releases)

## Features

This crate provides the following features:

- _default_ - Abstractions for dependency injection, plus the **builder** and **inject** features
- **builder** - Functions for configuring service descriptors
- **async** - Use dependencies in an asynchronous context
- **inject** - Code-generate common injection scenarios
- **lazy** - Lazy-initialize service resolution
- **fmt** - Additional output formatting
- **alias** - Use alternate type aliases

## Supported Lifetimes

A service can have the following lifetimes:

- **Transient** - a new instance is created every time it is requested
- **Singleton** - a single, new instance is created the first time it is requested
- **Scoped** - a new instance is created once per provider that it is requested from

## Dependency Injection in Action

Consider the following traits and structures. After they ar defined, the information can be composed into a simple application.

>Proc macro attributes are not required, but they are the fastest and simplest approach to add DI in your applications.

```rust
use di::*;
use std::rc::Rc;

trait Phrase {
    fn salutation(&self) -> &str;
}

#[injectable(Phrase)]
struct EnglishPhrase;

impl Phrase for EnglishPhrase {
    fn salutation(&self) -> &str {
        "Hello world!"
    }
}

#[injectable]
struct Person {
    phrase: Rc<dyn Phrase>,
}

impl Person {
    fn speak(&self) -> &str {
        self.phrase.salutation()
    }
}

fn main() {
    let provider = ServiceCollection::new()
        .add(EnglishPhrase::singleton())
        .add(Person::transient())
        .build_provider()
        .unwrap();

    let person = provider.get_required::<Person>();

    println!("{}", person.speak());
}
```

## License

This project is licensed under the [MIT license].

[MIT license]: https://github.com/commonsensesoftware/more-rs-di/blob/main/LICENSE
