2

アプリケーションに統合している電子メール コンポーネントがあり、必要に応じて別のサード パーティ コンポーネントと交換できるように、その周りにラッパーを構築する方法に関するヒントを探しています。

現在の私のアプローチは次のとおりです。

  1. インターフェイスを構築すると、必要な機能が得られます。
  2. このクラス内のサードパーティ コンポーネントを使用して、インターフェイスを実装するクラスを作成します。
  3. このコンポーネントの使用は、次のようにインターフェイスを介して行われます。

    IPop3 pop3 = 新しい AcmeIncePop3Wrapper(); pop3.connect();

AcmeIncePop3Wrapper の内部は次のようになります。

   public void connect()
   {
         AcmeIncePop3 pop = new AcmeIncePop3();
         pop.connect();
   }

それは良いアプローチですか?

おそらく ninject を使用して別の抽象化を追加して、実装を交換することができますが、サードパーティのアセンブリを毎日変更することを期待していないため、実際にはこれで十分なようです。物事をそれほどきつくしたくないだけです。カップリング。

4

3 に答える 3

2

私はあなたが良い実装をしていると思います。基本的に、あなたのインターフェースは「これが私が電子メールを処理したい方法です」と言い、サードパーティのコンポーネントは別のことをするかもしれませんが、あなたのインターフェースに基づいてラッパークラスを構築すれば、サードパーティのコンポーネントをそのインターフェースに組み込むことができるはずです。

注意したい唯一のことは、具象クラスをどこで新しくするかということです。頻繁に新しくする場合は、ファクトリなどを使用することを検討できます。そうでない場合は、大したことではないかもしれません。new AcmeIncePop3() をあちこちに作成しても、その具体的なクラスにかなり密接に結合されていると思います。

于 2009-11-12T16:03:53.120 に答える
1

あなたは正しい方向に進んでいます。

サードパーティのアセンブリにある場合、必要なクラスの定義にインターフェイスを追加できないため、インターフェイスを使用するだけでは解決できません。代わりに、次の2つのいずれかを実行します。

  1. 知っているすべての異なるアセンブリに共通のメソッドを使用してまったく新しいクラスを作成し、存在する可能性のあるそれぞれの異なるアセンブリを処理します(大きな違いを処理するために、ここで追加のロジックが必要になる場合があります)。

  2. 一般的なメソッドなどを使用してインターフェイスを作成してから、サードパーティのクラスを継承してインターフェイスを実装する新しいクラスを作成します。使用する必要がある新しいアセンブリのクラスごとにこれを実行します。

オプション2の問題は、を拡張できないことsealed classです。これは、サードパーティに拡張することを期待しています。オプション1をお勧めします。

于 2009-11-12T15:34:16.707 に答える
1

あなたの実装は問題ないと思います。それはまさに私が何かをラップするために行うことです。

于 2009-11-12T15:30:07.603 に答える