我有一部分代码具有如下依赖关系:
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)..
来解析。
我的问题: 这个标志在幕后究竟做了什么来解决这些循环依赖?
答案 0 :(得分:3)
该标志更改了从构造时间到创建图表其余部分后类型的属性注入点。它依赖于循环中的一个或多个组件具有某种共享(单一或每个请求) - 即使使用标志,如果所有组件都是依赖于实例的,那么仍然存在一种循环。
如果没有该标志,Autofac会认为组件的所有依赖关系,属性与否,都是让任何其他组件获得对它的引用的先决条件。默认情况下,这更可靠。
答案 1 :(得分:1)
仅供参考,另一种解决循环依赖的好方法是依赖Func<T>
,只要你不在构造函数中访问func。