2012-12-21 37 views
3

我正在爲一個開放源代碼項目做出貢獻,該項目正在尋求支持多個容器來實現其內部服務。支持容器的要求之一是註冊順序很重要。因此,如果某個接口的多個實現以特定的順序註冊,那麼當解析這些服務的列表時,實現應該按照它們註冊的順序返回。Autofac能否按照他們註冊的順序返回一個類型的所有服務?

var builder = new ContainerBuilder(); 
builder.RegisterType<PreferredService>().As<IService>(); 
builder.RegisterType<AlternativeService>().As<IService>(); 
builder.RegisterType<AdditionalService>().As<IService>(); 
... 
// Get the first (preferred) implementation of IService. 
var possibleServices = container.Resolve<IEnumerable<IService>>(); 
IService idealServiceImplementation = possibleServices.FirstOrDefault(); 

我的測試表明Autofac返回的服務是反向順序。情況總是如此嗎?我能相信他們每次都會以相反的順序解決嗎?即使我在爲其他接口註冊了一些後續服務之後,這種行爲是否一致?我可以攔截隱式調用來解析列表嗎?

有沒有辦法指示Autofac註冊順序很重要?

+0

更新了問題以包含處理這些列表的隱式依賴關係。 – ventaur

+0

我不認爲Autofac的意圖是以這種方式使用它或以這種方式依賴它。所以,不要依賴它。 – slimflem

回答

3

除非您使用PreserveExistingDefaults(),否則Autofac註冊總是「最後註冊獲勝」。快速查看實現過程可以看到,註冊存儲爲鏈接列表,默認行爲添加到開頭,PreserveExistingDefaults()添加到結尾。解決單個服務會讓您成爲列表中的第一個項目。解析枚舉可以獲得您的訂單。我不確定這種行爲是否保證永不改變。

如果是我,我會依賴於當前的行爲,但是寫一個自動化測試,如果行爲改變將會失敗。

+1

當前依賴於合適順序的失敗測試是引起我們關注的。所以,我非常肯定,如果行爲確實發生了變化,他們會抓住它。我將驗證PreserveExistingDefaults()將使我們獲得我們所需的行爲。我會回來的。感謝您的方向推動。 – ventaur

+0

這絕對回答了上面的主要問題。我爲此增加了一個新的問題。 – ventaur

相關問題