5

Unityコンテナに次の再帰構造を登録することは可能ですか:

public interface IFoo
{
    IBar[] Bars { get; set; }
}

public interface IBar
{
    IFoo[] Foos { get; set; }
}

各インターフェースに複数の名前付きインスタンスが存在すると仮定します。

public class Foo1 : IFoo 
{
    public IBar[] Bars { get; set; }
}

public class Foo2 : IFoo
{
    public IBar[] Bars { get; set; }
}

public class Bar1 : IBar
{
    public IFoo[] Foos { get; set; }
}

public class Bar2 : IBar
{
    public IFoo[] Foos { get; set; }
}

そして登録:

var container = new UnityContainer();

container.RegisterType<IFoo, Foo1>("foo1");
container.RegisterType<IFoo, Foo2>("foo2");
container.RegisterType<IBar, Bar1>("bar1");
container.RegisterType<IBar, Bar2>("bar2");

var instanceOfBar = container.Resolve<IBar>("bar1");

コレクションのプロパティが自動的に挿入されるように Unity コンテナーを構成する方法は?

4

2 に答える 2

6

プロパティに注釈を付けて依存関係にする方法があります。しかし、あなたの場合、解決プロセスが無限であるため、これは機能しません。単にスタックオーバーフロー例外が発生します。このような構造を実装するには、遅延パターンを使用するため、必要な場合にのみそのようなコレクションを解決します。

 Func<IFoo[]> resolver;
 IFoo[] value;
 public IFoo[] Foos { get{
      if(value == null) value = resolver();
         return value;
     } 
 }

コンテナからFunc<IFoo[]>解決可能にするには、これを追加します:

 container.RegisterInstance<Func<IFoo[]>>(e => e.Resolve<IFoo[]>());

配列または要素の解決は、単純に にマップする unity によってそのまま使用できますResolveAll

Func<IFoo[]>次に、コンストラクターを介して単純に注入します。

于 2012-11-27T09:33:36.680 に答える
3

あなたの質問に対する簡単な答えはノーです。Unity は、Foo を解決することによって 1 つ以上の Bar オブジェクトをインスタンス化し、それがいくつかの Foo オブジェクトをインスタンス化する場合、それを循環参照と見なします。

循環参照は Unity の問題です:循環参照

于 2012-11-27T09:56:30.897 に答える