NServiceBus有沒有辦法用我自己版本的此接口替代IHandleMessages處理程序,該接口並不與NServiceBus緊密相連?NServiceBus自定義消息處理程序類型
我找到了替換事件/命令標記接口的方法(通過NServiceBus 3 Unobtrusive語法),但沒有辦法爲實際的處理程序做同樣的事情。我試圖做到這一點,以消除我的處理程序和NServiceBus之間的耦合。
NServiceBus有沒有辦法用我自己版本的此接口替代IHandleMessages處理程序,該接口並不與NServiceBus緊密相連?NServiceBus自定義消息處理程序類型
我找到了替換事件/命令標記接口的方法(通過NServiceBus 3 Unobtrusive語法),但沒有辦法爲實際的處理程序做同樣的事情。我試圖做到這一點,以消除我的處理程序和NServiceBus之間的耦合。
這似乎不可能與NServiceBus。
我儘可能不顯眼的做法是創建一個NServiceBus代理來將消息轉發到我自己的總線,這將NServiceBus引用保留在我的大部分項目中。
NServiceBus 3.0 Unobtrusive Mode(請參閱Andreas Ohlund's article on this)的原因是,如果不同端點運行不同版本的NServiceBus,多個服務之間共享的事件定義可能會遇到麻煩,因爲您正在使用NServiceBus.dll上的版本依賴關係不匹配。
這個參數本身不支持消息處理程序(實現IHandleMessages的類)。沒有分享處理程序。根據定義,消息處理程序與NServiceBus相連。
我發現它可能與需要很少的代碼:
1)創建一個通用類實現IHandleMessages<TMessage>
並實現handle方法,使其找到或創建自定義處理程序的正確實例(從DI容器,靜態註冊表等)。在這個例子中假定你有MyCustomHandler
類void 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>
路由MyMessage1
和MyMessage2
,然後委託處理您的自定義類。
感謝您的回覆。我理解你的論點,我想我想要的原因是我的應用程序內部conecept是我通過消息進行通信。對我而言,NServiceBus只是傳輸實現。我真的很希望能夠在我的應用程序上下文中具有更通用的消息總線概念,以及消息處理程序的外觀。我可以通過在頂部建一個墊片來實現這一點,但是如果使用這種工具,我更願意使用它來做到這一點。說NServiceBus中沒有這樣做是否公平? – 2012-01-27 23:56:00