NServiceBus处理程序使用Castle Windsor设置命名依赖项

时间:2015-08-31 15:04:04

标签: dependency-injection castle-windsor nservicebus

对于NServiceBus处理程序,我想指定一个命名依赖项。我使用城堡windsor作为我的IOC容器。默认情况下NServiceBus使用容器注册所有处理程序,因此当我尝试设置注册时,它会在启动时抛出错误.....

“无法注册组件EventMessageHandler。已经有一个具有该名称的组件。您是否要修改现有组件?如果没有,请确保指定唯一名称。”

是否有办法覆盖它以指定命名依赖项。所以有这样的注册...

container.Register(
Component.For<IService>()
    .ImplementedBy<Service>()
    .Named("default")
    .DependsOn(Dependency.OnValue<Config>(config1)));

container.Register(
Component.For<IHandleMessages<EventMessage>>().ImplementedBy<EventMessageHandler>()
    .DependsOn(Dependency.OnComponent(typeof(IService), "default")));

对于看起来像这样的处理程序....

public class EventMessageHandler : IHandleMessages<EventMessage>
{
    private IService service;

public EventMessageHandler(IService service)
{
    this.service = service;
}

public void Handle(EventMessage message)
{
    service.DoStuff();
}
}

这是因为我有多个IService实现,所以希望能够为特定的处理程序指定特定的实现。

1 个答案:

答案 0 :(得分:2)

可以通过创建容器,预先注册所有内容然后将其交给BusConfiguration(假设您使用的是NSB v5.0或更高版本)来实现。

以下是代码:

BusConfiguration busConfiguration = new BusConfiguration();
WindsorContainer container = new WindsorContainer();

container.Register(Component.For<IMyService>().ImplementedBy<MyServiceImpl1>().Named("s1"));
container.Register(Component.For<IMyService>().ImplementedBy<MyServiceImpl2>().Named("s2"));
container.Register(Component.For<MyMessageHandler>().DependsOn(Dependency.OnComponent(typeof(IMyService), "s1")));

busConfiguration.UseContainer<WindsorBuilder>(c => c.ExistingContainer(container));

现在在您的处理程序上,如果您对服务有依赖性,那么它将是您指定的那个:

public class MyMessageHandler : IHandleMessages<MyMessage>
{
    public MyMessageHandler(IMyService service)
    {
       //service is of the type you specified in your config
    }

    public void Handle(MyMessage message)
    {
        Console.WriteLine("Message arrived");
    }
}

有一点需要注意,您必须完全按照上面的说明进行注册。如果你试图这样做会爆发:

//Wouldn't work
container.Register(Component.For<IHandleMessages<MyMessage>>().ImplementedBy<MyMessageHandler>().DependsOn(Dependency.OnComponent(typeof(IMyService), "s2")));

说了这么多,为什么注入实际的类而不是接口来实现同样的东西呢?