2010-01-23 2 views
2

IObservables를 실험 한 후에는 메시지 버스를 통해 들어오는 메시지를 처리하도록 IObservables를 테스트하기로 결정했습니다. 본질적으로 나는 IObservable<Request>을 얻고 Request은 응답에 응답하는 데 필요한 기능을 포함합니다.IObservable을 분할 한 후 처리 후 결합 하시겠습니까?

처리 중 한 지점에서 데이터를 deserialize하고 Request에서 실제로 수행해야하는 내용이 포함 된 Command 개체로 변환해야합니다. 명령이 요청과 관련이 없습니다.

deserialize 한 후에 응답을 보내려면 원래의 Request 개체가 필요합니다. 나는 높은 코드 가독성을 유지하면서 이것을 시도하고 달성하기를 원한다. 지금까지 나는 얻을 확장 방법과 람다 표현식을 사용했습니다 다음 (requests은 어디 IObservable<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에서 도움이 될 수 있습니다. –

답변

2

나는 그것을 만족스럽게 해결했지만 더 좋은 방법이있을 수 있습니다. 나는 두 가지 유형을 구성하는 모나드 형 유형을 만들었습니다. 변형되는 데이터 인 값. 및 주변 데이터 인 컨텍스트를 포함한다. 나는 또한 문맥과 가치 모두에 대해 암시 적 연산자를 정의

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/en-us/library/dd268536.aspx)을 사용하는 것이 더 쉬울 것입니다. – casperOne

관련 문제