2015-10-16 35 views
1

我還沒有找到解決方案,如何使用其他接口然後發佈。Rebus服務總線。如何映射不同類型/接口

在簡單情況下,如果我想發佈IMessage並使用IMessage,我必須在兩個應用程序之間共享IMessage定義的程序集。

但是,如果這兩個應用程序正在開發不同的公司。

在這種情況下,我有兩個選擇:

  1. 做出共同的接口協議,命名規範等,並共享一個公共圖書館

  2. 讓兩家公司都在那裏做的工作,因爲它們是用來在服務總線(或應用程序服務器)中映射數據類型。

第二個選項對我來說比較合適,但我還沒有找到解決方案。

例如,我可能有一個系統的員工作爲

public interface IEmployee 
{ 
    int ID { get; set; } 
    string FirstName { get; set; } 
    string LastName { get; set; } 
} 

而在其他系統

public interface ILightEmployee 
{ 
    int id { get; set; } 
    string full_name { get; set; } 
} 

我要發佈IEmployee和消費ILightEmployee。

期間在服務總線序列化/反序列化相欲 使用特性和歸檔像這樣(它更像一個僞代碼)的一些映射:

public class ContractMapper 
{ 
    public LightEmployee Map(IEmployee employee) 
    { 
     return new LightEmployee() 
     { 
      id = employee.ID, 
      full_name = employee.LastName + " " + employee.FirstName 
     }; 
    } 
} 

例如MuleESB提供了一個編輯器,用於這個轉換/映射。 LINK

對我來說這是不必要的高級解決方案,但至少在代碼中我想做同樣的事情。

是否可以使用Rebus服務總線?

回答

0

只要Rebus能夠正確地將傳入的JSON對象反序列化爲具體的類,它就會嘗試將消息分派給所有與多態相兼容的處理程序。

在缺省Newtonsoft JSON.NET和Jil-based JSON serializer,所述rbs2-content-type頭將被設置爲application/json;charset=utf-8,並且只要接收郵件的報頭與application/json開始並且具有兼容的編碼,兩者串行器將嘗試反序列化到該類型由rbs2-msg-type標題指定。

所以,如果你在應用程序域匹配的具體可用的類,你可以有一個實現IHandleMessages<IEmployee>IHandleMessages<ILightEmployee>處理程序 - 爲此事或IHandleMessages<object>,因爲該處理程序與所有傳入的消息多態兼容。

Jil序列化程序雖然特殊,但它會反序列化爲dynamic,如果無法找到它應該反序列化的.NET類型。

這意味着該處理程序:

public class HandlesEverything : IHandleMessages<object> 
{ 
    public async Task Handle(dynamic message) 
    { 
     // .... woohoo! 
    } 
} 

加之吉爾串行器將能夠處理所有的消息,動態,挑選取件很感興趣

我希望答案給出。對Rebus的一些可能性的印象。請告訴我更多,如果有一個你覺得不太好的情況。

+0

謝謝你的回答。我是Rebus新手,所以到現在爲止我並不清楚,但好消息是,Rebus可以處理這個問題。我必須花更多的時間來玩弄它,才能找到確切的解決方案。 – dannikoti