Just another IoC container framework specifically focusing on Async support.
Date | Status | Comment |
---|---|---|
6/9/2020 | Early Alpha | Unit Tests Added. Packages coming soon. |
6/2/2020 | Early Alpha | Source Only. DLL/NUGET to be added soon. |
- Asynchronous/Synchronous Injection
- Constructor
- Field
- Property
- Method
- Asynchronous/Synchronous Resolution
- Subcontainers/Container Extensions/Nested Containers
- Generic/Non Generic binding
- Prewarmed type registry
- Jedi Inject attribute support
- Fully threadsafe
- Easy to use API with chained method support.
- container.Bind<Foo>().WithInstance(bar).AsSingle()
- container.Bind<Foo>().To<Bar>().AsTransient()
- Fully unit tested
The lack of an Asynchronous Depdendency Injection /IOC framework with support for Asynchronous Injection and Resolution support.
This framework was heavily inspired by [Extenject](https://github.com/svermeulen/Extenject)
- Simple
DiContainer container = new DiContainer();
- With Extenstions
DiContainer parentContainer1 = new DiContainer();
DiContainer parentContainer2 = new DiContainer();
DiContainer parentContainer3 = new DiContainer();
// Option 1
DiContainer childContainer = new DiContainer(parentContainer1, parentContainer2, parentContainer3);
// Option 2
DiContainer childContainer = new DiContainer();
childContainer.AddExtensions(new DiContainer[]{ parentContainer1, parentContainer2, parentContainer3 });
- Sub Container
DiContainer parentContainer1 = new DiContainer();
DiContainer childContainer = parentContainer.CreateSubContainer();
- Bind()
container.Bind<Foo>();
container.Bind(typeof(Foo));
- To()
container.Bind<Foo>().To<Bar>();
container.Bind(typeof(Foo)).To(typeof(Bar));
- WithId()
container.Bind<Foo>().WithId("binding_id");
- AndInterfaces()
class Foo : IFoo
{
}
container.Bind<Foo>().WithInterfaces();
container.Resolve<IFoo>();
- WithInstance()
Foo foo = new Foo();
container.Bind<Foo>().WithInstance(foo);
- AsTransient()
class Foo
{
public string Id = Guid.NewGuid().ToString();
}
container.Bind<Foo>().AsTransient();
// Resolve creates a new instance every time
container.Resolve<Foo>().Id;
// 12345
container.Resolve<Foo>().Id;
// 54321
container.Resolve<Foo>().Id;
// 09876
- AsSingle()
class Foo
{
public string Id = Guid.NewGuid().ToString();
}
// Foo instance is created when bound.
container.Bind<Foo>().AsSingle();
// Resolve gives the same instance all the time
container.Resolve<Foo>().Id;
// 12345
container.Resolve<Foo>().Id;
// 12345
container.Resolve<Foo>().Id;
// 12345
- FromMethod()
public Foo GetFooInstance()
{
return new Foo();
}
// Method used to resolve foo instance
container.Bind<Foo>().FromMethod(GetFooInstance);
- FromMethodAsync()
public async Task<Foo> GetFooInstanceAsync()
{
return await _database.GetFoo();
}
// Method used to resolve foo instance
container.Bind<Foo>().FromMethodAsync(GetFooInstanceAsync);
- OnInstantiated()
// Called when Foo is resolved
public void OnFooInstantiated(Foo instance)
{
// Do something with instance
}
// Method used to resolve foo instance
container.Bind<Foo>().OnInstantiated(OnFooInstantiated);
- OnInstantiatedAsync()
// Called when Foo is resolved
public Task OnFooInstantiatedAsync(Foo instance)
{
// Do something asynchronous
}
// Method used to resolve foo instance
container.Bind<Foo>().OnInstantiatedAsync(OnFooInstantiatedAsync);
- Inject()
// Option 1 - object
container.Inject(injectable);
// Option 2 - IEnumeable<Object>
container.Inject(injectables);
- InjectAsync(object)
// Option 1 - object
await container.InjectAsync(injectable);
// Option 2 - IEnumeable<Object>
container.InjectAsync(injectables);
- Resolve()
// Option 1
container.Resolve<Foo>();
// Option 2
container.Resolve(typeof(Foo));
- ResolveAsync()
// Option 1
await container.ResolveAsync<Foo>();
// Option 2
await container.ResolveAsync(typeof(Foo));