AutoFac:PropertyWiringFlags.AllowCircularDependencies做了什么?

时间:2011-11-16 13:31:19

标签: c# asp.net .net-4.0 autofac

我有一部分代码具有如下依赖关系:

public class MyPage : Page //ASPX WebForms page
{
    public IPersonBl PersonBl { get; set; }

}

public class PersonBl : IPersonBl
{

    public PersonBl(ISomeMagicBl magicBl){...}

}

public class SomeMagicBl : ISomeMagicBl
{
    public IPersonBl PersonBl { get; set; }

    public SomeMagicBl(/*Other dependencies*/) {...}
}

我的模块配置如下

...
builder.RegisterAssemblyTypes(ThisAssembly).Where(t => t.Name.EndsWith("BL")).AsImplementedInterfaces().PropertiesAutowired(PropertyWiringFlags.AllowCircularDependencies).InstancePerLifetimeScope();
...

可以看出,我的课程中有循环依赖,我可以使用..PropertiesAutowired(PropertyWiringFlags.AllowCircularDependencies)..来解析。

我的问题: 这个标志在幕后究竟做了什么来解决这些循环依赖?

2 个答案:

答案 0 :(得分:3)

该标志更改了从构造时间到创建图表其余部分后类型的属性注入点。它依赖于循环中的一个或多个组件具有某种共享(单一或每个请求) - 即使使用标志,如果所有组件都是依赖于实例的,那么仍然存在一种循环。

如果没有该标志,Autofac会认为组件的所有依赖关系,属性与否,都是让任何其他组件获得对它的引用的先决条件。默认情况下,这更可靠。

答案 1 :(得分:1)

仅供参考,另一种解决循环依赖的好方法是依赖Func<T>,只要你不在构造函数中访问func。