共享服务提供商NServiceBus和ASPNET Core

问题描述 投票:0回答:1

我正在创建一种通过NServiceBus发布集成事件的方法,该事件是在处理程序中执行的操作中发布的。我选择的路径是将IIntegrationEventProviderIEventCollectionPublisher桥接以从域层获取已发布的事件。

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获得。

感谢您的帮助

问候

nservicebus
1个回答
0
投票

我认为ASP.NET Core integration sample可能有用。随着即将发布的7.2版本,ASP.NET和NServiceBus之间的DI基础结构共享将变得更加简单。

© www.soinside.com 2019 - 2024. All rights reserved.