2011-07-25 160 views
1

解決與autofac的依賴關係假設我有兩個服務(A和B)都註冊爲ISomeService。另外假設我將來需要上課,這將需要這些服務之一。但我還不知道班級名稱。我所知道的是他們正在實現給定的接口或抽象類(實現給定接口的所有類都需要與ISomeService相同的實例)。我怎樣才能確保這個決議發生?基於構造函數參數屬性

Here is a related question where the name of the class which uses the resolved service is known. 但在我的情況下,類名稱CustomerRepository的名稱未知。只有接口的名稱(如IUserRepository或IFunctionRepository)或抽象類是已知的。換句話說,我只知道SomeRepository:IUserRepository和IUserRepository類型需要A.我必須允許用戶編寫更多實現IUserRepository的類。

這裏是把問題的更好的方法。 我需要所有的IFunctionRepository構造函數來獲得A(其中A:ISomeService)和所有IUserRepository構造函數來獲得B(其中B:ISomeService)

回答

2

您應該問自己的問題是:容器如何知道何時使用哪個實施?沒有額外的信息,容器不能知道這一點。

而且還與ISomeService幾種實現,你應該要求客戶端始終與多個實例?

通常我會認爲像IUserRepository服務只有在任何一個時間一個實現。當然,你可以拆除一個實現並使用另一個,但客戶端類只需要一個實例,而不是幾個。

如果真的是你的容器將含有相同的接口的幾種實現的情況下,應該爲客戶端類的意義,接受多個實例,或者至少有一些元數據,要知道使用哪種實現。

對於客戶接受多個實例Autofac是承擔IEnumerable<ISomeService>的依賴和容器將移交所有實例一樣簡單。如果客戶端類應該對使用哪個實例做出明智的決定,則應該增加對元數據的註冊。你所涉及的問題是以類本身的形式使用某種類型的元數據。更好的方法可能是使用更多解耦形式的元數據。關於如何在Autofac中實現的討論可參見here

+0

謝謝你給了罕見的答覆 – ada

+0

@ada - 謝謝!罕見? :)希望你覺得它有用。如果是這樣,請將我的答案標記爲已接受。 –

+0

我的意思是很少有人關心這個問題。 :) – ada

相關問題