Getting Started
Architecture
NServiceBus
Transports
Persistence
ServiceInsight
ServicePulse
ServiceControl
Monitoring
Samples

Installers

Component: NServiceBus
NuGet Package: NServiceBus (8.1)

Installers ensure that endpoint-specific artifacts (e.g. database tables, queues, directories, etc.) are created and configured.

When to run installers

Installers require permissions to administer resources such as database tables, queues, or directories. Following the principle of least privilege, it is recommended to run an endpoint with these elevated permissions only during initial deployment.

The alternative to using installers is to create the required resources before the endpoint is run. The method of doing this varies for each transport or persistence package. For more information, see operations.

Running installers

When requiring special privileges to setup the endpoint, the installer API can be used to run all necessary installation steps:

public static async Task Main()
{
    var endpointConfiguration = new EndpointConfiguration("my-endpoint");
    // configure endpoint

    await Installer.Setup(endpointConfiguration);
}

When the setup requires access to services that are provided via an externally managed dependency injection container, provide the configured IServiceProvider to the installer API:

public static async Task Main()
{
    var endpointConfiguration = new EndpointConfiguration("my-endpoint");
    // configure endpoint

    var serviceCollection = new ServiceCollection();
    // custom registrations

    var installer = Installer.CreateInstallerWithExternallyManagedContainer(endpointConfiguration, serviceCollection);

    var serviceProvider = serviceCollection.BuildServiceProvider();

    await installer.Setup(serviceProvider);
}
The installer APIs always run installers, regardless of whether the endpoint has configured EnableInstallers.

The installer APIs are intended to be used when resources required by the endpoint must be set up with different privileges than the endpoint itself requires. EndpointConfiguration can't be reused in the same process to call Endpoint.Start. To setup the endpoint as part of the endpoint host process, see the Running installers during endpoint startup article.

Running installers during endpoint startup

By default, installers are disabled.

Installers can be enabled to always run at startup:

endpointConfiguration.EnableInstallers();

// this will run the installers
await Endpoint.Start(endpointConfiguration);

Installers may need to be run depending on the arguments that are provided to the host or aspects the environment the endpoint is hosted in.

For example, installers can be enabled based on command line arguments:

var runInstallers = Environment.GetCommandLineArgs().Any(x => string.Equals(x, "/runInstallers", StringComparison.OrdinalIgnoreCase));

if (runInstallers)
{
    endpointConfiguration.EnableInstallers();
    // This will run the installers but not start the instance.
    await Endpoint.Create(endpointConfiguration);
    Environment.Exit(0);
}

They can also be enabled by a machine name convention:

if (!Environment.MachineName.EndsWith("-PROD"))
{
    endpointConfiguration.EnableInstallers();
}
Some combinations of transports / persisters / DI containers may require .Start to be called instead of .Create. In this case call both .Start and .Stop and allow the endpoint to shutdown immediately after startup.

Custom installers

Implement the INeedToInstallSomething interface to create a custom installer:

public class MyInstaller :
    INeedToInstallSomething
{
    public Task Install(string identity, CancellationToken cancellationToken)
    {
        // Code to install something

        return Task.CompletedTask;
    }
}

Assemblies in the runtime directory are scanned for installers so no code is needed to register them.

Related Articles