3

キューに置かれている一連のサービス (非 WCF) があります。メッセージが到着すると、典型的なサービスはいくつかの計算を行い、0 個以上の結果メッセージを出力キューに吐き出します。各サービスには、その主な機能に加えて、認証 / 監査 / ロギング / ステータス追跡などのいくつかのハウスキーピング ロジックがあり、正確な手順とシーケンスはサービスによって多少異なります。ここで、パイプラインの概念が登場します。

最終的なデザインに満足できず、シンプルにする方法を探しています。CCR ポートをモデル化する必要がありますか? ASP.NET パイプライン? AOP? 他に何か?

私の現在の設計は次のとおりですIMessageHandler<TMessage>。IoC を使用して 6 つの独自の方法でチェーンされたインターフェイスと約 15 の実装があります。インターフェイスは単一のメソッドHandle(TMessage msg)を定義するため、各実装はメッセージをデイジー チェーンの次のハンドラに渡す前と後の両方で何らかのロジックを実行できます。

これの問題は、各実装が正確に何をするのか、なぜこの特定のサービスのためにこの特定の方法で連鎖されたのかを思い出すのが難しいことです。一方、各側面を独自のクラスに配置すると、懸念事項をより適切に分離できるため、単体テストが容易になります。

アイデア?私が見ることができる良いパイプラインパターンはありますか? 参照として使用できる優れたパイプラインの実装はありますか? それともJFHCIにするべきですか?

4

2 に答える 2

2

私はあなたが説明したものに似たコードを書くことがよくあります。コードの意図を明確にするために、実行時にアプリケーションの作業を行うオブジェクトを構成する「シンタックス シュガー」の層を追加し、最終的なオブジェクト グラフが何を行うかを明確に表現します。

Steve Freeman と私は、Java でこの構文糖衣層を構築するために使用する手法についての論文を書きました: http://www.jmock.org/oopsla2006.pdf。私は C# やその他の Algol ファミリー言語で同じ手法を使用し、金融市場モデル、分散システム アーキテクチャ、通信プロトコル スタック、ゲームでのスプライト動作などを記述するための組み込み言語を含む、非常に複雑な「ドメイン固有組み込み言語」を構築しました。の上。

于 2009-06-29T21:24:37.563 に答える
2

私はあなたが選んだデザインを非常に頻繁に使用していますが、常に IoC を使用しているわけではありません。

「ドキュメント」に問題があるようです。コードは、それが何をするかをうまく説明していません。この問題にはいくつかの解決策があります。

まず、コードに大量のコメントを付けることができます。これはしばしば臭いであり、実装に大きく依存します。特定の方法で IoC 構成に名前を付けることで、その場でコメントすることもできます。

次に、オブジェクトの塊を作成できます。たとえば、一緒に実行される傾向がある 3 つのオブジェクトがある場合、他のオブジェクトに委任する「AuthorizeAndAudit」クラスを作成できます (おそらく、IoC と「プラグイン ファミリ」、またはサポートされている場合はコンテナーがそれらを呼び出すものを使用して構築されます)。これにより、オブジェクトの意図がよりよく結び付けられます。IMessageHandler も実装し、それ自体で foreach を実行する IMessageHandler のコレクションを持っている傾向があります。

第 3 に、インターフェイスを分離できます。チェーンのさまざまな部分で発生するアクションが含まれているという理由だけで、オブジェクトを分割している状況があるように思えます。認証用、監査用などに 1 つのインターフェイス (または共有インターフェイスのメソッド) を作成できます。オブジェクトは、これらのインターフェイスの 1 つ以上に実装できます。インターフェイスの順序が定義されているため (Auth を呼び出してから Audit を呼び出すなど)、オブジェクトはチェーン内の複数のステップに取り組むことができます (最終的にはチェーンのチェーンになります)。個別のクラスに分割する必要はありません。ログ トレーサのように、すべてのステップが呼び出されるたびにすべてのチェーンとログに配置されるオブジェクトがある場合もあります。

それを超えて、ワークフローなどのより複雑なものに取り掛かり始めると、Windows ワークフローが良い場所になるかもしれません。

于 2009-06-29T21:15:58.843 に答える