拆分IObservable然后在处理后合并?

时间:2010-01-23 02:05:32

标签: c# .net system.reactive

在尝试使用IObservables之后,我决定测试它们是否通过消息总线处理传入消息。基本上我得到IObservable<Request>Request包含回复回复的必要函数。

在处理过程中,我必须反序列化数据并将其从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 个答案:

答案 0 :(得分: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;
       }
  }

我还为上下文和值定义了隐式运算符。还有一些关联的扩展方法允许您将值从一种类型转换为新类型。

如果有人有更好的方法,虽然我欢迎替代方案,而且我将在一段时间内保留这个未答复的方法。