2011-11-16 36 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作爲依賴類型,相互依賴的構造函數就可以工作。 –