【问题标题】:How to access NServiceBus dependency injection container?如何访问 NServiceBus 依赖注入容器?
【发布时间】:2020-10-30 18:06:01
【问题描述】:

我正在使用 NServiceBus 5 的默认依赖注入功能。我想在端点配置中注册一个依赖于 IBus 的单例。

例如:

configuration.RegisterComponents(r =>
{
  r.RegisterSingleton(new MyDependency(resolveIBus()));
  ...
}

如何使用 NServiceBus 开箱即用的依赖注入解决上述伪代码中的 IBus 实例?

【问题讨论】:

  • configureComponents.ConfigureComponent<MyDependency>(DependencyLifecycle.SingleInstance)IBus 将被注入到你MyDependency
  • @tchelidze 说了什么。 IBus 实现已经在容器上注册,可以注入

标签: nservicebus nservicebus5


【解决方案1】:

正确的语法是:

configuration.RegisterComponents(r =>
{
  r.ConfigureComponent<MyDependency>(DependencyLifecycle.SingleInstance);
  ...
}

依赖机制将调查 MyDependency 类型的构造函数并选择它可以完全解决的最简单的一个。因此,您需要像这样创建 MyDependency 类型:

public class MyDependency
{
  public MyDependency(IBus bus)
  {
  }
}

更多信息在NServiceBus Documentation

如果你只知道运行时需要什么类型的服务,你可以像这样使用IServiceProvider服务:

public class MyDependency
{ 
  public MyDependency(IServiceProvider serviceProvider)
  { 
    ...
    var myService = (IMyService)serviceProvider.GetService(typeof(IMyService));
    ...
  }
} 

【讨论】:

  • 这确实帮助我实现了我想做的事情,但我很好奇是否有任何方法可以检索配置的组件。我使用的其他 IOC 工具通常具有某种 container.Resolve 方法,可以获取配置的对象
  • 我对 NServiceBus 中内置的依赖机制不是很熟悉,但是我提供的文档链接也解释了如何配置 NServiceBus 以使用您知道的 IOC。
  • 实现您想要的另一种方法是使用IServiceProvider 服务,如下所示: public class MyDependency { public MyDependency(IServiceProvider serviceProvider) { var myService = (IMyService)serviceProvider.GetService(typeof(IMyService )); } }
  • 我认为这完全可以回答。介意将其添加到您的答案中吗?
  • 我用 IServiceProvider 示例扩展了我的答案...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
  • 2014-09-15
  • 1970-01-01
  • 2016-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多