7

NServiceBusを直接参照せに汎用バスとして機能するレイヤーを開発するように依頼されています。これまでのところ、目立たないメッセージのサポートのおかげでそれほど難しくはありません。今を除いて、私はIHandleMessagesの独自の定義を提供し、ワイヤーアップ中にそれをマップする方法を見つけるように求められました。だから私はこのようなことを考えています:

    public class MessageHandlerAdapter<T> : IHandleMessages<T>
{
    IUnityContainer container;

    public MessageHandlerAdapter(IUnityContainer container)
    {
        this.container = container;
    }

    #region IMessageHandler<T> Members

    public void Handle(T message)
    {
        var handler = container.Resolve<IHandle<T>>();
        handler.Handle(message);
    }

    #endregion
}

IHandleは私たち自身の定義になります(ちなみに、これはIHandleMessagesとまったく同じです)。AppDomainを熟考し、IHandleを実装したすべてのクラスを見つけてそれらをコンテナーに登録してから、同じタイプTでMessageHandlerAdapterを登録することを期待します。

私の問題は、NServiceBusを2年近く使用しておらず、NSBパイプラインのこの種の機能をどこに接続するかを覚えていないことです。

4

1 に答える 1

42

おそらくこの答えは気に入らないでしょうが...使用するツールの抽象化レイヤーを作成しないでください。

私は、人々が特定のツールの周囲に抽象化レイヤーを書き込もうとする例を数多く見てきました。ほとんどの場合は、ロギングと ORM フレームワークです。これを行うとき、人々は善意を持っています。彼らは「ライブラリ X を簡単に切り替えられるようにしたい」と考えています。残念ながら、これはいくつかの理由で悪い考えです

  • 互換性のない概念。あなたの例では、NSB Saga タイムアウトの概念を抽出することができます。ただし、この概念が理論上の「将来切り替えるライブラリ」で同じように動作するという保証はありません。また、概念がまったく存在するという保証もありません。通常、これらの「抽象化レイヤー」は、最終的に単一のライブラリの直接マップになり、移植性がまったくありません。
  • 複雑さが追加されました。ソリューションに大量の複雑さが追加されます。
  • サンプルは機能しません。ライブラリのサンプルを見るときは、抽象化レイヤーに「マップ」する必要があります
  • 参入障壁。あなたのチームに加わった新しい開発者は問題のライブラリを使用しているかもしれませんが、彼らはあなたのラッパーを理解していません
  • APIとの戦い。「共通の実装を抽出できる」という機能を念頭に置いて設計されたライブラリはありません。このため、API は、このアクティビティを実行しているユーザーと積極的に戦います。
  • デバッグ。レイヤーを追加すると、ソリューションのデバッグが難しくなります
  • パフォーマンス。一般に、コードが多いほどコードは遅くなります。また、多くの場合、これらの抽象化レイヤーはリフレクションを使用する必要があります...
  • サポート。ライブラリとの対話方法を文書化するのが難しくなるため、ライブラリの所有者からサポートを得ることが難しくなります。
  • 進行中の変更。問題のライブラリが API に追加または変更されるたびに、ソリューションでその機能を利用する前に、マッピング コードを追加する必要があります。
  • ドキュメンテーション。多くの場合、ライブラリのドキュメントの作成には膨大な人時間が費やされます。抽象化のドキュメントをそのレベルまで取得するには、かなりの労力が必要です。

それはすべて時間の問題です。ツールの抽象化に時間を費やそうとしています。将来、より多くの時間を節約することを期待して。問題は、この抽象化を作成して維持するために、切り替えを決定した場合に節約できるよりもはるかに多くの時間を費やすことです。これはあなたの同僚へのあなたの応答でなければなりません。

これは、抽象化の弊害について話している Ayende からの興味深い投稿です。その多くはこのシナリオに適用できますhttp://ayende.com/blog/4784/architecting-in-the-pit-of-doom-the-evils-of-the-repository-abstraction-layer引用するには

...不必要な複雑さを避けるようにしてください... 抽象化のレイヤーを追加すると、通常は難しくなるだけです。

于 2013-01-17T22:52:50.767 に答える