Skip to content

snowberry-software/DependencyInjection

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

28 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

License NuGet Version

A lightweight easy to use IoC container for .NET.

Usage

The ServiceContainer should be disposed when no longer in use.

var serviceContainer = new ServiceContainer();

// Provided instances won't be disposed by the container.
var providedSingletonInstance = new SomeType();
serviceContainer.RegisterSingleton<ISomeType>(providedSingletonInstance);

// The instance created by the container will be disposed by the container.
serviceContainer.RegisterSingleton<ISomeOtherType, SomeOtherType>();
serviceContainer.RegisterTransient<ITransientType, TransientType>();

// Dispose container
serviceContainer.Dispose();

Registered services can be overwritten

...

serviceContainer.RegisterTransient<ITransientType, TransientType>();

// This makes the ITransientType service a singleton service with another implementation type.
// The container/scope will still dispose the previously created transient service instances.
serviceContainer.RegisterSingleton<ITransientType, NewTransientType>();

...

This behavior can be disabled by using the ServiceContainerOptions and creating the ServiceContainer like this

var serviceContainer = new ServiceContainer(ServiceContainerOptions.ReadOnly);

Scopes

var serviceContainer = new ServiceContainer();

serviceContainer.RegisterScoped<IScopedType, ScopedType>();
serviceContainer.RegisterTransient<ITransientType, TransientType>();
serviceContainer.RegisterTransient<ITestService, TestServiceKeyedA>("_KEY0_");

// The current scope in this case would be the container itself, means it will be disposed by the container.
_ = serviceContainer.GetService<IScopedType>();
_ = serviceContainer.GetService<ITransientType>();
_ = serviceContainer.GetKeyedService<ITestService>("_KEY0_");

using(var scope = serviceContainer.CreateScope())
{
    // The instance was created for current scope, the instance will be disposed by the scope.
    _ = scope.ServiceFactory.GetService<IScopedType>();
    _ = scope.ServiceFactory.GetService<ITransientType>();
}

// Dispose container
serviceContainer.Dispose();

Attributes

PreferredConstructorAttribute

The PreferredConstructorAttribute attribute can be used to explicitly prefer a constructor. The attribute should be used only once.

FromKeyedServicesAttribute

The FromKeyedServicesAttribute attribute can be used to explicitly use a service from a keyed service collection.

  • The attribute can't be used multiple times.
  • The attribute can only be used on properties and parameters and is inherited.

InjectAttribute

The InjectAttribute attribute can be used to explicitly inject a service into a property.

  • The attribute can't be used multiple times.
  • The attribute can only be used on properties and is inherited.

The attribute can also be combined with the FromKeyedServicesAttribute attribute.

[Inject]
[FromKeyedServices("_KEY1_")]
public ITestService? KeyedPropertyInjectTestService { get; set; }

Service lifetime

Name Description
Singleton Specifies that a single instance of the service will be created.
Transient Specifies that a new instance of the service will be created every time it is requested.
Scoped Specifies that a new instance of the service will be created for each scope.