.net 将SimpleInjector与NServiceBus一起使用以注入IBus总线属性
我正试图通过使用自己的依赖注入容器和我们选择的容器来获得对NServiceBus 5的认可 有一种方法可以告诉NServiceBus注入 IBus总线{get;set;} 使用自定义的.net 将SimpleInjector与NServiceBus一起使用以注入IBus总线属性,.net,c#-4.0,dependency-injection,simple-injector,nservicebus4,.net,C# 4.0,Dependency Injection,Simple Injector,Nservicebus4,我正试图通过使用自己的依赖注入容器和我们选择的容器来获得对NServiceBus 5的认可 有一种方法可以告诉NServiceBus注入 IBus总线{get;set;} 使用自定义的NServiceBusControllerActivator和nServiceBusDependencyResolveDatapter将属性导入所有ASP.NET MVC APIController(或其他地方) 但是,我们希望使用SimpleInjector,没有MVC应用程序,也不希望将总线直接注入控制器。 控
NServiceBusControllerActivator
和nServiceBusDependencyResolveDatapter
将属性导入所有ASP.NET MVC APIController(或其他地方)
但是,我们希望使用SimpleInjector,没有MVC应用程序,也不希望将总线直接注入控制器。
控制器应该是轻量级的,因此逻辑在“服务”内部,服务依次调用Bus.Send(message)
如何使用SimpleInjector注入总线
属性?
我知道用NServiceBus配置SImpleInjector,但它们不能协同工作。正如您所看到的,我和Kijana试图提出一个完整的解决方案,将SImpleInjector与NServiceBus集成。然而,Kijana描述的问题(在集合中添加)已经解决了很长一段时间。然而,将容器与NServiceBus集成还存在许多其他问题,因为NServiceBus实现了反模式
我不确定这是否有助于您进入正确的方向,但您可以让在其他地方创建的简单注入器构建实例,这样就可以将IBus
注入到属性中,这是可以读取和读取的。简而言之,您可以将Simple Injector配置为执行如下属性注入:
class PropertySelectionBehavior<TAttribute> : IPropertySelectionBehavior
where TAttribute : Attribute {
public bool SelectProperty(Type type, PropertyInfo prop) {
return prop.GetCustomAttributes(typeof(TAttribute)).Any();
}
}
// Usage:
var container = new Container();
container.Options.PropertySelectionBehavior =
new PropertySelectionBehavior<ImportAttribute>();
container.RegisterSingle<IBus>(bus);
所以你有一些IBU,你想把它注入到你的一些类中。为什么这与您已经在做的事情不同?为什么无法注册该IBU?如果我没记错的话,总线是单例的。@John,我不确定我是否遵循了这个问题,但是您可以让NServiceBus知道您使用的是什么容器,并设置一个自定义容器。这里有文档@Sean yes支持其他容器,但SimpleInjector不是其中之一(请参阅问题中的链接)。为什么要将其作为属性而不是使用标准构造函数注入?@Steven问得好。NServiceBus通过一个IneInInitialization接口来实现。实现该接口的类将使用支持的容器之一注入其总线属性。我以前从未使用过IoC,请原谅我的无知。我们的容器是不受支持的SimpleInjector(快速、简单)。我看到这里也做了一些工作。有人知道使用NServiceBus Simple Injector的DI现在可以工作吗?@johnkatenhorn,在构建代码时,我对NSB ansolutely需要什么有很多疑问,但这些答案仍然没有答案。因此,该代码在某些情况下可能有效,而在其他情况下可能失败。问题是,NSB是在考虑特定容器的情况下构建的。因此,如果可以的话,让NSB使用它的默认容器,并在解析自己的类型时插入您最喜欢的容器。然而,我不知道最好的方法是什么。
public static BuildUp(object instance) {
InstanceProducer producer =
container.GetRegistration(instance.GetType(), throwOnFailure: true);
Registration registration = producer.Registration;
registration.InitializeInstance(instance);
}