簡體   English   中英

使用帶有泛型類型類的繼承的意外方法暴露

[英]Unintended method exposure using inheritance with a generics typed class

我盡力了標題。 我想要完成的是具有依賴注入的分層模塊化。 這種設計模式是否好是另一個論壇的問題。

因為我使用依賴注入,所以我有接口/實現對。 這是頂級界面:

public interface IConfiguration<T> where T : ConfigData
{
    T GetConfig();
}

其中ConfigData是一個簡單的類,它公開get / set屬性,如LogLevelEnvironment

有一個接口的基本實現:

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

請注意,配置數據元素的繼承方案是ConfigDataGeneralConfigDataLoginConfigDataAppConfigData 配置數據元素只是在每個子項中公開更多特定於登錄/應用程序等的屬性(如UsernameStartUri )。

現在,我可以在我的所有模塊中使用這個配置概念。 就依賴注入而言,解析IGeneralConfigurationILoginConfigurationIAppConfiguration產生完全相同的實例 不過,現在一般的模塊只需要解決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()AppConfigurationGetConfig()其中T定義為AppConfigData )?

是否有明顯的方法可以使用我的方案消除對GetConfig()的調用的歧義?

如果我理解正確,那么您剛剛所做的是您有兩個具有相同簽名的方法,除了無法自動解析的返回值。 編譯器不會(也不能)遍歷從ConfigData派生的所有子類來確定AppSpecificConfigElement屬於AppConfiguration並基於此選擇重載 - 即使這樣做了,您也可以擁有多個具有AppSpecificConfigElement屬性的類,因此它不會更明智。 你需要幫助編譯器知道你需要什么,通過輸入_appConfiguration適當的類型或使用的類型后裔ConfigData而不是var先在你的語句,然后獲取屬性。

在這兩種情況下,我認為您嚴重過度設計,我建議退后一步重新考慮您的方法。 正如@zaitsman 所說,這些對象應該是POCO,並且具有不同的加載器(DB、文件系統等),實現簡單的Load / Save接口,然后可以根據上下文將其傳遞給 DI。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM