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容器以便自动注入集合属性?
有一种方法可以将属性注释为依赖项.但在你的情况下,由于解决过程的无限性,这将不起作用.简单地说,您将获得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[]>通过构造函数注入.