我正在尝试使用自己的依赖注入容器以及 SimpleInjector 来充分利用 NServiceBus 5 ,这是我们的首选容器。
有一种方法可以告诉NServiceBus注入
IBus Bus {get; set;}
使用自定义NServiceBusControllerActivator
和NServiceBusDependencyResolverAdapter
进入所有ASP.NET MVC ApiControllers(或其他地方)的属性。
但是,我们想使用SimpleInjector,并且没有MVC应用程序,我们也不想直接将总线注入控制器。
控制器应该是轻量级的,因此逻辑在" services"内部,然后调用Bus.Send(message)
。
您将如何使用SimpleInjector完成注入Bus
属性?
我知道people have tried使用NServiceBus配置SImpleInjector但他们只是不能一起工作。
答案 0 :(得分:0)
正如您可以阅读here,我和Kijana试图提出一个完整的解决方案,将Simple Injector与NServiceBus集成。然而,Kijana描述的问题(附加到集合)已经解决了很长时间。但是,将容器与NServiceBus集成还存在许多其他问题,因为NServiceBus实现了conforming container反模式。
我不确定这是否有助于您朝着正确的方向前进,但您可以让Simple Injector构建在其他地方创建的实例,这样可以将IBus
注入属性,可以读取{{ 3}}和here。简而言之,您可以将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);
您可以使用以下代码来构建内容:
public static BuildUp(object instance) {
InstanceProducer producer =
container.GetRegistration(instance.GetType(), throwOnFailure: true);
Registration registration = producer.Registration;
registration.InitializeInstance(instance);
}