2

IObservablesを試した後、メッセージバスを介した着信メッセージの処理についてIObservablesをテストすることにしました。基本的に私はを取得しIObservable<Request>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、メッセージの一定のストリームがある場合、同じ入力オブジェクト(つまり、元の入力と、別々に処理された入力)で動作しますか?どうすればこれをテストできますか?

これを行うためのより良い方法はありますか?

4

1 に答える 1

2

私はそれを十分に解決しましたが、より良い方法があるかもしれません。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;
       }
  }

また、コンテキストと値の両方に対して暗黙の演算子を定義しました。値をあるタイプから新しいタイプに変換できるようにする、いくつかの関連する拡張メソッドもあります。

私は代替案を歓迎しますが、誰かがより良い方法を持っているなら、私はこれをしばらく答えないままにするつもりです。

于 2010-01-23T06:39:52.090 に答える