針對這裏我的問題,這是關於有一個循環依賴一半:構造函數注入循環通過反射解決了依賴關係?
C# ASP.NET Dependency Injection with IoC Container Complications
主講依賴於IVIEW。頁面(實現IView)取決於主持人。其他已經解決了從構造注入到財產注入的這種轉換
我沒有這樣做,因爲我覺得您現在需要製作可以在外部進行修改的公共屬性,並且也成爲開發人員初始化的責任。
但似乎我已經能夠解決這個問題的另一種方式。
通過具有默認構造函數以及重載參數化構造函數的頁面,您可以通過反射調用無參數構造函數來創建對象 然後通過注入依賴項來調用重載的對象。
I'ill通過示例示出了:
class TestObject
{
public string Name { get; set; }
public TestObject()
{
Name = "Constructed with no args";
Console.WriteLine("constructor hash code: " + GetHashCode());
}
public TestObject(string name)
{
this.Name = name;
Console.WriteLine("constructor hash code: " + GetHashCode());
}
}
該目的可以簡單地構成:
var obj = Activator.CreateInstance<TestObject>();
或
var obj = new TestObject();
但是,我可以通過反射使用重載的構造注入依賴關係:
ConstructorInfo ctor = obj.GetType().GetConstructors()[1];
ctor.Invoke(obj, new[] { "injected" });
我能夠用這種方式來線了structuremap註冊創建後的實例,然後注入的依賴關係。
當然,我們可以使用常規方法來注入依賴關係,但是這又打破了封裝,所以您可以再次調用此 來覆蓋依賴關係。
而且作爲構造這個斜面簡單地通過靜態代碼到達。
但我不知道我是怎麼想的,感覺就像一個黑客或東西,我可以簡單地做偶然在C#中一點點。
我想聽聽您的想法
感謝。
有趣的是,這是可能的,但我認爲這是需要長期維護的頭痛問題。想象一下,那些正在調試你的代碼的可憐的維護工程師,發現構造函數被調用了兩次,並且假定兩個實例必須以某種方式創建。 –
相關:http://stackoverflow.com/questions/2053044/can-dependency-injection-prevent-a-circular-dependency –