2016-10-04 5 views
1

私は、Autofacでインスタンス化する2つの相互依存するクラスを持っています。基本的に、親は子への参照を必要とし、子はこの場合親が実装するサービスへの参照を必要とします。Autofacを使用して相互に依存するコンポーネントを作成する方法

public class Parent : ISomeService 
{ 
    private IChild m_child; 

    public Parent(IChild child) 
    { 
     m_child = child; // problem: need to pass "this" to child constructor 
    } 
} 

public class Child : IChild 
{ 
    public Child(ISomeService someService) 
    { 
     // ...store and/or use the service... 
    } 
} 

+0

本当に循環依存を避けるべきです。あなたのケースでは、1つの解決策は、2つの別個のクラスの 'Parent'クラスを分割することです。 –

+0

@CyrilDurand、あなたは循環依存で実行した特定の問題について詳しく説明できますか?オブジェクトグラフにサイクルがあることは非常に一般的です。したがって、避けるのは難しいことがよくあります。 –

+0

具体的な技術的な問題よりも設計上の問題です。それはしばしば、あなたのコンポーネントが[solid](https://en.wikipedia.org/wiki/SOLID_(object-oriented_design))ではないことを示す設計上の問題を示します。循環依存を導入するための回避策では、コードの読み込みが難しくなり、テストモックアップが難しくなります。 [wikipediaの循環依存関係](https://en.wikipedia.org/wiki/Circular_dependency)では、循環依存関係のいくつかの問題についても議論しています。可能であれば、新しい構成要素の導入などでこれらの依存関係を回避しようとします。 –

答えて

0

parameterized instantiationを使用して、かなり洗練されたソリューションが見つかりました。魔法のように

public class Parent : ISomeService 
{ 
    private IChild m_child; 

    public Parent(Func<ISomeService, IChild> childFactory) 
    { 
     m_child = childFactory(this); 
    } 
} 

public class Child : IChild 
{ 
    public Child(ISomeService someService) 
    { 
     // ...store and/or use the service... 
    } 
} 

// Registration looks like this: 

builder.RegisterType<Parent>(); // registered as self, NOT as ISomeService 
builder.RegisterType<Child>().AsImplementedInterfaces(); 

作品:それはISomeService上の子の依存性は任意の厄介な寿命の問題を(私の知る限り)を導入することなく、既存のオブジェクト(Parentインスタンス)を使用して解決することができます。 :)

関連する問題