0

現在、 StructureMapをビジネス レイヤーに統合していますが、双方向の依存関係が原因で問題が発生しています。

レイヤーには複数のマネージャーが含まれており、各マネージャーは相互にメソッドを呼び出すことができます。通信に関する制限やルールはありません。これには、以下の例のような循環依存関係も含まれます。設計自体に問題があることは承知していますが、現在はStructureMapを機能させたいだけであり、将来的にはさらなるリファクタリングに注力する予定です。

すべてのマネージャーは次のIManagerインターフェースを実装します。

internal interface IManager
{
  bool IsStarted { get; }

  void Start();
  void Stop();
}

また、独自の特定のインターフェイスもあります。

internal interface IManagerA : IManager
{
  void ALogic();
}

internal interface IManagerB : IManager
{
  void BLogic();
}

2 つのダミー マネージャーの実装を次に示します。

internal class ManagerA : IManagerA
{
  public IManagerB ManagerB { get; set; }

  public void ALogic() { }

  public bool IsStarted { get; private set; }
  public void Start() { }
  public void Stop() { }
}

internal class ManagerB : IManagerB
{
  public IManagerA ManagerA { get; set; }

  public void BLogic() { }

  public bool IsStarted { get; private set; }
  public void Start() { }
  public void Stop() { }
}

これが私が現在使用している StructureMap 構成です

マネージャーを登録する方法がまだわからないので、現在は手動登録を使用しています。多分誰かがこれで私を助けることができます。

For<IManagerA>().Singleton().Use<ManagerA>();
For<IManagerB>().Singleton().Use<ManagerB>();

SetAllProperties(convention =>
{
  // configure the property injection for all managers
  convention.Matching(prop => typeof(IManager).IsAssignableFrom(prop.PropertyType));
});

結局、 StructureMapはとの間の循環依存関係について不平を言うIManagerAため、作成できません。この問題を解決し、現在の設計を維持するための簡単でクリーンな解決策はありますか?ManagerAManagerB

4

1 に答える 1

9

患者:「先生、指を目に突っ込むと痛いです」

医師:「目を指で突くのはやめてください。」

いいえ、現在の設計を維持する「簡単」または「クリーン」なソリューションはありません。直感とツールが、設計が機能していないことを示している場合は、おそらく耳を傾けることをお勧めします。

と が必要な場合はIManagerAIManagerB両方を依存関係として使用する必要があります。StructureMap のような依存性注入ツールを使用すると、これらのタイプの合成シナリオが簡単になります。

于 2010-05-03T03:39:05.730 に答える