Normalment faig servir el fitxer de configuració de .NET de torn, el web.config o el que toqui. Però cada cop més em trobo amb que no puc posar allí, d'una forma fàcil i entenedora els valors que vull fer servir en una aplicació. I sempre amb por de si trencaré algun punt vital, o si ho posaré correctament...
Per aquests motius he fet la classe clsConfig. Aquí puc guardar els ajustos ("settings") de l'aplicació. Es tracta de posar un fitxer XML "config.xml" amb els valors dins de la següent forma:
<?xml version='1.0'?>
<root>
<element>
<name>CadConn</name>
<value>Data Source=NNNNNN;Initial Catalog=Blog;User Id=sa;Password=mmmmmm;</value>
</element>
<element>
<name>PathImgs</name>
<value>PostImages</value>
</element>
<element>
<name>AlgunAltraAjust</name>
<value>AlgunValor</value>
</element>
</root>
Després cal una classe per llegir aquest fitxer. La clsConfig també permet grabar-hi valors, per exemple en una aplicació d'escriptori que fa servir carpetes és habitual guardar la carpeta que fa servir l'usuari (el valor de l'últim cop que l'ha fet servir). A continuació el codi corresponent:
public class clsConfig
{
private Dictionary<string, string> Config = new Dictionary<string, string>();
public readonly string FitxerConfiguracio = "config.xml";
public bool Error { get; set; }
public string txtError { get; set; }
public clsConfig(string pFitxerConfiguracio)
{
if(!string.IsNullOrEmpty(pFitxerConfiguracio)) FitxerConfiguracio = pFitxerConfiguracio;
}
public string Ver()
{
return "1.3 - 20/05/2013";
}
public string GetVal(string Name)
{
string Valor = "";
if (Config.ContainsKey(Name))
{
Valor = Config[Name];
Error = false;
txtError = "";
}
else
{
Valor = "";
Error = true;
txtError = "'" + Name + "' no encontrado en la configuración";
}
return Valor;
}
public void SetVal(string Name, string Value)
{
if (Config.ContainsKey(Name))
{
Config[Name] = Value;
Error = false;
txtError = "";
}
else
{
Error = true;
txtError = "'" + Name + "' no encontrado en la configuración";
}
}
public void CreateVal(string Name, string Value)
{
if (Config.ContainsKey(Name))
{
Error = true;
txtError = "'" + Name + "' ya creado en la configuración";
}
else
{
Config.Add(Name, Value);
}
}
public void Save()
{
string path = Application.ExecutablePath;
XmlDocument Doc = new XmlDocument();
XmlNode Root;
XmlNode Element;
XmlNode Nom;
XmlNode Valor;
Doc.LoadXml("<?xml version=\"1.0\" standalone=\"yes\"?><root></root>");
Root = Doc.SelectSingleNode("descendant::root");
foreach (KeyValuePair<String, String> Param in Config)
{
Element = Doc.CreateNode(XmlNodeType.Element, "element", "");
Nom = Doc.CreateNode(XmlNodeType.Element, "name", "");
Valor = Doc.CreateNode(XmlNodeType.Element, "value", "");
Nom.InnerText = Param.Key;
Valor.InnerText = Param.Value;
Element.AppendChild(Nom);
Element.AppendChild(Valor);
Root.AppendChild(Element);
}
path = Path.GetDirectoryName(path);
path += "\\" + FitxerConfiguracio;
Doc.Save(path);
}
public void Initialize()
{
string path = Application.ExecutablePath;
XmlDocument XMLDoc = new XmlDocument();
XmlNodeList Nodes;
XmlNode Node;
string Nom = "", Valor = "";
try
{
Error = false;
txtError = "";
path = Path.GetDirectoryName(path);
path += "\\" + FitxerConfiguracio;
XMLDoc.Load(path);
Nodes = XMLDoc.SelectNodes("descendant::element");
if (Nodes != null)
{
foreach (XmlNode N in Nodes)
{
Node = N.SelectSingleNode("descendant::name");
if (Node != null) Nom = Node.InnerText;
else Nom = "";
Node = N.SelectSingleNode("descendant::value");
if (Node != null) Valor = Node.InnerText;
else Valor = "";
Config.Add(Nom, Valor);
}
}
}
catch (Exception E)
{
txtError = E.Message;
Error = true;
}
}
}
Després es fa servir així:
clsConfig Conf = new clsConfig();
Conf.Initialize();
CadConn = Conf.GetVal("CadConn");
|