Getting Started
Architecture
NServiceBus
Transports
Persistence
ServiceInsight
ServicePulse
ServiceControl
Monitoring
Samples

NServiceBus.Extensions.DependencyInjection

Target Version: NServiceBus 7.x
Starting with NServiceBus version 8, the NServiceBus.Extensions.DependencyInjection package is no longer required. NServiceBus directly supports the Microsoft.Extensions.DependencyInjection model via the externally managed container mode. Visit the dependency injection upgrade guide for further information.

The NServiceBus.Extensions.DependencyInjection package provides integration with the Microsoft.Extensions.DependencyInjection dependency injection abstraction.

It's recommended to use Microsoft Generic Host to manage application and dependency injection container lifecycle. Use the NServiceBus.Extensions.Hosting package to host an NServiceBus endpoint with the generic host.

Usage with ServiceCollection

The following snippet shows how to configure NServiceBus to use Microsoft's built-in dependency injection container:

endpointConfiguration.UseContainer(new DefaultServiceProviderFactory());

Usage with third party containers

NServiceBus can be configured to work with any third party dependency injection container which implements the Microsoft.Extensions.DependencyInjection abstraction. To use a third-party dependency injection container, pass the specific container's IServiceProviderFactory to the UseContainer configuration method.

Autofac

endpointConfiguration.UseContainer(new AutofacServiceProviderFactory(containerBuilder =>
{
    containerBuilder.RegisterInstance(new MyService());
}));

Castle Windsor

var containerSettings = endpointConfiguration.UseContainer(new WindsorServiceProviderFactory());

containerSettings.ConfigureContainer(c => c.Register(Component.For<MyService>().Instance(new MyService())));

StructureMap

var registry = new Registry();
registry.For<MyService>().Use(new MyService());

endpointConfiguration.UseContainer(new StructureMapServiceProviderFactory(registry));

Unity

var container = new UnityContainer();
container.RegisterInstance(new MyService());

endpointConfiguration.UseContainer<IUnityContainer>(new ServiceProviderFactory(container));

Configuring the container

UseContainer provides a settings class which gives advanced configuration options:

IServiceCollection access

The settings provide access to the underlying IServiceCollection that can be used to add additional service registrations.

var containerSettings = endpointConfiguration.UseContainer(new DefaultServiceProviderFactory());
containerSettings.ServiceCollection.AddSingleton<MyService>();

ContainerBuilder

Third-party container-native APIs can be accessed by with ConfigureContainer.

// use Autofac:
var containerSettings = endpointConfiguration.UseContainer(new AutofacServiceProviderFactory());
containerSettings.ConfigureContainer(containerBuilder =>
{
    // access Autofac native APIs here:
    containerBuilder.RegisterType<MyService>().AsSelf().SingleInstance();
    containerBuilder.RegisterAssemblyModules(Assembly.GetCallingAssembly());
});

DependencyLifecycle mapping

DependencyLifecycle maps to ServiceLifetime as follows:

DependencyLifecycleService Lifetime
InstancePerCallServiceLifetime.Transient
InstancePerUnitOfWorkServiceLifetime.Scoped
SingleInstanceServiceLifetime.Singleton

Property injection

The NServiceBus.Extensions.DependencyInjection package does not support property injection out of the box. To enable property injection, refer to the configured container's documentation.

Externally managed mode

The package allows the container to be used in externally managed mode for full control of the dependency injection container via the EndpointWithExternallyManagedServiceProvider extension point:

var serviceCollection = new ServiceCollection();

serviceCollection.AddTransient<MyService>();

var startableEndpoint = EndpointWithExternallyManagedServiceProvider.Create(endpointConfiguration, serviceCollection);

var serviceProvider = serviceCollection.BuildServiceProvider();

var endpoint = await startableEndpoint.Start(serviceProvider);

serviceProvider.GetService<MyService>();
IServiceCollection and IServiceProvider instances must not be shared across mutliple NServiceBus endpoints to avoid conflicting registration that might cause incorrect behavior or runtime errors.

Samples