2010-01-08 108 views
2

我目前正在使用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是完全錯誤的工具嗎?

回答

2

Autofac 1.4支持這個很容易,現在可能是最好的選擇。您只需在子容器中註冊子容器組件即可。

您正在使用的Autofac 2雖然正在調查中,但它還沒有一個簡單的等價物。

+0

非常好。感謝您的幫助 - 聽起來我不得不倒退到1.4(現在)。出於好奇,爲什麼要消除這種行爲? AutoFac 2生命週期範圍模型更好地支持更常見的用例,其中生命週期範圍共享通用註冊?或者僅僅是因爲autofac 2還不完整。 無論如何 - 非常感謝您的幫助! – Krazzy 2010-01-08 22:46:09

+0

不客氣。 Autofac 2最終應該支持這一點,但模型是不同的,所以實施需要一些思考。模型的改變使得爲這樣的任務添加'適配器'變得更加容易,否則這些任務需要容器操作。祝一切順利! – 2010-01-09 13:30:19