Starting with NServiceBus version 8, the NServiceBus.
package is no longer required. NServiceBus directly supports the Microsoft.
model via the externally managed container mode. Visit the dependency injection upgrade guide for further information.
The NServiceBus.
package provides integration with the Microsoft.
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.
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:
DependencyLifecycle | Service Lifetime |
---|---|
InstancePerCall | ServiceLifetime.Transient |
InstancePerUnitOfWork | ServiceLifetime.Scoped |
SingleInstance | ServiceLifetime.Singleton |
Property injection
The NServiceBus.
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.