Общий поставщик услуг NServiceBus и ASPNET Core - PullRequest
0 голосов
/ 15 октября 2019

Я создаю способ публикации событий интеграции через NServiceBus, которые публикуются из операции, выполняемой в обработчике. Путь, который я выбрал, это соединить IIntegrationEventProvider с IEventCollectionPublisher, чтобы получить опубликованные события из уровня домена.

public sealed class Bridge : IIntegrationEventProvider /* Infrastructure */,
                             IEventCollectionPublisher /* Domain */
{
   private readonly List<object> _events = new List<object>();

   void IEventCollectionPublisher.Publish(object domainEvent) { _events.Add(domainEvent): }

   IReadOnlyCollection IIntegrationEventProvider.GetEvents() => _events;
}

Поскольку NServiceBus имеет своего собственного поставщика услуг (IBuilder), мне нужно разрешитькласс, выполняющий операцию приложения из IServiceProvider, которая сделана доступной для конвейера в ServiceScopedBehavior. Делая это, я могу получить экземпляр моста, который содержит события, опубликованные на уровне домена, и опубликовать их как события интеграции, используя NServiceBus.

Я опубликовал Gist с (надеюсь) частями кода, необходимыми дляпонять то, что я пытаюсь достичь.

Вопрос в том, могу ли я поручить NServiceBus просто делегировать вызовы поставщику сервисов приложений, а не создавать его и копировать все инструкции в endpoint.UserContainer<ServiceBuilder>()? Ниже приведен пример

internal sealed class Handler : IHandleMessages<Command>
{      
    public async Task Handle(Command message, IMessageHandlerContext context)
    {
        // Resolved from ASPNET DI
        var useCase = context.GetService<CommandUseCase>();
        // _useCase is resolved NSB DI since injected from constructor
        Debug.Assert(ReferenceEquals(useCase, _useCase), "");
        await useCase.Execute().ConfigureAwait(false);
    }
}

Таким образом, я мог бы внедрить исправление класса приложения в области видимости в конструкторе обработчика вместо разрешения его из области, предоставленной IServiceProvider, которая доступна из context.Extensions.Get<IServiceScope>().ServiceProvider.

Спасибо за помощь

С уважением

1 Ответ

1 голос
/ 16 октября 2019

Я думаю, Пример интеграции ASP.NET Core может быть полезен. Начиная с версии 7.2 совместное использование инфраструктуры DI между ASP.NET и NServiceBus стало намного проще. Существует также специализированный NServiceBus.Extensions.Hosting пакет пакета , который добавляет UseNServiceBus API.

...