2010-11-11 54 views
2

在容器中註冊類似乎有兩種選擇 - 明確地(RegisterType().As)或自動佈線(RegisterAssemblyTypes())。兩者似乎都有相當大的缺點。容器註冊的最佳做法?

明確註冊意味着我得到一個神類,它知道我模塊中的每種類型,並且很快就會變得龐大而笨拙。

通過自動佈線進行註冊可能會導致錯誤配置的依賴項,例如接口的多個實現(最後註冊成功)或註冊過多的永遠不會解析的類型,或者必須明確覆蓋註冊。終身關切(有些類型是單身人士,有些則不是)。

是否有一個最佳做法,使登記減少痛苦/風險?

乾杯 馬特

+0

真的很好,很好問的問題。謝謝。 – 2011-06-30 17:55:34

回答

1

也許一箇中間地帶是一個屬性添加到要註冊類。該屬性可以通過參數來指定它的註冊方式,例如組件的生命週期。

這不難實現你自己。如果你這樣做,你仍然有一個主要的註冊功能,但它只需要知道要查找什麼屬性(以及查找哪些DLL)而不是每個組件。

+0

很好的答案。這可以簡單地使用RegisterAssemblyTypes()之後的Where()和As()方法,或使用AutofacContrib.Attributed庫來完成。這種方法也有其缺點(正如他們所做的那樣),因爲它不鼓勵在單個應用程序中使用同一組件的多個配置。 – 2010-11-12 06:13:18

+0

我喜歡這個建議,但我有點驚訝,這不是一個更具說明性的東西。大多數人如何做註冊?你如何平衡每種方法的缺點? – citizenmatt 2010-11-12 13:13:17

+1

我真的不知道大多數人做什麼。我最初開始使用屬性,因爲這對我來說是有意義的,後來才發現使用主註冊功能(這是yuk)或自動綁定(對我來說感覺不夠明顯)的人。 – 2010-11-12 17:41:10

1

你看過使用Autofac的模塊支持嗎?

在您的引導程序或您建立容器的任何地方,只需在應用程序中註冊模塊,然後在每個註冊類型的模塊中註冊模塊。這使得閱讀和理解變得更容易。

+0

我發現使用模塊是一個很好的解決方案來處理複雜性。每個組件一個模塊,應用程序中的一個模塊拉入所有需要的組裝模塊。在每個模塊中,可以使用顯式或約定註冊,具體取決於特定組件的最佳配置。 – 2011-01-03 10:49:55