<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>The World is mine &#187; xml</title>
	<atom:link href="http://grozeille.com/tag/xml/feed/" rel="self" type="application/rss+xml" />
	<link>http://grozeille.com</link>
	<description>Just another Wordpress.com weblog</description>
	<lastBuildDate>Sat, 07 Jan 2012 12:00:31 +0000</lastBuildDate>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='grozeille.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>The World is mine &#187; xml</title>
		<link>http://grozeille.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://grozeille.com/osd.xml" title="The World is mine" />
	<atom:link rel='hub' href='http://grozeille.com/?pushpress=hub'/>
		<item>
		<title>Les Settings en .Net</title>
		<link>http://grozeille.com/2008/06/08/les-settings-en-net/</link>
		<comments>http://grozeille.com/2008/06/08/les-settings-en-net/#comments</comments>
		<pubDate>Sun, 08 Jun 2008 17:33:32 +0000</pubDate>
		<dc:creator>Mathias Kluba</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[settings]]></category>
		<category><![CDATA[Spring.net]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://grozeille.wordpress.com/?p=60</guid>
		<description><![CDATA[La plateforme .Net fournit un mécanisme pour gérer les paramétrages. Il en existe 2 types : ceux de l&#8217;application et ceux de l&#8217;utilisateur. Au début de l&#8217;existance, il y avait la bonne vielle méthode du fichier *.ini, mais aujourd&#8217;hui le XML et devenu LE standard pour écrire des données dans un fichier &#8220;lisible&#8221; et structuré. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&amp;blog=173450&amp;post=60&amp;subd=grozeille&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>La plateforme .Net fournit un mécanisme pour gérer les paramétrages. Il en existe 2 types : ceux de l&#8217;application et ceux de l&#8217;utilisateur. Au début de l&#8217;existance, il y avait la bonne vielle méthode du fichier *.ini, mais aujourd&#8217;hui le XML et devenu LE standard pour écrire des données dans un fichier &#8220;lisible&#8221; et structuré.</p>
<p>Il existe un autre standard : les applications .Net possède un fichier &#8220;mon_application.exe.config&#8221; qui n&#8217;est autre qu&#8217;un XML contenant le paramétrage de l&#8217;appliation. Ce fichier est structuré en 2 grosses parties: l&#8217;entête avec la section &#8220;configSections&#8221; qui décrit les sections du XML et les &#8220;parser&#8221; qui vont lire ces dernières. Puis il y a les sections proprement dites.<br />
<span id="more-60"></span></p>
<p>Quand on veut utiliser des settings de l&#8217;application de type &#8220;clef=valeur&#8221;, on peut les renseigner dans la section &#8220;applicationSettings&#8221;. On peut ainsi facilement créer un paramétrage de l&#8217;application mais aussi pour chaque utilisateur à l&#8217;aide de la section &#8220;userSettings&#8221;.<br />
Voici un exemple de paramétrage:</p>
<p><pre class="brush: xml;">
&lt;userSettings&gt;
	&lt;MonApp.Settings&gt;
		&lt;setting name=&quot;PreferredLanguage&quot; serializeAs=&quot;String&quot;&gt;
			&lt;value&gt;fr-FR&lt;/value&gt;
		&lt;/setting&gt;
	&lt;/MonApp.Settings&gt;
&lt;/userSettings&gt;
&lt;applicationSettings&gt;
	&lt;MonApp.Settings&gt;
		&lt;setting name=&quot;TimeShowMsg&quot; serializeAs=&quot;String&quot;&gt;
			&lt;value&gt;5&lt;/value&gt;
		&lt;/setting&gt;
		&lt;setting name=&quot;NotepadPath&quot; serializeAs=&quot;String&quot;&gt;
			&lt;value&gt;c:\windows\notepad.exe&lt;/value&gt;
		&lt;/setting&gt;
	&lt;/MonApp.Settings&gt;
&lt;/applicationSettings&gt;
</pre></p>
<p>VisualStudio propose une technique simple pour manipuler ces paramétrage. Il permet de créer un fichier &#8220;.settings&#8221; qui va tout simplement générer une classe pour accéder à tout ça, et qui va aussi permettre de sauvegarder les settings de l&#8217;utilisateur courant (dans un .config séparé dans C:\Documents and Settings\UserName\Local Settings\AppName\).<br />
<pre class="brush: csharp;">
// on récupère la valeur d'une clef très simplement
String value = Settings.Default.MyKey;
// si elle a comme scope &quot;user&quot;, on peut la modifier et la sauvegarder
Settings.Default.MyKey= value;
Settings.Default.Save();
</pre></p>
<p>Pour ma part, j&#8217;utilise massivement Spring.net et ses XML. Mes objets possèdent souvent des attributs qui ressemble à des paramètres (j&#8217;externalise au maximum). De plus, Spring.net propose de référencer d&#8217;autre XML, ce qui me permet de découper mon paramétrage en plusieurs fichiers pour différent domaine (Logging, Base de données, etc).<br />
<pre class="brush: xml;">
&lt;!-- dans le App.config --&gt;
&lt;objects xmlns=&quot;http://www.springframework.net&quot;&gt;
  &lt;import resource=&quot;logging.xml&quot;/&gt;
  &lt;import resource=&quot;database.xml&quot;/&gt;;
  &lt;import resource=&quot;general.xml&quot;/&gt;
&lt;/objects&gt;
</pre><br />
<pre class="brush: xml;">
&lt;!-- dans general.xml --&gt;
&lt;objects xmlns=&quot;http://www.springframework.net&quot;&gt;
  &lt;object id=&quot;Setting&quot; type=&quot;MonApp.Setting, MonApp&quot;&gt;
    &lt;property name=&quot;Timeout&quot; value=&quot;100&quot;/&gt;
  &lt;/object&gt;
&lt;/objects&gt;
</pre><br />
Mais il est vrai qu&#8217;un XML de Spring n&#8217;est pas facile à lire, car il ressemble à un code C# avec une suite de construction de classes. Il peut devenir vite complexe s&#8217;il y a beaucoup de classes de relations entre eux, ou si on utilise des concepts avancés de Spring.net (ObjectFactory par exemple).</p>
<p>Une des solutions les plus élégante pour un public informaticien, est de créer ses propres balises XML Spring.net, comme celles déjà existantes (Exemple: <a href="http://www.springframework.net/doc-latest/reference/html/dbprovider.html#d0e11738">paramétrage de base de données</a>.) On masque ainsi la complexité de la construction du programme en laissant une grande souplesse. Mais cette solution demande un certain effort dans la réalisation du parser XML.<br />
<pre class="brush: xml;">
&lt;objects xmlns='http://www.springframework.net'
             xmlns:custom=&quot;http://www.grozeillle.com/custom&quot;&gt;
  &lt;custom:Setting timeout=&quot;100&quot;&gt;
    &lt;custom:EmbededSetting name=&quot;Default&quot;&gt;
      &lt;!-- autres settings --&gt;
    &lt;/custom:EmbededSetting/&gt;
  &lt;/custom:Setting&gt;
&lt;/objects&gt;
</pre><br />
Mais ces fichiers de paramétrages restent difficiles à lire pour une personne non-informaticienne, qui n&#8217;a pas besoin de savoir comment le programme est construit. Dans ce cas, on externalise des valeurs dans des fichiers &#8220;.properties&#8221; très lisible puisque c&#8217;est une simple fichier texte avec une liste de couples &#8220;clef=valeur&#8221;. On peut aussi externaliser ces couples dans une XML mais on perd l&#8217;intérêt d&#8217;avoir quelque chose de très facile à lire.<br />
<pre class="brush: xml;">
&lt;objects xmlns='http://www.springframework.net'&gt;
&lt;!-- Cet objet contient une liste de &quot;fournisseur&quot; de paramétres--&gt;
  &lt;object type=&quot;Spring.Objects.Factory.Config.VariablePlaceholderConfigurer, Spring.Core&quot;&gt;
	&lt;property name=&quot;VariableSources&quot;&gt;
	  &lt;list&gt;
		&lt;!-- Nous n'avons ici qu'un seul fournisseur, 
			qui va chercher les paramétrages dans un fichier .properties --&gt;
		&lt;object type=&quot;Spring.Objects.Factory.Config.PropertyFileVariableSource, Spring.Core&quot;&gt;
		  &lt;!- la liste de nos fichiers .properties --&gt;
		  &lt;property name=&quot;Locations&quot;&gt;
			&lt;list&gt;
			  &lt;value&gt;config.properties&lt;/value&gt;
			&lt;/list&gt;
		  &lt;/property&gt;
		&lt;/object&gt;
	  &lt;/list&gt;
	&lt;/property&gt;
  &lt;/object&gt;
&lt;/objects&gt;
</pre></p>
<p>On peut ainsi utiliser des variables comme ceci:<br />
<pre class="brush: xml;">
&lt;objects xmlns='http://www.springframework.net'&gt;
	&lt;!-- mon object de type &quot;MyTutoClass&quot; a besoin du chemin de Notepad.exe --&gt;
	&lt;object type=&quot;MyApp.MyTutoClass, MyApp&quot;&gt;
		&lt;property name=&quot;NotepadPath&quot; value=&quot;${notepad.path}&quot;&gt;
	&lt;/object&gt;
&lt;/objects&gt;
</pre></p>
<p>Mon fichier .properties ressemble simplement à ça:<br />
<pre class="brush: vb;">
;ceci est un commentaire
notepad.path=c:\windows\notepad.exe
</pre></p>
<p>Spring.net propose plusieurs méthodes de recherche de ces clef+valeur. On peut avoir comme source des fichiers &#8220;.properties&#8221;, mais aussi la section &#8220;settings&#8221; dans l&#8217;App.config (comme vu plus haut), la base de Registre, etc. Voici la liste dans la <a href="http://www.springframework.net/doc-latest/reference/html/objects.html#objects-variablesource">documentation officiel</a>. Si elle ne vous suffit pas, vous pouvez toujours créer votre &#8220;provider&#8221; vous même.</p>
<p>Enfin, pour les plus &#8220;hardcore&#8221; d&#8217;entre-vous (ceux qui aime recoder l&#8217;univers), vous pouvez aussi créer votre propre XML avec votre propre format. Il est vrai qu&#8217;on souhaite parfois faire sa propre classe &#8220;Setting&#8221; car on veut hiérarchiser les différents paramètres. Admettons que l&#8217;on veuille vraiment avoir son propre format de fichier XML, ceci reste très simple en .Net:<br />
<pre class="brush: csharp;">
// créer un &quot;serializer&quot; de Setting
XmlSerializer serializer = new XmlSerializer(typeof(Setting));
// création d'un flux sur mon fichier XML
TextWriter writer = new StreamWriter(&quot;Settings.xml&quot;);
// création de ma classe de Setting
Setting setting = new Setting();
// setting.Timeout = 5; etc, etc..
// enfin, sauvegarde de mon objet sous format XML dans le flux de mon fichier &quot;Settings.xml&quot;
serializer.Serialize(writer, setting);
</pre></p>
<p>On ne peut pas faire plus simple, non? Et vous savez quoi? Par défaut, ça marche sans rien faire d&#8217;autre. Mais si vous voulez customizer le format du XML, il suffira de décorer notre classe Setting à l&#8217;aide de quelques attributs [XmlAttribute]. Si vous voulez générer un schéma XSD de ce format XML, c&#8217;est à l&#8217;aide de <code>c:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\xsd.exe</code>.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/grozeille.wordpress.com/60/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/grozeille.wordpress.com/60/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/grozeille.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/grozeille.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/grozeille.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/grozeille.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/grozeille.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/grozeille.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/grozeille.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/grozeille.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/grozeille.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/grozeille.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/grozeille.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/grozeille.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/grozeille.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/grozeille.wordpress.com/60/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&amp;blog=173450&amp;post=60&amp;subd=grozeille&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://grozeille.com/2008/06/08/les-settings-en-net/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fcf307a3a2899d162cabfd41241f17b9?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">grozeille</media:title>
		</media:content>
	</item>
	</channel>
</rss>
