使用Unity容器注册递归结构

Dar*_*rov 4 c# dependency-injection circular-dependency unity-container

是否可以使用以下递归结构向unity容器注册:

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

public interface IBar
{
    IFoo[] Foos { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

假设每个接口都存在多个命名实例:

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; }
}
Run Code Online (Sandbox Code Playgroud)

并注册:

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");
Run Code Online (Sandbox Code Playgroud)

如何配置Unity容器以便自动注入集合属性?

Raf*_*fal 6

有一种方法可以将属性注释为依赖项.但在你的情况下,由于解决过程的无限性,这将不起作用.简单地说,您将获得stackoverflow异常.要实现这样的结构,我使用惰性模式,所以我只在需要时才解决这样的集合:

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

使Func<IFoo[]>解析从容器中加入这样的:

 container.RegisterInstance<Func<IFoo[]>>(e => e.Resolve<IFoo[]>());
Run Code Online (Sandbox Code Playgroud)

数组或元素的分辨率是通过它简单映射到的单位开箱即用的ResolveAll.

然后只需Func<IFoo[]>通过构造函数注入.