Getting Started
Architecture
NServiceBus
Transports
Persistence
ServiceInsight
ServicePulse
ServiceControl
Monitoring
Samples

Externally Managed Mode

Component: NServiceBus
NuGet Package: NServiceBus (8.x)

Configuring the endpoint

The sample configures an endpoint to use externally managed mode with Microsoft's dependency injection container and registers some dependencies.

// ServiceCollection is provided by Microsoft.Extensions.DependencyInjection
var serviceCollection = new ServiceCollection();

// most dependencies may now be registered
serviceCollection.AddSingleton<Greeter>();
serviceCollection.AddSingleton<MessageSender>();

// EndpointWithExternallyManagedContainer.Create accepts an IServiceCollection,
// which is inherited by ServiceCollection
var endpointWithExternallyManagedContainer = EndpointWithExternallyManagedContainer
    .Create(endpointConfiguration, serviceCollection);

// if IMessageSession is required as dependency, it may now be registered
serviceCollection.AddSingleton(p => endpointWithExternallyManagedContainer.MessageSession.Value);

Injecting dependencies into handlers

Registered dependencies may be injected into message handlers using constructor injection:

public class MyHandler :
    IHandleMessages<MyMessage>
{
    private readonly Greeter greeter;

    public MyHandler(Greeter greeter) =>
        this.greeter = greeter;

    public Task Handle(MyMessage message, IMessageHandlerContext context)
    {
        greeter.SayHello();
        return Task.CompletedTask;
    }
}

Injecting the message session into other types

When IMessageSession has been registered as shown above, it may be injected into other types using constructor injection:

public class MessageSender
{
    private readonly IMessageSession messageSession;

    public MessageSender(IMessageSession messageSession) =>
        this.messageSession = messageSession;

    public Task SendMessage()
    {
        var myMessage = new MyMessage();
        return messageSession.SendLocal(myMessage);
    }
}
An IMessageSession may only be injected by the container after the endpoint has been started.

Related Articles