2

次のようにDLLを配布したいと思いConfigurationSectionます。

public class StandardConfiguration : ConfigurationSection
{
    public static StandardConfiguration GetInstance()
    {
        return (StandardConfiguration)ConfigurationManager.GetSection("customConfigSection");
    }

    [ConfigurationProperty("childConfig")]
    public StandardChildConfig ChildConfig
    {
        get { return (StandardChildConfig)this["childConfig"]; }
        set { this["childConfig"] = value; }
    }
}

public class StandardChildConfig : ConfigurationElement
{
    [ConfigurationProperty("p1")]
    public string P1
    {
        get { return (string)this["p1"]; }
        set { this["p1"] = value; }
    }
}

ConfigurationSectionとその子をConfigElement継承可能にしたいと思います。これは、次のようにタイプパラメータを使用して実行できます。

public class StandardConfiguration<TChildConfig> : ConfigurationSection
    where TChildConfig : StandardChildConfig
{
    [ConfigurationProperty("childConfig")]
    public TChildConfig ChildConfig
    {
        get { return (TChildConfig)this["childConfig"]; }
        set { this["childConfig"] = value; }
    }
}

public class StandardChildConfig : ConfigurationElement
{
    [ConfigurationProperty("p1")]
    public string P1
    {
        get { return (string)this["p1"]; }
        set { this["p1"] = value; }
    }
}

ただし、これにより、DLL内の他のクラスからの静的Instance参照ができなくなると思います。これは、子の最終的なタイプがわからないためConfigurationElementです。

これをよりクリーンに実装する方法についてのアイデアや提案は大歓迎です。

ありがとう。

編集

<customConfigSection>アプリケーションの構成にが含まれていると仮定すると、最初のシナリオの値にStandardConfiguration.GetInstance().ChildConfig.P1アクセスするために使用できます。P12番目のシナリオで同じ値にアクセスするにはどうすればよいですか?どのように実装しGetInstance()ますか?

編集2

以下は「ゼロコーディング」シナリオです。

<?xml version="1.0"?>
<configuration>
    <configSections>
        <section
            name="customConfig"
            type="WebsiteTemplate.Config.StandardConfigruation, WebsiteTemplate"
        />
    </configSections>
    <customConfig baseProp1="a">
        <childConfig baseProp2="b" />
    </customConfig>
</configuration>

そして、これが構成が拡張されたシナリオです。

<?xml version="1.0"?>
<configuration>
    <configSections>
        <section
            name="customConfig"
            type="WebsiteTemplate.Extended.Config.ExtendedConfigruation, WebsiteTemplate.Extended"
        />
    </configSections>
    <customConfig baseProp1="a" extendedProp1="c">
        <childConfig baseProp2="b" extendedProp2="d" />
    </customConfig>
</configuration>
4

2 に答える 2

2

2番目の例では、は一般的StandardConfiguration.GetInstance()であるため、意味がありません。StandardConfiguraitonあなたが使用する必要がありますStandardConfiguration<MyChildConfig>.GetInstance().ChildConfig.P1

あなたはこのようなことをすることができるかもしれません:

public class StandardConfigurationBase : ConfigurationSection
{
    public static StandardConfigurationBase GetInstance()
    {
        return (StandardConfigurationBase) ConfigurationManager.GetSection("customConfigSection");
    }

    [ConfigurationProperty("childConfig")]
    public StandardChildConfig ChildConfig
    {
        get { return (StandardChildConfig) this["childConfig"]; }
        set { this["childConfig"] = value; }
    }
}

public class StandardConfiguration<TChildConfig> : StandardConfigurationBase
where TChildConfig : StandardChildConfig
{
    [ConfigurationProperty("childConfig")]
    public new TChildConfig ChildConfig
    {
        get { return (TChildConfig)this["childConfig"]; }
        set { this["childConfig"] = value; }
    }
}
public class StandardChildConfig : ConfigurationElement
{
    [ConfigurationProperty("p1")]
    public string P1
    {
        get { return (string)this["p1"]; }
        set { this["p1"] = value; }
    }
}

次に、特定のタイプが不明な場合に子にアクセスします。

    StandardConfigurationBase b = new StandardConfiguration<StandardChildConfig>();
    StandardChildConfig x = StandardConfigurationBase.GetInstance().ChildConfig;

しかし、私はこれを行うことの真の価値がわかりません。

于 2013-01-29T20:02:21.900 に答える
1

私の質問に対する「答え」は、基本構成を型パラメーターとインターフェースを持つ抽象クラスに分割することです。

以下に、BaseLib.dllで定義されているものを示します。デフォルト構成とデフォルトの子構成があります。

インターフェイスとabsractクラス

public interface IAppConfig
{
    string AppProp1 { get; }
    SubConfig SubConfig { get; }
}

public abstract class BaseAppConfig<TSubConfig> : ConfigurationSection, IAppConfig
    where TSubConfig : SubConfig
{
    [ConfigurationProperty("appProp1")]
    public string AppProp1
    {
        get { return (string)this["appProp1"]; }
        set { this["appProp1"] = value; }
    }

    [ConfigurationProperty("subConfig")]
    public TSubConfig SubConfig
    {
        get { return (TSubConfig)this["subConfig"]; }
        set { this["subConfig"] = value; }
    }

    // Implement the interface
    string IAppConfig.AppProp1 { get { return this.AppProp1; } }
    SubConfig IAppConfig.SubConfig { get { return this.SubConfig; } }
}

デフォルトの実装

public class AppConfig : BaseAppConfig<SubConfig>
{
    const string SECTION_KEY = "AppConfig";

    public static IAppConfig Instance
    {
        get { return (IAppConfig)ConfigurationManager.GetSection(SECTION_KEY); }
    }
}

public class SubConfig : ConfigurationElement
{
    [ConfigurationProperty("supProp1")]
    public string SubProp1
    {
        get { return (string)this["supProp1"]; }
        set { this["supProp1"] = value; }
    }
}

BaseLib.dllから構成にアクセスする方法

public class ArbitraryClass
{
    void DoSometing()
    {
        Console.Write(AppConfig.Instance.SubConfig.SubProp1);
    }
}

以下に、ExtLib.dllで定義されているものを示します。構成と子構成の両方が拡張されます。

拡張された実装

public class ExtAppConfig : BaseAppConfig<ExtSubConfig>
{
    public static ExtAppConfig Instance
    {
        get { return (ExtAppConfig)AppConfig.Instance; }
    }

    [ConfigurationProperty("extAppProp1")]
    public string ExtAppProp1
    {
        get { return (string)this["extAppProp1"]; }
        set { this["extAppProp1"] = value; }
    }
}

public class ExtSubConfig : SubConfig
{
    [ConfigurationProperty("extSubProp1")]
    public string ExtSubProp1
    {
        get { return (string)this["extSubProp1"]; }
        set { this["extSubProp1"] = value; }
    }
}

ExtLib.dllから構成にアクセスする方法

public class ExtArbitraryClass
{
    void DoSometing()
    {
        Console.Write(ExtAppConfig.Instance.SubConfig.ExtSubProp1);
    }
}

ライブラリにはもう少し定義がありますが、この構成を比較的簡単に拡張できるはずです。

于 2013-02-20T22:47:26.083 に答える