Ninject

Source
NuGet Package NServiceBus.Ninject (6.x)
Target NServiceBus Version: 6.x

NServiceBus can be configured to use Ninject for dependency injection.

Default usage

endpointConfiguration.UseContainer<NinjectBuilder>();

Using an existing kernel

var kernel = new StandardKernel();
kernel.Bind<MyService>()
    .ToConstant(new MyService());
endpointConfiguration.UseContainer<NinjectBuilder>(
    customizations: customizations =>
    {
        customizations.ExistingKernel(kernel);
    });

Unit of work

Its is possible to bind to use an Unit of Work scope, which corresponds to the DependencyLifecycle.InstancePerUnitOfWork lifecycle, when registering components with configuration.RegisterComponents(...).

In essence, bindings using Unit of Work scope

  • will be instantiated only once per transport Message
  • will be disposed when message processing finishes

Bind the services in Unit of Work scope using:

var kernel = new StandardKernel();

kernel.Bind<MyService>()
    .ToSelf()
    .InUnitOfWorkScope();

Services using InUnitOfWorkScope() can only be injected into code which is processing messages. To inject the service somewhere else (e.g. because of an user interaction) define conditional bindings:

var kernel = new StandardKernel();

// always create a new instance when not processing a message
kernel.Bind<MyService>().ToSelf()
    .WhenNotInUnitOfWork()
    .InTransientScope();

// always use the same instance when processing messages
kernel.Bind<MyService>().ToSelf()
    .WhenInUnitOfWork()
    .InSingletonScope();

Multi hosting

Multiple endpoints in a single process cannot share a single Ninject kernel. Each requires its own container instance or each requires its own child container. Ninject supports this with the Ninject.Extensions.ChildKernel extension. Execute new ChildKernel(parentKernel) and pass this new kernel instance to NServiceBus.

DependencyLifecycle Mapping

DependencyLifecycle maps to Ninject object scopes as follows:

DependencyLifecycleNinject object scope
InstancePerCallTransient
InstancePerUnitOfWorkSingleton within a Named Scope per Unit of Work
SingleInstanceSingleton

Samples

Related Articles

  • Child containers
    Child containers allow for more granular instance lifetime configuration.

Last modified