我正在创建一种通过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
获得。
感谢您的帮助
问候
我认为ASP.NET Core integration sample可能有用。随着即将发布的7.2版本,ASP.NET和NServiceBus之间的DI基础结构共享将变得更加简单。