2011-05-25 57 views
0

我有一個要求建立一個NSB用戶,它將訂閱正在發佈的消息,這些消息是已經存在的服務。這個服務是用包含我想要訂閱的NSB IMessage實現的消息程序集構建的。所以要建立我的訂戶,我需要對這個程序集的依賴。NServiceBus PubSub - 如何打破pub'r和sub'r之間的二進制依賴關係?

當我的用戶啓動時,它發送一些消息,從而導致發行記錄我的訂閱數據庫出版商輸入隊列。我的一個訂閱看起來是這樣的:

MyNamespace.MyMessageType, MyNamespace, Version=1.0.0.0, Culture=neutral, PublicKeyToken=MyPublicKeyToken 

不幸的是,發佈者發佈消息從不強命名的程序集。因此,發佈時,訂閱評估過程無法成功評估我的訂閱,因爲發佈的消息的公鑰標記(value = null)與我的訂閱不匹配。

我的問題是:我能不能按類型和唯一版本訂閱消息?更好 - 我不能訂閱基於某種外部契約(如XSD)的消息並完全打破這種依賴關係嗎?

許多在此先感謝。

進展:NSB文檔的東西暗示這樣的位置:

http://www.nservicebus.com/MessagesAsInterfaces.aspx

+0

是否有一個強有力的商業案例,爲什麼消息集必須強名稱? – 2011-05-25 15:28:57

+0

嗯,不是商業案例,但通常情況下,使用強命名代碼進入生產環境會更安全。如果這種依賴是第三方(不是),那麼我會遇到一個真正的問題,因爲我不知道程序集是否來自可信來源。我知道你在說什麼。事實上,我並未被阻止,因爲我已經要求團隊開發消息來簡單地簽署消息程序集。但我的帖子仍然有效。當使用NSB pubsub時,如果你只是使用Bus.Send(),你總是會對發佈者產生嚴重的依賴。 – 2011-05-26 10:35:17

回答

1

對於創建的,你可以使用NSB的tools目錄中的XsdGenerator工具來生成模式,你可以通過定期的郵件一直到其他端點。您將需要使用此工具而不是.NET Framework工具,因爲它不支持接口。從那裏你可以使用模式來處理消息。

對於訂閱消息,如果您不想使用程序集,您可以根據消息類型傳遞NSB到DoNotAutoSubscribe()和手動訂閱(Bus.Subscribe(Type)),但是您希望。這可能脫離架構或其他配置。

+0

謝謝Adam。但是,這不是答案。通過簡單地引用本地程序集的類型定義允許對XML進行乾淨的反序列化(在這種情況下,通過使服務運行「AsA_Server」),我可以愉快地打破服務/消費者點到消息傳遞解決方案中的二進制依賴關係。當服務運行「AsA_Publisher」時創建硬依賴關係,並且訂閱者發送基於引用程序集反射的訂閱消息。 – 2011-05-26 10:27:38

+0

如果你不想使用匯編你可以告訴NSB到DoNotAutoSubscribe()和手動訂閱(Bus.Subscribe(類型))沿着自己的喜好消息的類型傳遞。這可能脫離架構或其他配置。這會起作用嗎? – 2011-05-26 14:15:32

+0

嗨,亞當。如果您可以發送對發佈商有效的訂閱消息,那麼我不明白爲什麼這不起作用。這聽起來像是最好的解決方案,一起打破依賴關係。請把它作爲一個正確的stackoverflow答案,我會upvote它並將其標記爲這樣。謝謝! TC – 2011-05-27 09:41:14