使用带有NServiceBus的SimpleInjector来注入IBus Bus属性

时间:2014-10-17 13:07:21

标签: .net c#-4.0 dependency-injection simple-injector nservicebus4

我正在尝试使用自己的依赖注入容器以及 SimpleInjector 来充分利用 NServiceBus 5 ,这是我们的首选容器。

有一种方法可以告诉NServiceBus注入

  

IBus Bus {get; set;}

使用自定义NServiceBusControllerActivatorNServiceBusDependencyResolverAdapter进入所有ASP.NET MVC ApiControllers(或其他地方)的属性。

但是,我们想使用SimpleInjector,并且没有MVC应用程序,我们也不想直接将总线注入控制器。 控制器应该是轻量级的,因此逻辑在" services"内部,然后调用Bus.Send(message)

您将如何使用SimpleInjector完成注入Bus属性? 我知道people have tried使用NServiceBus配置SImpleInjector但他们只是不能一起工作。

1 个答案:

答案 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);
}