NServiceBus.Extensions.DependencyInjection

Source
NuGet Package NServiceBus.Extensions.DependencyInjection (1.x)
Target NServiceBus Version: 7.x

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

It's recommended to use Microsoft's 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.
IServiceCollection and IServiceProvider instances must not be shared across mutliple NServiceBus endpoints to avoid conflicting registration that might cause incorrect behavior or runtime errors.

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. The following snippet shows this approach, using Autofac (Autofac.Extensions.DependencyInjection) as an example:

endpointConfiguration.UseContainer(new AutofacServiceProviderFactory());

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>();

Samples


Last modified