Я создаю способ публикации событий интеграции через 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
.
Спасибо за помощь
С уважением