[英]Unintended method exposure using inheritance with a generics typed class
我盡力了標題。 我想要完成的是具有依賴注入的分層模塊化。 這種設計模式是否好是另一個論壇的問題。
因為我使用依賴注入,所以我有接口/實現對。 這是頂級界面:
public interface IConfiguration<T> where T : ConfigData
{
T GetConfig();
}
其中ConfigData
是一個簡單的類,它公開get
/ set
屬性,如LogLevel
和Environment
。
有一個接口的基本實現:
public abstract class ConfigurationBase<T> : IConfiguration
{
protected ConfigData Config { get; set; }
public T GetConfig()
{
return Config as T;
}
}
現在是依賴注入的部分! 我有幾個接口/實現對,它們彼此分層繼承。 此外,它們protected Config
屬性還在每個后續子類中公開了更多屬性。 這是我的接口/實現簽名:
public interface IGeneralConfiguration : IConfiguration<GeneralConfigData>
public class GeneralConfiguration : ConfigurationBase<GeneralConfigData>, IGeneralConfiguration
public interface ILoginConfiguration : IConfiguration<LoginConfigData>, IGeneralConfiguration
public class LoginConfiguration : ConfigurationBase<LoginConfigData>, ILoginConfiguration
public interface IAppConfiguration : IConfiguration<AppConfigData>, ILoginConfiguration
public class AppConfiguration : ConfigurationBase<AppConfigData>, IAppConfiguration
請注意,配置數據元素的繼承方案是ConfigData
→ GeneralConfigData
→ LoginConfigData
→ AppConfigData
。 配置數據元素只是在每個子項中公開更多特定於登錄/應用程序等的屬性(如Username
或StartUri
)。
現在,我可以在我的所有模塊中使用這個配置概念。 就依賴注入而言,解析IGeneralConfiguration
、 ILoginConfiguration
或IAppConfiguration
將產生完全相同的實例。 不過,現在一般的模塊只需要解決IGeneralConfiguration
,模塊的具體登錄只需要決心ILoginConfiguration
,並應用特定的模塊可以解決IAppConfiugration
,都使他們能夠訪問他們的配置數據的特定的部分,他們正試圖關注處理。 這種模塊化允許我創建較小的側應用程序,這些應用程序可以重用主應用程序中的模塊,而無需進行大量自定義編碼(例如,我可以重用登錄模塊而無需引用特定於應用程序的模塊),只要我稍微改變我的依賴注冊。
如果到目前為止你仍然和我在一起,這個模型的唯一問題是在我的所有子類中(從ConfigurationBase<T>
繼承),它們都需要來自它們上面的接口的ConfigData()
實現。 這意味着class LoginConfiguration
需要public GeneralConfigData GetConfig()
的方法定義,而class AppConfiguration
需要public GeneralConfigData GetConfig()
和LoginConfigData GetConfig()
的方法定義。
如此精細。 我這樣做。 現在,在我的應用程序特定模塊中,我收到編譯器錯誤。 在我的類字段定義中,我有private IAppConfiguration _appConfiguration;
. 后來在一個方法中,我引用了它:
var element = _appConfiguration.GetConfig().AppSpecificConfigElement;
編譯器一頭霧水,說
調用在以下或屬性 'IConfiguration.GetConfig()' 和 'IConfiguration.GetConfig()' 之間不明確
為什么不編譯器看到類型是IAppConfiguration
並定義調用GetConfig()
到AppConfiguration
的GetConfig()
其中T
定義為AppConfigData
)?
是否有明顯的方法可以使用我的方案消除對GetConfig()
的調用的歧義?
如果我理解正確,那么您剛剛所做的是您有兩個具有相同簽名的方法,除了無法自動解析的返回值。 編譯器不會(也不能)遍歷從ConfigData
派生的所有子類來確定AppSpecificConfigElement
屬於AppConfiguration
並基於此選擇重載 - 即使這樣做了,您也可以擁有多個具有AppSpecificConfigElement
屬性的類,因此它不會更明智。 你需要幫助編譯器知道你需要什么,通過輸入_appConfiguration
適當的類型或使用的類型后裔ConfigData
而不是var
先在你的語句,然后獲取屬性。
在這兩種情況下,我認為您嚴重過度設計,我建議退后一步重新考慮您的方法。 正如@zaitsman 所說,這些對象應該是POCO,並且具有不同的加載器(DB、文件系統等),實現簡單的Load
/ Save
接口,然后可以根據上下文將其傳遞給 DI。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.