我目前正在使用Autofac,但也可以對其他IOC容器進行評論。如果可能的話,我更喜歡使用Autofac的解決方案。我對國際奧委會也有些新鮮,所以我可能會嚴重誤解我應該使用國際奧委會容器。IOC/Autofac容器
基本上,情況如下:
我有一個最頂層的IOC容器我的應用程序。我有一個子容器/作用域的樹,我希望同一個「服務」(IWhatever)根據解析樹中的哪個級別進行不同的解析。此外,如果一個服務未在樹中的某個級別註冊,我希望該樹向上橫穿直到找到合適的實現。
此外,構建給定的組件時,我很可能需要訪問父容器/作用域。在許多情況下,我正在註冊的組件將依賴於父範圍中相同或不同的服務。
有什麼辦法可以用Autofac表達這種依賴關係嗎?喜歡的東西:
builder.Register(c=>
{
var parentComponent = ?.Resolve<ISomeService>();
var childComponent = new ConcreteService(parentComponent, args...);
return childComponent;
}).As<ISomeService>();
我不能讓類似上述僞什麼原因有幾個工作:
A)看來,在範圍樹份額各級一套共同的註冊。我似乎無法找到一種方法來使給定的註冊侷限於某個「範圍」。
B)我似乎無法找到一種方法來獲得給定範圍的父範圍。我可以在容器中解析ILifetimeScope,然後將其提交給提供其父作用域的具體LifetimeScope實例,但是我猜測它可能是用於這種方式的註釋。這安全嗎?
C)我不知道如何告訴Autofac哪個容器擁有解析對象。對於許多組件,我希望組件由其構建的範圍「擁有」。標記的上下文可以幫助我嗎?我需要用一個獨特的標籤來標記每一層樹嗎?這會很困難,因爲樹的深度是在運行時確定的。
對不起,這個問題非常冗長。總結:
1)有什麼辦法做我想用Autofac做什麼?
2)是否有另一個容器更適合這種依賴性結構?
3)IOC是完全錯誤的工具嗎?
非常好。感謝您的幫助 - 聽起來我不得不倒退到1.4(現在)。出於好奇,爲什麼要消除這種行爲? AutoFac 2生命週期範圍模型更好地支持更常見的用例,其中生命週期範圍共享通用註冊?或者僅僅是因爲autofac 2還不完整。 無論如何 - 非常感謝您的幫助! – Krazzy 2010-01-08 22:46:09
不客氣。 Autofac 2最終應該支持這一點,但模型是不同的,所以實施需要一些思考。模型的改變使得爲這樣的任務添加'適配器'變得更加容易,否則這些任務需要容器操作。祝一切順利! – 2010-01-09 13:30:19