首页 > 解决方案 > 共享服务提供者 NServiceBus 和 ASPNET Core

问题描述

我正在创建一种通过 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 将它们作为集成事件发布。

我发布了一个要点,其中包含(希望)掌握我想要实现的目标所需的代码片段。

问题是:我可以指示 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);
    }
}

这样,我可以在处理程序构造函数中注入正确的作用域应用程序类,而不是IServiceProvidercontext.Extensions.Get<IServiceScope>().ServiceProvider.

感谢帮助

问候

标签: nservicebus

解决方案


我认为ASP.NET Core 集成示例可能很有用。从 7.2 版开始,在 ASP.NET 和 NServiceBus 之间共享 DI 基础结构要简单得多。还有一个专门的NServiceBus.Extensions.Hosting 适配器包添加了UseNServiceBusAPI。


推荐阅读