对于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实现,所以希望能够为特定的处理程序指定特定的实现。
答案 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")));
说了这么多,为什么注入实际的类而不是接口来实现同样的东西呢?