ホームページ  >  記事  >  バックエンド開発  >  カスタム XML 動的構成プログラムのサンプル コード共有

カスタム XML 動的構成プログラムのサンプル コード共有

黄舟
黄舟オリジナル
2017-03-22 16:46:371892ブラウズ

概要

1 プログラム開発を行う際には、次の 2 つの基本モジュールをよく使用します

1> ページングパラメータ、メールパラメータなどのプログラムの基本パラメータを設定します

2> -駆動型開発、つまり、テーブル データに判断ロジックを組み込む

2 これら 2 つの基本的なアプリケーションには、次の要件があります。

1> 構成可能であること。 、システムケースを再起動せずに、パラメータを変更します。

3> 使い方は簡単です。

プログラムの主な機能

1> ページングパラメータ、電子メールパラメータなどのプログラムの基本パラメータを設定します。

----対応するエンティティにXMLの構成情報を自動的に追加します。

2> テーブル駆動開発に基づいて開発する場合、テーブルデータにいくつかの判定ロジックが配置されます。

----XML 内の Dctionary データを対応するエンティティに自動的にロードします。ただし、このメソッドは引き続き最適化する必要があり、現在は辞書のロードのみをサポートしており、より複雑な構造をサポートする必要があります。

メインコード

1 まず、コード内でエンティティを定義し、参照します。

Example

public class AppSetting
{
    public string PageSize;
    public string WebUrl;
 
    public Dictionary<string, string> IsPartialPayment;
    public Dictionary<string, string> EntityCurrency;
}

2 は、対応する XML ファイルを定義します。 このうち、プログラムの基本的な構成情報は、AppSettings

ノードの下に設定されます。

<?xml version="1.0" encoding="utf-8" ?>
<settings>
  <DictSettings>
    <Dict name="AppSettings" >
      <add key="PageSize" value="2"></add>
      <add key="WebUrl" value="www.baidu.com"></add>
    </Dict>
    <Dict name="IsPartialPayment">
      <add key="TTPART" value="true"></add>
      <add key="TT50/50" value="true"></add>
    </Dict>
    <Dict name="EntityCurrency">
      <add key="China" value="CNY"></add>
      <add key="HQ" value="USD"></add>
      <add key="Default" value="USD"></add>
    </Dict>
  </DictSettings>
</settings>

3 最後に、2 の XML 構成情報を 1 のエンティティにロードするには、XML ロード コードの一部が必要です。

public static class ConfigManager
    {
        public static AppSetting AppSetting;
        private static string xmlPath;
 
        public static Dictionary<string, Dictionary<string, string>> DictAppSettings = new Dictionary<string, Dictionary<string, string>>();
        static ConfigManager()
        {
            xmlPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory.ToString(), "AppConfig.xml");
            LoadSettings(xmlPath);
        }
 
        private static void LoadSettings(string path)
        {
            DictAppSettings.Clear();
            //加载XML中所有的key,value,并转换成Dictionary对象
            XmlNode dictRootNode = FileHelper.GetXMLNode(path, "/settings/DictSettings");
            foreach (XmlNode dictType in dictRootNode.ChildNodes)
            {
                Dictionary<string, string> dict = new Dictionary<string, string>();
                foreach (XmlNode dictItem in dictType.ChildNodes)
                {
                    dict.Add(dictItem.Attributes["key"].Value.Trim(), dictItem.Attributes["value"].Value.Trim());
                }
                DictAppSettings.Add(dictType.Attributes["name"].Value.Trim(), dict);
            }
 
            //将Dictionary 对象转换成实体的字段和对应dctionary上
            var serializer = new JavaScriptSerializer();
            //将AppSettings转成json
            string jAppSetting = serializer.Serialize(DictAppSettings["AppSettings"]);
            DictAppSettings.Remove("AppSettings");
            //将除AppSettings中的信息转成json
            string jDict = serializer.Serialize(DictAppSettings);
            //将AppSettings和其它的Dictionary 加载到对应的实体中去。
            string json = string.Format("{0},{1}", jAppSetting.Remove(jAppSetting.Length - 1), jDict.Remove(0, 1));
            AppSetting = serializer.Deserialize<AppSetting>(json);
 
            //当修改文件时,重新加载XML
            FileHelper.CacheDependencyFile(path, CacheRemovedCallback);
        }
 
        private static void CacheRemovedCallback(string key, object value, CacheItemRemovedReason reason)
        {
            //此方法来自Fish.Li
            string xmlFilePath = (string)value;
 
            // 由于事件发生时,文件可能还没有完全关闭,所以只好让程序稍等。
            System.Threading.Thread.Sleep(3000);
 
            LoadSettings(xmlFilePath);
        }
    }
 
    public static class FileHelper
    {
        public static XmlNode GetXMLNode(string path, string xPath)
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(path);
            return xmlDoc.SelectSingleNode(xPath);
        }
 
        public static void CacheDependencyFile(string path, CacheItemRemovedCallback removedCallback)
        {
            CacheDependency dep = new CacheDependency(path);
            HttpRuntime.Cache.Insert(Guid.NewGuid().ToString(), path, dep,
                Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, removedCallback);
        }
    }

最終的な効果

1 プログラムの初回実行時に、対応する設定情報が出力されます

カスタム XML 動的構成プログラムのサンプル コード共有2 一部のパラメータが変更された場合、再起動せずに最新の情報を取得できます。パラメータを 3 秒間変更した後、ページを更新してください

以上がカスタム XML 動的構成プログラムのサンプル コード共有の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。