3

我正在使用Autofac在我的解決方案中實現IoC,但我懷疑我是否正確地做對了。這裏是場景:
我有一些Manager類,所有類都從BaseManager類派生。 BaseManager有一個protected User CurrentUser字段。我想要做的是使用Autofac解決CurrentUser。我寫了一個IUserProvider接口並實現了幾個類(例如WebUserProviderWinformsUserProvider)。
於是我註冊了我的供應商如下(例如,在Global.asax)使用依賴注入正確的方法

builder.Register(c => new WebUserProvider(...)).As<IUserProvider>(); 
  • 我怎樣才能解決依賴關係(訪問container在我的課),我可以用一個單或服務定位器模式,但似乎?就像是一個anti-pattern,所以我應該怎麼解決我的依賴?

回答

5

這聽起來像是過度設計給我。爲什麼你會擁有基管理類具有這些用戶的知識呢?哈ving 一些經理類別本身就是一種代碼味道和維護風險,因爲您的內容過於抽象。你真的需要嗎?

如何解決依賴關係(在我的類中訪問容器)?

您不應該在尋找訪問您的容器的方法。容器必須在一個地方初始化一次。你應該通過構造函數注入所有的依賴關係。這些依賴關係使用構造函數注入(或者一些人使用屬性注入)從依賴關係圖的根中使用container.Resolve<T>和依賴關係圖中的其他位置傳入。

+0

由於記錄目的,我必須定義BaseManager並在那裏初始化CurrentUser。 (我不希望將當前用戶傳遞給我的經理類中的每個方法)。您說過「容器必須在一個地方初始化一次」,所以如果服務定位器和單例是反模式,那麼還需要初始化和訪問單個容器? – Kamyar 2012-03-06 08:43:26

+2

如果這是一個WinForms應用程序,您可以在接近輸入點(主要方法)的地方創建和設置您的容器。在主體中,您還解析了一個接口並將其傳遞給成員。在ASP.NET中,你可以在global.asax中設置它,然後註冊一個工廠,例如像[here](http://stackoverflow.com/questions/5124393/setting-up-inversion-of-control-ioc -in-ASP淨MVC-與-城堡溫莎)。因此,在DI和IoC中,所有相關類都被抽象並且從未被明確要求。 – oleksii 2012-03-06 08:59:50