在尝试使用IObservables之后,我决定测试它们是否通过消息总线处理传入消息。基本上我得到IObservable<Request>
,Request
包含回复回复的必要函数。
在处理过程中,我必须反序列化数据并将其从Request转换为包含它实际需要执行的操作的Command对象。命令与请求无关。
反序列化之后,我将其转换为正确的响应,但是为了发送响应,我需要原始的Request对象。我想尝试实现这一点,同时保持高代码可读性。到目前为止,我已经使用了扩展方法和lambda表达式来获得以下内容(其中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
是否会对同一输入对象(即原始输入,以及单独处理)进行操作输入)如果有一个恒定的消息流。我该怎么测试呢?
有更好的方法吗?
答案 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;
}
}
我还为上下文和值定义了隐式运算符。还有一些关联的扩展方法允许您将值从一种类型转换为新类型。
如果有人有更好的方法,虽然我欢迎替代方案,而且我将在一段时间内保留这个未答复的方法。