2011-11-16 103 views
5

我有如下所示的具有依赖性的代码部分:AutoFac:PropertyWiringFlags.AllowCircularDependencies是做什么的?

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)..来解决这个问题。

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

回答

3

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

如果没有该标志,Autofac会考虑组件的所有依赖关系(属性或不属于),以便让其他组件获得对其的引用的先决条件。作为默认值,这更可靠。

+0

完美,thx。我认为你应用了这样的策略,只是想确保:) – Juri

1

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

+0

你能详细说明一下吗? – Juri

+0

'懒惰'也适用。只要其中一个依赖项使用Lazy/Func作为依赖类型,相互依赖的构造函数就可以工作。 –