2

の作成時に、新しい、をEngine必要とし、 「this」自体をに渡します。CompomentEngineComponent

の作成時に、親を認識し、関数を呼び出すことで親と統合するComponent必要があります。EngineIntegrateComponent()

ここでは、一種の循環参照状況です。DIでこれを行うにはどうすればよいですか?(私の場合はCastle Windsor)

public class Engine : IEngine {
  private IComponent _someComponent;
  public Engine() {
    _component = new Component(this);
  }
  public void IntegrateComponent() {
    //init component...
  }
}

public class Component : IComponent {
  private readonly IEngine _engine;
  public Component(IEngine engine) {
    _engine = engine;
    _engine.IntegrateComponent();
  }
}

static void Main() {
  var engine = new Engine();
}    

編集 - - - - - - - - - - - - - - - - - - - -

私は...のようなものが欲しい

Register<IComponent>().ImplementedBy<Component>(); 
Register<IEngine>().ImplementedBy<Engine>(); 
---> Resolve<IEngine>(); ... 

しかし、DIにこのエンジンとこのコンポーネントの参照を相互に伝えるにはどうすればよいですか?

4

1 に答える 1

0

まず、循環参照がないように設計する必要があります。そうでない場合は、プロパティインジェクションを使用して、これを破ることができます。

var engine = new Engine();
engine.Component = new Component(engine);

これは、MarkSeemannの優れた本である.NetのDependencyInjectionに基づいています。

これにはすでにスレッドがあります:CastleWindsorで問題を引き起こしている一見循環依存

于 2012-12-01T06:00:52.443 に答える