2014-10-09 26 views
0

我有一个CQRS架构,使用温莎和温莎安装程序全部插入。现在当我们插入NServiceBus时会出现问题。NServiceBus和温莎安装程序

现在我们有一个命令处理程序具有以下签名

public class MyCommandHandler : Handles<MyCommand> 
{ 
    public MyCommandHandler(IDomainEvents events) 
    { 
     /// bla bla 
     events.Raise<MyEvent>(); 
    } 
} 

我想通过注入下iBus改变这一点,有以下的代码实现

public class MyCommandHandler : Handles<MyCommand> 
{ 
    public MyCommandHandler(IBus bus) 
    { 
     /// bla bla 
     bus.Send("MyQueue", myMessage); 
    } 
} 

所以为了做到这一点,我需要创建一个NServiceBus客户端Windsor安装程序并从Windsor引导客户端总线。我虽然做这样的事情

public class BusClientInstaller : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     IBus bus = ConfigureBus(); 
     container.Register(Component.For<IBus>().Instance(bus)); 
    } 
} 

而且配置我的公交车在下面

var busConfiguration = new BusConfiguration(); 
    /// configuration 
    var bus = Bus.Create(busConfiguration); 
    return bus; 

这是正确的做法的方法?我应该使用为每个处理程序创建总线的新实例的Factory还是可以有SingleTon总线实例?处理程序在Web API控制器中执行。

回答

1

看起来像你使用NServiceBus版本5?配置代码从版本4.x开始发生了变化,所以我不太了解它,但基本原理是相同的:将容器的实例传递给配置总线的代码,并让NServiceBus处理自己的注册。

docs

// Castle with a container instance 
configuration.UseContainer<WindsorBuilder>(c => c.ExistingContainer(windsorContainer)); 

这将注册总线并在容器中的所有NServiceBus处理程序(无需手动注册任何的这一点)。

+0

注册后还需要启动总线吗? – Raffaeu 2014-10-09 14:15:00

+1

是的,上面显示的步骤是创建配置的一部分,该配置传递给Bus.Create。再次,我假设你正在使用5.x. – 2014-10-09 15:07:33

+1

是的,它的工作原理和是我正在版本5 实际上NServiceBus上的所有文档都反对4 API语法,这是非常不同的,并且他们声明所有Fluent API已经过时,所以我们甚至不能使用旧语法编译5。 顺便说一句,它的工作原理,谢谢! – Raffaeu 2014-10-09 15:14:13