0

app.config または web.config で構成できるパラメーターに従って動作するいくつかのクラスを含むプロジェクトがあります。

プロジェクト/クラスは、Windows アプリ環境と同様に Web 環境でも対話します。問題は、app.config と web.config のどちらを読み取る必要があるかを知るために、プロジェクトのタイプをどのように検出できるかということです。

現時点では、データをロードする 2 つのクラスがあります。1 つは Web で、もう 1 つは Windows アプリです。どちらを使用するかを決定する単一のものを作成するにはどうすればよいですか? どちらか一方を使用するようにコードを変更する必要があり、それは共通クラスの保守に影響を与えます。

クラスを参照として添付しています:

namespace MyAppSetting.Windows
{
    public class MyGetConfig
    {
        private static Assembly currentAssembly = Assembly.GetCallingAssembly();
        private static Configuration FileAppConfig = ConfigurationManager.OpenExeConfiguration(AppDomain.CurrentDomain.BaseDirectory + AppDomain.CurrentDomain.FriendlyName.Replace(".svhost", ""));
        private static AppSettingsSection App_Config = FileAppConfig.AppSettings;

        public static string getValue(string Key, string DefaultValue = "")
        {
            // If it's null it doesn't exist ... if it's not null and Update Default if it's blank And there is a default value, and the config is blank
            if (App_Config.Settings[Key] == null || App_Config.Settings[Key].Value == null || App_Config.Settings[Key].Value.Trim() == "")
                return DefaultValue;
            return App_Config.Settings[Key].Value;
        }
    }
}

namespace MyAppSetting.Web
{
    public class MyGetConfig
    {
        private static System.Collections.Specialized.NameValueCollection App_Config = System.Web.Configuration.WebConfigurationManager.AppSettings;

        public static string getValue(string Key, string DefaultValue = "")
        {
            // If it's null it doesn't exist ... if it's not null and Update Default if it's blank And there is a default value, and the config is blank
            if (App_Config[Key] == null || App_Config[Key].Trim() == "")
                return DefaultValue;
            else
                return App_Config[Key];
        }
    }
}

私の解決策

私の最終的な解決策はこれです:

    #region Win App Resources 4 Read Configuration
    private static Configuration FileAppConfig = null;
    private static AppSettingsSection winApp_Config = null; 
    #endregion Win App Resources 4 Read Configuration

    #region WEB App Resources 4 Read Configuration
    private static System.Collections.Specialized.NameValueCollection webApp_Config = null;
    #endregion WEB App Resources 4 Read Configuration

    public static void Inicialize()
    {
        FileAppConfig = null;
        winApp_Config = null;
        webApp_Config = null;
        try
        {
            FileAppConfig = ConfigurationManager.OpenExeConfiguration(AppDomain.CurrentDomain.BaseDirectory + AppDomain.CurrentDomain.FriendlyName.Replace(".vshost", ""));
            winApp_Config = FileAppConfig.AppSettings;
            TipoDeApp = TipoApp.Win;
        }
        catch
        {
            try
            {
                webApp_Config = System.Web.Configuration.WebConfigurationManager.AppSettings;
                TipoDeApp = TipoApp.Web;
            }
            catch { TipoDeApp = TipoApp.Desconocido; }
        }
    }

そして次... XMLDocument による設定の読み取り.... ( XML リーダーを使用した構成ファイルの読み取りに基づく)

    public static string getValueFromSection(string Key, string DefaultValue = "", string Section = "appSettings")
    {
        Section = Section.Trim() == "" ? "appSettings" : Section.Trim();
        try
        {
            var dic = new Dictionary<string, string>();

            if (AllwaysLoadFromConfigFile || FileAppConfig == null)
                Inicialize();

            // Idea original: https://stackoverflow.com/questions/3868179/read-config-file-using-xml-reader
            XmlDocument xdoc = new XmlDocument();

            if (TipoDeApp == TipoApp.Win)
                xdoc.Load(FileAppConfig.FilePath);
            else if (TipoDeApp == TipoApp.Web)
                xdoc.Load(AppDomain.CurrentDomain.BaseDirectory + "web.config");
            else
                return DefaultValue;

            foreach (XmlNode node in xdoc.SelectSingleNode("/configuration/" + Section))
                if ((node.NodeType != XmlNodeType.Comment) && node.Attributes["key"] != null && node.Attributes["key"].Value != null)
                    if (!dic.ContainsKey(node.Attributes["key"].Value.ToUpper()))
                        dic.Add(node.Attributes["key"].Value.ToUpper(), node.Attributes["value"] == null || node.Attributes["value"].Value == null ? "" : node.Attributes["value"].Value);
                    else
                        dic[node.Attributes["key"].Value.ToUpper()] = node.Attributes["value"] == null || node.Attributes["value"].Value == null ? "" : node.Attributes["value"].Value;

            if (dic != null && dic[Key.ToUpper()] != null)
                return dic[Key.ToUpper()];
        }
        catch { }
        return DefaultValue;
    }

そして最後に、私の構成ファイルは次のとおりです。

  <configSections>
    <sectionGroup name="MySectionGroup">
      <section name="MySection1" type="System.Configuration.NameValueSectionHandler" />
      <section name="MySection1" type="System.Configuration.NameValueSectionHandler" />
    </sectionGroup>
  </configSections>

  <MySectionGroup>
    <MySection1>
      <add key="MyParam1" value="Hello" />
      <add key="MyParam2" value="3.1416" />
    </MySection1>
    <MySection2>
      <add key="MyParam1" value="true" />
      <add key="MyParam2" value="Another value" />
    </MySection2>
  </MySectionGroup>
4

1 に答える 1

1

現在のプロジェクトの種類を知る必要はありません。アプリの設定を次のように参照するだけです。

  ConfigurationManager.AppSettings["key"]

これは、Web アプリとデスクトップ アプリケーションの両方で同じように機能します。

于 2013-03-08T08:13:07.920 に答える