8

アプリケーションに (C# を使用して) 実装したいメディエーター パターンについて質問があります。コードにパターンを実装しているときに、循環依存関係に遭遇しました。クラスの構造は次のとおりです。

Mediatorコンポーネント/クラスは異なるアセンブリにありColleague、メディエーターパターンとして、両方のコンポーネント (クラス) を相互に使用する必要があります。問題は、相互に参照するときに発生します。

以下のコードを検討してください。

namespace Mediator
{
   public abstract class IMediator
   {
      public IColleague colleague{get;set;}
      void Register();
      void Send();           
   }
   public class MediatorA:IMediator
   {        
     void Register(){//code here}
     void Send(){//code here}       
   }
 }

namespace Colleague
{

    public abstract class IColleague
    {
        IMediator mediator;
        void Send();
        void Recieve();       

    }
    public class ColleagueA:IColleague
    {

        void Send(){//code here}
        void Recieve(){//code here}       

    }
}

Mediater と同僚は異なる名前空間とアセンブリにあるため、循環依存関係を解決するにはどうすればよいですか?

4

3 に答える 3

5

インターフェイスを含む3番目のアセンブリを定義する必要があります。私見、他に方法はありません。

于 2011-09-08T15:43:04.907 に答える
4

パターンを実装するために 2 つのクラスが互いにかなり緊密に結合されている場合、それらが別々のアセンブリにあるのはなぜですか? この種の循環依存関係がなくても Mediator パターンを実装できることに注意してください。これは通常、次の 2 つの方法のいずれかで行います。

  1. デリゲート コールバックをメディエーターに登録して、メディエーターがそれらについて知る必要なく、さまざまな方法で「同僚」を実装できるようにします。これは、匿名メソッドとラムダ式を使用して、コールバック ロジックを明確に表現することで、以前よりもはるかにシンプルになりました。

  2. Mediator と同じアセンブリに標準の 'IColleague' インターフェイスを提供し、必要なコールバックを使用して、使用するアセンブリで必要な具体的な実装を定義します。

于 2011-09-08T15:48:01.253 に答える
2

IColleague をメディエーター コードを含む名前空間/アセンブリに移動します。2つの間に他の依存関係がないと仮定します。それ以外の場合は、現在依存しているアセンブリに両方を移動します。

于 2011-09-08T15:48:15.227 に答える