5

是否可以向统一容器注册以下递归结构:

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

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

 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[]>());

数组或元素的分辨率是开箱即用的,它只是简单地映射到ResolveAll.

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

于 2012-11-27T09:33:36.680 回答
3

您的问题的简单答案是否定的。如果通过解析 Foo 实例化了一个或多个 Bar 对象,而后者又实例化了一些 Foo 对象,Unity 会将其视为循环引用。

循环引用是 Unity 的一个问题:循环引用

于 2012-11-27T09:56:30.897 回答