Search code examples
c#unity-containernservicebus

Nservicebus unity Endpoint failed to start


Using .NET 4.5.2, Visual studio 2017, C# 7.1, Unity, NServiceBus 6.

I receive the following error: Exception error

My application is a console app, here's some of the Program.cs code:

private static async Task ConfigureUnity()
    {
        IUnityContainer container = new UnityContainer();

        var endpointConfiguration = new EndpointConfiguration("NSB.ChannelAdvisorService");
        var transport = endpointConfiguration.UseTransport<LearningTransport>();
        endpointConfiguration.AssemblyScanner().ExcludeAssemblies("netstandard");

        endpointConfiguration.UseContainer<UnityBuilder>(
            customizations =>
            {
                customizations.UseExistingContainer(container);
            });

        var endpointInstance = Endpoint.Start(endpointConfiguration).GetAwaiter().GetResult();
        //register
        container.RegisterType(typeof(IGenericHttpRequestRepository<>), typeof(GenericHttpRequestRepository<>), new TransientLifetimeManager());
        container.RegisterType<IOrderRepository, OrderRepository>();
        container.RegisterType<IShipmentRepository, ShipmentRepository>();
        container.RegisterType<IOrderProcessService, OrderProcessService>();
        container.RegisterType<IShipmentService, ShipmentService>();
        container.RegisterInstance(endpointConfiguration);

        //resolve 
        var orderProcessService = container.Resolve<IOrderProcessService>();
        var shipmentService = container.Resolve<IShipmentService>();
 .....

As you can see I'm using Unity and NServiceBus, this is to register DI and also use it withing NServicebus so i can DI it into my service to send a command.

The service trys to DI "IEndpointInstance"

public class OrderProcessService : IOrderProcessService
{
    private static Logger logger = LogManager.GetCurrentClassLogger();

    private readonly IEndpointInstance _endpoint;

    public OrderProcessService(IEndpointInstance endpoint)
    {
        _endpoint = endpoint;
    }

    public async Task PostNewOrderBatch()
    {
        var list = _orderRepository.GetBatchedOrders();

        foreach(var item in list)// parallel this?
        {
            await _endpoint.Send(item.ToObject<ProcessBatchOrdersCommand>()).ConfigureAwait(false);

    _orderRepository.DeleteFile(item.Property("FilePath").Value.ToString());
        }
    }
}

I get the feeling it could be an issue about the order of things, I don't think I've missed anything out as far as i can tell in some examples?


Solution

  • In NServiceBus v6 and later the endpoint instance is no longer automatically registered in the container. You need to register the endpoint instance returned from Endpoint.Start(configuration) on the existing container.

    See https://docs.particular.net/nservicebus/dependency-injection/#using-an-existing-instance-endpoint-resolution