2012-01-27 50 views
1

NServiceBus有没有办法用我自己版本的此接口替代IHandleMessages处理程序,该接口并不与NServiceBus紧密相连?NServiceBus自定义消息处理程序类型

我找到了替换事件/命令标记接口的方法(通过NServiceBus 3 Unobtrusive语法),但没有办法为实际的处理程序做同样的事情。我试图做到这一点,以消除我的处理程序和NServiceBus之间的耦合。

回答

1

这似乎不可能与NServiceBus。

我尽可能不显眼的做法是创建一个NServiceBus代理来将消息转发到我自己的总线,这将NServiceBus引用保留在我的大部分项目中。

1

NServiceBus 3.0 Unobtrusive Mode(请参阅Andreas Ohlund's article on this)的原因是,如果不同端点运行不同版本的NServiceBus,多个服务之间共享的事件定义可能会遇到麻烦,因为您正在使用NServiceBus.dll上的版本依赖关系不匹配。

这个参数本身不支持消息处理程序(实现IHandleMessages的类)。没有分享处理程序。根据定义,消息处理程序与NServiceBus相连。

+0

感谢您的回复。我理解你的论点,我想我想要的原因是我的应用程序内部conecept是我通过消息进行通信。对我而言,NServiceBus只是传输实现。我真的很希望能够在我的应用程序上下文中具有更通用的消息总线概念,以及消息处理程序的外观。我可以通过在顶部建一个垫片来实现这一点,但是如果使用这种工具,我更愿意使用它来做到这一点。说NServiceBus中没有这样做是否公平? – 2012-01-27 23:56:00

0

我发现它可能与需要很少的代码:

1)创建一个通用类实现IHandleMessages<TMessage>并实现handle方法,使其找到或创建自定义处理程序的正确实例(从DI容器,静态注册表等)。在这个例子中假定你有MyCustomHandlervoid HandleMessageMyWay(object message)方法接受任何消息类型:

public class MessageHandlerAdapter<TMessage> 
    : IHandleMessages<TMessage> 
{ 
    public void Handle(TMessage message) 
    { 
     new MyCustomHandler().HandleMessageMyWay(message); 
    } 
} 

这是一个开放通用的,因此NServiceBus不会发现它作为一个有效的处理程序,因为你需要一个封闭的通用( TMessage是MyMessage1这样的具体类型)被NServiceBus看作具体类型的处理程序。

2)实施ISpecifyMessageHandlerOrdering。在它的SpecifyOrder方法使(在运行时)关闭的通用适配器类型为要支持的每个消息类型:

public class MessageHandlerAdapterLister : ISpecifyMessageHandlerOrdering 
{ 
    public void SpecifyOrder(Order order) 
    { 
     //You would normally iterate through your message types (over DI registry or some other registry of messages): 
     var adapterType1 = typeof(MessageHandlerAdapter<>).MakeGenericType(typeof(MyMessage1)); 
     var adapterType2 = typeof(MessageHandlerAdapter<>).MakeGenericType(typeof(MyMessage2)); 

     order.Specify(new[] { adapterType1, adapterType2 }); 
    } 
} 

ISpecifyMessageHandlerOrdering实例由NServiceBus自动发现。这些通常用于指定由NServiceBus发现的处理程序类型的顺序。显然,当你指定没有被发现的类型时(比如我们在运行时创建的通用适配器类型),它将简单地将它们添加到注册表中。

这就是你所需要的。 NServiceBus将通过开放的通用IHandleMessages<TMessage>路由MyMessage1MyMessage2,然后委托处理您的自定义类。

相关问题