iobservableを分割してから、処理後に結合しますか?
-
22-09-2019 - |
質問
IOBSERVABLESを試した後、メッセージバスを介して着信メッセージの処理についてテストすることにしました。本質的に私は IObservable<Request>
そしてその 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
一定のメッセージがある場合は、同じ入力オブジェクト(つまり、元の入力、および個別の処理された入力)で動作します。これをテストするにはどうすればよいですか?
これを行うより良い方法はありますか?
解決
私はそれを十分に解決しましたが、より良い方法があるかもしれません。 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;
}
}
また、コンテキストと価値の両方について暗黙的な演算子を定義しました。また、値を1つのタイプから新しいタイプに変換できるいくつかの関連する拡張メソッドもあります。
誰かがより良い方法を持っている場合、私は代替手段を歓迎します、そして私はこれをしばらくの間未回答のままにします。