傳遞同一接口的多個實現我們公司的產品之一是由許多小型Web應用程序和一個windows服務組件組成,每個組件可能都駐留在不同的計算機中。其中之一是一個WebForms項目,作爲所有其他項目的配置中心。使用DI
我們正在設計一個功能來公開組件的一般信息。想象一下,一個簡單的界面,這樣,例如:
public interface IStatistics
{
Statistics GetStatistics();
}
我們想用這個相同的接口上的所有組件,所以這是集中在一個共同的,共享的組件。這個實現最初也是一樣的,所以它在同一個程序集中,與界面一起。
接下來的想法是在每個組件上公開一個Wcf服務,同時使用通用程序集上的實現和接口。這個實現使用環境類,根據它們運行的地方返回不同的東西,比如本地機器時間。
我想優雅地解決的問題是如何使用相同的接口將每個組件的所有實現傳遞給webform。
我們目前使用Unity,但我想我會遇到與其他DI解決方案相同的問題。我想注入5個相同接口的實現(每個組件一個接口),並且能夠通過組件區分它們(認爲是Dictionary<Component, IStatistics>
,其中Component
是Enum
)。這是必要的,因爲頁面上會有一個下拉菜單來選擇哪個組件的信息是可見的,然後頁面會調用正確的實現來檢索結果。
我知道我可以使用所有實現的命名註冊,然後注入它們。可惜的是,這將導致我:
- 網頁上有5個不同的參數,每個都指向一個組件
- 註冊在容器上每個實現用不同的名稱
- 明確登記在容器上我的Web窗體,與自定義InjectionConstructor指定每個註冊接口,以正確的順序,對於頁注射方法
我知道統一具有ResolveAll方法,從而允許一個接收IStatistics[]
或IEnumerable<IStatistics>
,但後來我無法區分它們。
我想MEF用元數據接口的概念解決了這個出色的問題。也許讓MEF在這上面解決這個問題?我認爲這樣做會不合適,因爲這些是我們正在討論的wcf代理,我看不出這將如何與MEF整合。
也許使用工廠將是一個更好的策略,但我不明白我將如何注入工廠的服務,所以問題會持續存在。
如果命名是問題,爲什麼不用'DisplayNameAttribute'來修飾'IStatistics'實現?你可以讓你的工廠讀取這些屬性並返回一個IEnumerable>或類似的東西。 –
Steven
@Steven請注意,在我的問題中,我表示實現也集中在通用程序集中,因爲它實際上並不需要專門化。如果我在每個組件上實際實施了多次,您的方法纔有效。目前,這是沒有意義的。不過謝謝你的洞察力,否則它可能是一個不錯的方法。 – julealgon
@julealgon,你怎麼知道有多少IStatistics代理以及他們的顯示名稱在下拉列表中? –