2010-01-23 28 views
2

經過IObservables試驗後,我決定測試它們是否通過消息總線處理傳入消息。基本上,我得到一個IObservable<Request>Request包含回覆答覆的必要功能。拆分IObservable,然後在處理後合併?

在處理過程中,我必須將數據反序列化並將其從Request轉換爲Command對象,該對象包含實際需要執行的操作。命令與請求無關。

反序列化後,我將其轉換爲正確的響應,但是爲了發送響應,我需要原始的Request對象。我想在保持高代碼可讀性的同時嘗試實現這一點。到目前爲止,我已經使用擴展方法和lambda表達式得到以下(其中requestsIObservable<Request>):

requestProcessor = requests 
      .Deserialize<IdentityRequest>() 
      .Where(idRequest => idRequest.Address != null) 
      .Select(idRequest => new IdentityResponse() {Identity = identityTable[idRequest.Address.Address]}) 
      .Serialize() 
      .Zip(requests, (response, request) => new {request = request, response = response}) 
      .Subscribe(data => data.request.Respond(data.response, ObjectTypes.IdentityResponse)); 

我的問題是,由於Zip功能拍攝時間之前所有的命令過程中,會在Zip如果存在恆定的消息流,則對相同的輸入對象(即原始輸入,以及單獨處理的輸入)進行操作。我如何測試這個?

有沒有更好的方法來做到這一點?

+1

取決於你正在使用的框架的版本,元組可以幫助4.0在這裏。 – 2010-03-01 17:15:41

回答

2

我已經解決了令人滿意的問題,但可能有更好的方法。我創建了一種類似monadic的類型,它組成兩種類型:一種是正在轉換的數據的值;以及作爲周圍數據的上下文。

它是像下面這樣:

public class ComposedType<TValue, TContext> 
{ 
     public TValue Value { get; protected set; } 
     public TContext Context { get; protected set; } 

     public ComposedType(TValue value, TContext context) 
     { 
      Value = value; 
      Context = context; 
     } 
    } 

我也定義的隱運營商都語境和價值。還有一些關聯的擴展方法可以讓您將值從一種類型轉換爲新類型。

如果任何人有一個更好的方法,雖然我歡迎替代品,並且我會暫時擱置這個問題。

+0

現在,使用['Tuple '](http://msdn.microsoft.com/zh-cn/library/dd268536.aspx)會更容易(儘管不一定更清晰*)。 – casperOne 2012-11-21 18:06:06