Maison  >  Article  >  développement back-end  >  Exemple de partage de code d'un programme de configuration dynamique XML personnalisé

Exemple de partage de code d'un programme de configuration dynamique XML personnalisé

黄舟
黄舟original
2017-03-22 16:46:371844parcourir

Vue d'ensemble

1 Lors du développement de programmes, nous utilisons souvent les deux modules de base suivants

1> ;

2> Lors du développement basé sur un développement basé sur une table, une certaine logique de jugement est placée dans les données de la table

2 Parmi ces deux applications de base, nous avons les exigences suivantes :

1> Pour être géré de manière centralisée;

2> Pour être configurable, c'est-à-dire pour modifier les paramètres sans redémarrer le système;

Pour être facile à utiliser;

Fonctions principales du programme

1> Définir les paramètres de base du programme, tels que les paramètres de pagination, les paramètres de courrier électronique, etc.

----Ajouter automatiquement la configuration ; informations en XML à l'entité correspondante.

2> Lors du développement basé sur un développement basé sur une table, une certaine logique de jugement est placée dans les données de la table

----Charger automatiquement les données de dictionnaire en XML dans l'entité correspondante ; Cependant, cette méthode doit continuer à être optimisée. Désormais, elle ne prend en charge que le chargement du dictionnaire et doit prendre en charge des structures plus complexes.

Code principal

1 Définissez d'abord, référencez l'entité dans le code.

Exemple

public class AppSetting
{
    public string PageSize;
    public string WebUrl;
 
    public Dictionary<string, string> IsPartialPayment;
    public Dictionary<string, string> EntityCurrency;
}
2 Définir le fichier XML correspondant. Parmi eux, les informations de configuration de base du programme sont configurées sous le nœud 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 Enfin, un morceau de code de chargement XML est nécessaire pour charger les informations de configuration XML en 2 dans l'entité en 1.

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);
        }
    }
Effet final

1 Lorsque le programme est exécuté pour la première fois, les informations de configuration correspondantes sont affichées

Exemple de partage de code dun programme de configuration dynamique XML personnalisé

2 Lorsque la pièce modifiée Lors de la modification des paramètres, les dernières informations peuvent être obtenues sans redémarrer. A noter qu'après avoir modifié les paramètres pendant 3 secondes, actualisez la page

Exemple de partage de code dun programme de configuration dynamique XML personnalisé

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn