<?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/"
	>

<channel>
	<title>Benjamin Devuyst &#187; DotNet &#8211; .net</title>
	<atom:link href="https://blog.developpez.com/bdevuyst/pcategory/dotnet-net/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/bdevuyst</link>
	<description>:)</description>
	<lastBuildDate>Mon, 16 Mar 2020 06:57:16 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Server Sent Event &#8211; implémentation simple en c#</title>
		<link>https://blog.developpez.com/bdevuyst/p13191/dotnet-net/server-sent-event-implementation-csharp</link>
		<comments>https://blog.developpez.com/bdevuyst/p13191/dotnet-net/server-sent-event-implementation-csharp#comments</comments>
		<pubDate>Mon, 16 Mar 2020 06:57:16 +0000</pubDate>
		<dc:creator><![CDATA[benji_dv]]></dc:creator>
				<category><![CDATA[DotNet - .net]]></category>
		<category><![CDATA[Sources]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/bdevuyst/?p=197</guid>
		<description><![CDATA[Il arrive que l&#8217;on ai besoin de permettre à un backend de notifier une app cliente (push). Pour ce faire, dotnet met à notre disposition SignalR. Or, si les contraintes techniques ne permettent pas de le mettre en oeuvre (ou si votre idéologie est contre), la solution du Server Sent Event peut être un candidat solide. En effet, SSE est : &#8211; Léger &#8211; Simple à mettre en oeuvre (client ou server) &#8211; Interopérable (java [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Il arrive que l&rsquo;on ai besoin de permettre à un backend de notifier une app cliente (push).<br />
Pour ce faire, dotnet met à notre disposition SignalR.<br />
Or, si les contraintes techniques ne permettent pas de le mettre en oeuvre (ou si votre idéologie est contre), la solution du Server Sent Event peut être un candidat solide.</p>
<p>En effet, SSE est :<br />
&#8211; Léger<br />
&#8211; Simple à mettre en oeuvre (client ou server)<br />
&#8211; Interopérable (java / dotnet dans mon cas)<br />
&#8211; Transparent sur le réseau (ne nécessite que http)</p>
<p>Le lien suivant vous permet de disposer d&rsquo;une implémentation simple en C# de SSE&#8230;</p>
<p>https://github.com/benjamin-devuyst/dotnet.serversentevents.client/tree/master/Foxrough.ServerSentEvents.Client/</p>
<p>Plus d&rsquo;infos sur SSE : https://medium.com/conectric-networks/a-look-at-server-sent-events-54a77f8d6ff7</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TFS Build outputs par projet</title>
		<link>https://blog.developpez.com/bdevuyst/p12842/dotnet-net/tfs-build-outputs-par-projet</link>
		<comments>https://blog.developpez.com/bdevuyst/p12842/dotnet-net/tfs-build-outputs-par-projet#comments</comments>
		<pubDate>Tue, 10 Mar 2015 10:47:44 +0000</pubDate>
		<dc:creator><![CDATA[benji_dv]]></dc:creator>
				<category><![CDATA[DotNet - .net]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/bdevuyst/?p=190</guid>
		<description><![CDATA[Par défaut, TFS génère ses outputs dans un répertoire commun à tous les projets d&#8217;une solution. Si vous souhaitez disposer des outputs par projet, il vous faut ajouter : /p:GenerateProjectSpecificOutputFolder=true à la ligne de commande MSBuild. Cela peut s&#8217;ajouter dans les configurations de build TFS : Attention : cela ne fonctionne qu&#8217;avec MSBuild du Framework 4.5 ! Enjoy]]></description>
				<content:encoded><![CDATA[<p>Par défaut, TFS génère ses outputs dans un répertoire commun à tous les projets d&rsquo;une solution.</p>
<p>Si vous souhaitez disposer des outputs par projet, il vous faut ajouter : <strong>/p:GenerateProjectSpecificOutputFolder=true</strong> à la ligne de commande MSBuild.</p>
<p>Cela peut s&rsquo;ajouter dans les configurations de build TFS :<br />
<img src="http://blog.developpez.com/bdevuyst/files/2015/03/TFS2013-Builds-MSBuildArgs.png" alt="TFS2013-Builds-MSBuildArgs" /></p>
<p><strong>Attention</strong> : cela ne fonctionne qu&rsquo;avec MSBuild du Framework 4.5 !</p>
<p>Enjoy</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Génération de packages ClickOnce au sein de TFS Build</title>
		<link>https://blog.developpez.com/bdevuyst/p12078/dotnet-net/generation-de-packages-clickonce-au-sein-de-tfs-build</link>
		<comments>https://blog.developpez.com/bdevuyst/p12078/dotnet-net/generation-de-packages-clickonce-au-sein-de-tfs-build#comments</comments>
		<pubDate>Fri, 21 Jun 2013 13:26:28 +0000</pubDate>
		<dc:creator><![CDATA[benji_dv]]></dc:creator>
				<category><![CDATA[ALM]]></category>
		<category><![CDATA[DotNet - .net]]></category>
		<category><![CDATA[TFS]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/bdevuyst/?p=88</guid>
		<description><![CDATA[Problématique : La solution Visual Studio contient une application WPF déployée par ClickOnce, et l&#8217;objectif est de créer un package ClickOnce lors de l&#8217;exécution du nightly build sous TFS 2010 (industrialisation oblige). Solution #1 : Utiliser l&#8217;activity présente dans la librairie tfsbuildextensions. Inconvénients : L&#8217;utilisation de l&#8217;activity est peu documentée&#8230; Il convient donc d&#8217;ouvrir avec iLSpy l&#8217;assembly pour pouvoir la paramétrer. Cela pourra faire l&#8217;objet d&#8217;un autre billet. L&#8217;implémentation de l&#8217;activity impose à la build [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><strong>Problématique </strong>: La solution Visual Studio contient une application WPF déployée par ClickOnce, et l&rsquo;objectif est de créer un package ClickOnce lors de l&rsquo;exécution du nightly build sous TFS 2010 (industrialisation oblige).</p>
<p><strong>Solution #1 :</strong> Utiliser l&rsquo;activity présente dans la librairie <a href="http://tfsbuildextensions.codeplex.com" title="tfsbuildextensions" target="_blank">tfsbuildextensions</a>.<br />
<em>Inconvénients </em>:</p>
<ul>
<li>L&rsquo;utilisation de l&rsquo;activity est peu documentée&#8230; Il convient donc d&rsquo;ouvrir avec iLSpy l&rsquo;assembly pour pouvoir la paramétrer.<br /> Cela pourra faire l&rsquo;objet d&rsquo;un autre billet.</li>
<li>L&rsquo;implémentation de l&rsquo;activity impose à la build de ne contenir (au plus) qu&rsquo;une seule application !
<p>En effet, la création du package ClickOnce est réalisée à la main.<br />
Les grandes lignes du processus sont les suivantes :<br />
 1. Copie du contenu du répertoire binaries de la build dans le répertoire du package<br />
 2. Renommage des fichiers en .deploy<br />
 3. Manipulation de Mage.exe pour créer le manifest de déploiement et le signer.</p>
<p>Etant donné que sous un build TFS, le répertoire des binaries est commun à tous les projets de la build, si votre solution contient plus d&rsquo;une application, le package ClickOnce généré contiendra également les binaires des autres applications&#8230;</p>
<p>Dans ce cas, il ne vous plus reste qu&rsquo;à passez votre chemin et à évaluer la solution #2 !</li>
</ul>
<p>
<strong>Solution #2 :</strong> Modification du template pour ajouter la génération du package ClickOnce par l&rsquo;appel MSBuild.<br />
<u>Étapes :</u></p>
<ol>
<li><strong>Configuration ClickOnce dans le projet concerné</strong><br />
Cela consiste à ouvrir les propriétés du projet, et a paramétrer la publication ClickOnce.<br />
Ensuite, à exécuter le wizard de déploiement afin de tester le paramétrage, et le corriger le cas échéant.<br />
Attention a ne pas oublier d&rsquo;archiver les modifications sur TFS !
</li>
<li><strong>Trouver les bons paramètres en ligne de commande msbuild</strong><br />
L&rsquo;idée est la suivante : il est possible de générer un package ClickOnce à partir d&rsquo;un appel MSBuild à condition de disposer des bons paramètres.<br />
La ligne de commande est la suivante (dans mon cas) :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">msbuild &nbsp;chemin-vers-fichier-projet.csproj<br />
&nbsp; /t:build;publish <br />
&nbsp; /p:ApplicationVersion=1.2.3.4 <br />
&nbsp; /p:BootstrapperEnabled=true <br />
&nbsp; /p:IsWebBootstrapper=true <br />
&nbsp; /p:Configuration=Release <br />
&nbsp; /p:ManifestKeyFile=chemin-vers-fichier-signature.pfx <br />
&nbsp; /p:OutputPath=chemin-vers-repertoire-sortie<br />
&nbsp; /p:InstallUrl=http://url-installation-clickonce</div></div>
<table border="1" cellpadding="5">
<tr>
<td>/t:build;publish</td>
<td>MSBuild doit exécuter Build et Publish</td>
</tr>
<tr>
<td>/p:ApplicationVersion</td>
<td>Propriété indiquant le numéro de version ClickOnce du déploiement<br />
Le format : Majeur.Mineur.Build.Revision</td>
</tr>
<tr>
<td>BootstrapperEnabled</td>
<td>Valeur indiquant si le bootstrapper (setup.exe) doit être généré.</td>
</tr>
<tr>
<td>IsWebBootstrapper</td>
<td>Valeur indiquant que le déploiement ClickOnce doit pouvoir être effectué par le Web (manifeste de déploiement xxx.application)</td>
</tr>
<tr>
<td>Configuration</td>
<td>Valeur indiquant la configuration de build (Debug, Release).</td>
</tr>
<tr>
<td>ManifestKeyFile</td>
<td>Chemin vers le fichier pfx qui signe le manifeste ClickOnce</td>
</tr>
<tr>
<td>OutputPath</td>
<td>Chemin vers le répertoire de destination du package (pour la génération)</td>
</tr>
<tr>
<td>InstallUrl</td>
<td>URL cible de l&rsquo;installation ClickOnce<br />
Ex. : http://server/monapplicationClickOnce</td>
</tr>
</table>
<p><strong>Attention :</strong> Si le fichier de signature a besoin d&rsquo;un mot de passe, il est indispensable d&rsquo;installer le certificat de l&rsquo;autorité racine dans le magasin correspondant du poste de travail, et d&rsquo;installer le certificat de signature dans le magasin my de l&rsquo;utilisateur courant.</p>
</li>
<li><strong>Modification du template de build</strong><br />
Elle consiste à ajouter une activité de type &laquo;&nbsp;MSBuild&nbsp;&raquo; après la commande MSBuild native au workflow en renseignant les paramètres obtenus à l&rsquo;étape ci dessus.<br />
Il peut être nécessaire de préciser une condition d&rsquo;exécution (&laquo;&nbsp;If&nbsp;&raquo;) si plusieurs fichiers solution sont indiqués dans la build afin d&rsquo;éviter que l&rsquo;action de packaging soit exécutée plusieurs fois.<br />
Exemple d&rsquo;utilisation dans un workflow :<br />
<a href="http://blog.developpez.com/bdevuyst/files/2013/06/ClickOnce-TFS-Build.png"><img src="http://blog.developpez.com/bdevuyst/files/2013/06/ClickOnce-TFS-Build.png" alt="ClickOnce-TFS-Build" width="1000" height="538" class="aligncenter size-full wp-image-161" /></a></p>
<p>La paramétrage de l&rsquo;activité msbuild de packaging ressemble à ceci :<br />
<a href="http://blog.developpez.com/bdevuyst/files/2013/06/ClickOnce-TFS-Build-Props.png"><img src="http://blog.developpez.com/bdevuyst/files/2013/06/ClickOnce-TFS-Build-Props.png" alt="ClickOnce-TFS-Build-Props" width="964" height="579" class="aligncenter size-full wp-image-159" /></a><br />
<br />
J&rsquo;attire votre attention sur les deux points suivants :<br />
 &#8211; Les paramètres /p: &#8230; sont injectés dans la case &laquo;&nbsp;CommandLineArguments&nbsp;&raquo;<br />
 &#8211; Le contenu de &laquo;&nbsp;CommandLineArguments&nbsp;&raquo; formatte la chaine à l&rsquo;aide de string.Format (d&rsquo;où la syntaxe {x})<br />
 &#8211; Les paramètres /t: &#8230; sont injectés dans la case &laquo;&nbsp;Targets&nbsp;&raquo;</p>
<p>Je vous laisse consulter la MSDN pour la documentation relative aux paramètre d&rsquo;une activité de build
</li>
</ol>
<p>Enjoy</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TFS et workflow de build</title>
		<link>https://blog.developpez.com/bdevuyst/p11956/dotnet-net/tfs-et-workflow-de-build</link>
		<comments>https://blog.developpez.com/bdevuyst/p11956/dotnet-net/tfs-et-workflow-de-build#comments</comments>
		<pubDate>Tue, 07 May 2013 08:46:50 +0000</pubDate>
		<dc:creator><![CDATA[benji_dv]]></dc:creator>
				<category><![CDATA[ALM]]></category>
		<category><![CDATA[DotNet - .net]]></category>
		<category><![CDATA[Powershell]]></category>
		<category><![CDATA[TFS]]></category>
		<category><![CDATA[build]]></category>
		<category><![CDATA[large]]></category>
		<category><![CDATA[projets]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[solution]]></category>
		<category><![CDATA[team]]></category>
		<category><![CDATA[workflow]]></category>
		<category><![CDATA[xaml]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/bdevuyst/?p=67</guid>
		<description><![CDATA[Cette fois ci, je ne vais pas épiloguer&#8230; car cela ne sert à rien de reprendre un contenu déjà existant et correspondant à mes attentes : clair et complet ! Customize Team Build 2010 Edit 2013-05-16 : Petite précision, dans la partie Part 5 : Increase AssemblyVersion, l&#8217;auteur précise dans le code de l&#8217;activité check out l&#8217;instruction &#160;&#187; workflow.Folders &#160;&#187; pour récupérer les répertoires mappés dans le workspace. Ensuite, &#160;&#187; folder.LocalItem &#160;&#187; pour récupérer le [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Cette fois ci, je ne vais pas épiloguer&#8230; car cela ne sert à rien de reprendre un contenu déjà existant et correspondant à mes attentes : clair et complet !</p>
<p><a href="http://www.ewaldhofman.nl/post/2010/04/20/Customize-Team-Build-2010-e28093-Part-1-Introduction.aspx" title="Customize Team Build 2010" target="_blank">Customize Team Build 2010</a></p>
<p><b>Edit 2013-05-16 :</b> Petite précision, dans la partie Part 5 : <a href="http://www.ewaldhofman.nl/post/2010/05/13/Customize-Team-Build-2010-e28093-Part-5-Increase-AssemblyVersion.aspx" title="Increase AssemblyVersion" target="_blank">Increase AssemblyVersion</a>, l&rsquo;auteur précise dans le code de l&rsquo;activité check out l&rsquo;instruction &nbsp;&raquo; workflow.Folders &nbsp;&raquo; pour récupérer les répertoires mappés dans le workspace.<br />
Ensuite, &nbsp;&raquo; folder.LocalItem &nbsp;&raquo; pour récupérer le chemin local (dans la boucle &laquo;&nbsp;pour chaque folder contenu dans le workspace&nbsp;&raquo;).<br />
Le problème est le suivant : si le workspace contient un folder cloaked, il est bien contenu dans la liste retournée par la propriété workspace.Folder, mais la propriété LocalItem est nulle ! (ce qui est logique !)<br />
Donc, lorsqu&rsquo;il est nécessaire de lister les répertoires : il faut ajouter un filtre sur soit <b>folder.IsCloaked</b> soit sur <b>string.IsNullOrEmpty(folder.LocalItem)</b> afin de ne récupérer que les folders mappés dans le workspace courant !</p>
<p>Enjoy !</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Multi solution Visual Studio et dépendances</title>
		<link>https://blog.developpez.com/bdevuyst/p11860/dotnet-net/multi-solution-visual-studio-et-dependances</link>
		<comments>https://blog.developpez.com/bdevuyst/p11860/dotnet-net/multi-solution-visual-studio-et-dependances#comments</comments>
		<pubDate>Tue, 26 Mar 2013 09:51:57 +0000</pubDate>
		<dc:creator><![CDATA[benji_dv]]></dc:creator>
				<category><![CDATA[ALM]]></category>
		<category><![CDATA[DotNet - .net]]></category>
		<category><![CDATA[TFS]]></category>
		<category><![CDATA[big]]></category>
		<category><![CDATA[build]]></category>
		<category><![CDATA[complex]]></category>
		<category><![CDATA[foundation]]></category>
		<category><![CDATA[large]]></category>
		<category><![CDATA[multiple]]></category>
		<category><![CDATA[muti]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[projets]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[solution]]></category>
		<category><![CDATA[team]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/bdevuyst/?p=56</guid>
		<description><![CDATA[Les projets informatiques de taille conséquentes sont notre quotidien (refonte de SI, utilisation de nombreuses interfaçages extérieur au projet initial, etc). Si on ajoute le respect des bonnes pratiques (ex : couplage faible entre couches &#62; l&#8217;utilisation de mécaniques d&#8217;injections de dépendances &#8211; en d&#8217;autres termes, Article sur les IOC), On obtient des fichiers solutions Visual Studio dont le nombre de projet excède largement la douzaine projets&#8230; ce billet propose juste une piste de travail [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Les projets informatiques de taille conséquentes sont notre quotidien (refonte de SI, utilisation de nombreuses interfaçages extérieur au projet initial, etc).<br />
Si on ajoute le respect des bonnes pratiques (ex : couplage faible entre couches &gt; l&rsquo;utilisation de mécaniques d&rsquo;injections de dépendances &#8211; en d&rsquo;autres termes, <a href="http://philippe.developpez.com/articles/dotnet/injectiondedependances/" title="Article sur les IOC">Article sur les IOC</a>),</p>
<p>On obtient des fichiers solutions Visual Studio dont le nombre de projet excède largement la douzaine projets&#8230;</p>
<p>ce billet propose juste une piste de travail pour ce genre de problématiques&#8230;</p>
<p>Or, d&rsquo;après les cahiers blancs MS (<a href="http://tfsguide.codeplex.com/" title="Un bon guide de mise en place des pratiques TFS">Un bon guide de mise en place des pratiques TFS</a>), des fichiers SLN de plus d&rsquo;une douzaine de projet ont des conséquences fâcheuses sur le projet :<br />
 &#8211; Absence d&rsquo;optimisation des assemblies à la compilation, (je confirme)<br />
 &#8211; Temps de compilations excessifs sur les machines des développeurs  (je confirme)<br />
 &#8211; Temps de compilations excessifs sur les agents de builds (intégration continue),  (je confirme)<br />
 &#8211; Piètre performance au chargement de la solution  (je confirme)<br />
 &#8211; &#8230;</p>
<p>La solution consiste à considérer les stratégies décrites dans le cahier blanc, pour éventuellement aboutir sur un Multi SLN.<br />
Exemple :<br />
 &#8211; SLN1 : Projets totalement indépendants des projets de la solution (drivers, API client de partenaires extérieurs, API commune à l&rsquo;entreprise)<br />
 &#8211; SLN2 : Projets de la couche de services, la DAL, etc.<br />
 &#8211; SLN3 : Projets propres à la couche de présentation</p>
<p>L&rsquo;exemple ci-dessus est une stratégie, d&rsquo;autres stratégies existent.</p>
<p>La règle, en termes de références entre projets, est la suivante : tous les projets situés au sein du même SLN peuvent se référencer entre eux, les liens entre projets de solutions différentes doivent se réaliser par DLL.<br />
Dès lors, les outputs des projets des solutions (excepté celle de présentation) doivent être archivées (par solution) afin de ne pas forcer les développeur à devoir régénérer toutes les SLN lorsqu&rsquo;un autre membre de l&rsquo;équipe modifie une couche intermédiaire.<br />
En d&rsquo;autres termes :<br />
 &#8211; les outputs des projets de la SLN1 sont redirrigés en postBuild Event vers un répertoire (ex : $SlnRoot\_Build-SLN1) puis archivés.<br />
 &#8211; les outputs des projets de la SLN2 sont redirrigés en postBuild Event vers un répertoire (ex : $SlnRoot\_Build-SLN2) puis archivés.</p>
<p>La commande xcopy à placer dans le postBuild Event du projet est la suivante :<br />
   xcopy /E /Y /D /R &laquo;&nbsp;$(TargetDir)*.*&nbsp;&raquo; &laquo;&nbsp;$(SolutionDir)_Build-SLN-1-[SlnName]&nbsp;&raquo;</p>
<p>/E : Copie les répertoires et sous-répertoires, y compris les répertoires vides<br />
/Y : Supprime la demande de confirmation de remplacement de fichiers de destination existants<br />
/D : Copie les fichiers modifiés à partir de la date spécifiée. Si aucune date n&rsquo;est donnée, copie uniquement les fichiers dont l&rsquo;heure source est plus récente que l&rsquo;heure de destination<br />
/R : Remplace les fichiers en lecture seule</p>
<p>La dernière option est très importante, car les dll&rsquo;s de destination sont en Read Only (puisque archivées sur TFS)&#8230; Sans le /R, on peut avoir des erreurs comme :<br />
Error	3	The command &laquo;&nbsp;xcopy /E /Y /D &laquo;&nbsp;E:\DEV\&#8230;\MonProjet\bin\Debug\*.*&nbsp;&raquo; &laquo;&nbsp;E:\DEV\_Build-SLN-1-SlnName&nbsp;&raquo; &#8230; exited with code 4.</p>
<p>Astuce : Pour vérifier le message d&rsquo;erreur réel : copier la commande remontée par Visual Studio lors des erreurs de build liées à xcopy dans une invite de commande et l&rsquo;exécuter !</p>
<p>Un dernier point : Si vous êtes confronté à ces problèmes de solutions complexes, je vous invite à<br />
 &#8211; lire le document cité ci dessus afin d&rsquo;élaborer une stratégie de multi SLN (non trivial),<br />
 &#8211; échanger avec les membres de l&rsquo;équipe, car en définitive ce sont eux qui exploiteront les SLNs !</p>
<p>Enjoy !</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Initialiser les données d&#8217;une base de données avec Entity Framework 5</title>
		<link>https://blog.developpez.com/bdevuyst/p11296/dotnet-net/initialiser-les-donnees-dune-base-de-donnees-avec-entity-framework-5</link>
		<comments>https://blog.developpez.com/bdevuyst/p11296/dotnet-net/initialiser-les-donnees-dune-base-de-donnees-avec-entity-framework-5#comments</comments>
		<pubDate>Mon, 10 Sep 2012 18:42:28 +0000</pubDate>
		<dc:creator><![CDATA[benji_dv]]></dc:creator>
				<category><![CDATA[DotNet - .net]]></category>
		<category><![CDATA[Entity Framework]]></category>
		<category><![CDATA[base de données]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[données]]></category>
		<category><![CDATA[initialisation]]></category>
		<category><![CDATA[seeding]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/bdevuyst/?p=44</guid>
		<description><![CDATA[Un tweet ma indiqué ce blog qui traite d&#8217;une fonctionnalité de datant seeding Intéressant ! http://odetocode.com/Blogs/scott/archive/2012/08/31/seeding-an-entity-framework-database-from-file-data.aspx]]></description>
				<content:encoded><![CDATA[<p>Un tweet ma indiqué ce blog qui traite d&rsquo;une fonctionnalité de datant seeding<br />
Intéressant !<br />
<a href="http://odetocode.com/Blogs/scott/archive/2012/08/31/seeding-an-entity-framework-database-from-file-data.aspx" title="http://odetocode.com/Blogs/scott/archive/2012/08/31/seeding-an-entity-framework-database-from-file-data.aspx" target="_blank">http://odetocode.com/Blogs/scott/archive/2012/08/31/seeding-an-entity-framework-database-from-file-data.aspx</a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IEnumerable&#8230;</title>
		<link>https://blog.developpez.com/bdevuyst/p11249/dotnet-net/ienumerable_yield_return</link>
		<comments>https://blog.developpez.com/bdevuyst/p11249/dotnet-net/ienumerable_yield_return#comments</comments>
		<pubDate>Fri, 24 Aug 2012 09:11:23 +0000</pubDate>
		<dc:creator><![CDATA[benji_dv]]></dc:creator>
				<category><![CDATA[DotNet - .net]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Bonjour, Un petit billet rappelant le principe de fonctionnement d&#8217;un IEnumerable. L&#8217;IEnumerable offre une interface permettant d&#8217;itérer parmi des objets. Dans les faits, cette interface permet de retourner une instance d&#8217;IEnumerator (via une méthode GetEnumerator). Cet IEnumerator ne propose que 3 membres : &#8211; Current : propriété permettant de retourner l&#8217;élément actuel &#8211; MoveNext() : méthode permettant d&#8217;itérer vers l&#8217;élément suivant &#8211; Reset() : méthode permettant de réinitialiser l&#8217;itérateur L&#8217;utilisation d&#8217;un IEnumerable couplé au mot [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Bonjour,</p>
<p>Un petit billet rappelant le principe de fonctionnement d&rsquo;un IEnumerable.<br />
L&rsquo;IEnumerable offre une interface permettant d&rsquo;itérer parmi des objets. Dans les faits, cette interface permet de retourner une instance d&rsquo;IEnumerator (via une méthode GetEnumerator). Cet IEnumerator ne propose que 3 membres :<br />
 &#8211; Current : propriété permettant de retourner l&rsquo;élément actuel<br />
 &#8211; MoveNext() : méthode permettant d&rsquo;itérer vers l&rsquo;élément suivant<br />
 &#8211; Reset() : méthode permettant de réinitialiser l&rsquo;itérateur</p>
<p>L&rsquo;utilisation d&rsquo;un IEnumerable couplé au mot clé yield return permet (entre autre) de streamer au fil de l&rsquo;eau les objets récupérés depuis une source de données.<br />
Pour info (ou rappel) : le mot clé yield return est un ovni qui remonte un objet à l&rsquo;appelant (consommateur de IEnumerable), le laissant utiliser l&rsquo;objet, puis lors de l&rsquo;appel au Move Next (élément suivant d&rsquo;un foreach), redescend l&rsquo;exécution dans la source de données vers le prochain yield return (ou yield break si fin).</p>
<p>Le principal intérêt est (vous l&rsquo;avez deviné), de pouvoir appliquer un traitement élément par élément, sans jamais devoir monter en mémoire une liste complète d&rsquo;objets.<br />
Cela améliore l&rsquo;expérience utilisateur sur des gros chargements de données.</p>
<p>Exemple : Un utilisateur (humain ou machine) doit traiter une grosse quantité d&rsquo;informations, élément par élément, sans pénaliser l&rsquo;exploitation des ressources (réseau, matériel, performance).<br />
La source de données peut être un fichier csv, xml, base de données, etc.</p>
<p>Dans ce cas de figure, la mémoire ne contient jamais plus d&rsquo;un élément !<br />
L&rsquo;élément suivant n&rsquo;est chargé que lorsque l&rsquo;utilisateur le demande (move next dans un foreach).</p>
<p>Le plus important à retenir est que l&rsquo;exécution du chargement (donc du premier item) n&rsquo;est réalisé qu&rsquo;à l&rsquo;appel du premier move next &#8230; comme un IQueryable ! , au contraire d&rsquo;un ICollection qui pointe vers une implémentation mémoire de liste de données !</p>
<p>Pour illustrer un problème potentiel :<br />
Lors de l&rsquo;utilisation de WCF Data Services, la récupération d&rsquo;IEnumerable{T} où T est un type simple n&rsquo;est pas géré par la couche cliente Service Reference (mais bien par le coté serveur).<br />
Donc, cela nécessite une implémentation &laquo;&nbsp;Maison&nbsp;&raquo; utilisant une webrequest (côté consommateur de données).<br />
Imaginons une propriété (coté client) qui retourne un IEnumerable{string}, l&rsquo;appel au serveur ne se fera que lorsque l&rsquo;itération sur le premier élément aura été sollicitée par le consommateur de la propriété.<br />
A ce moment là, la mécanique yield return sera mise en oeuvre !</p>
<p>Je vous invite également à comparer le code IL (via Reflector, ILSpy, etc) entre l&rsquo;un implémentation IEnumerable couplé à un yield return avec celle retournant une liste&#8230;</p>
<p>Marrant&#8230;</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Visual studio 2012 &#8230; barre de menu uppercase</title>
		<link>https://blog.developpez.com/bdevuyst/p11234/dotnet-net/visual_studio_2012_uppercase_menu</link>
		<comments>https://blog.developpez.com/bdevuyst/p11234/dotnet-net/visual_studio_2012_uppercase_menu#comments</comments>
		<pubDate>Tue, 21 Aug 2012 07:37:56 +0000</pubDate>
		<dc:creator><![CDATA[benji_dv]]></dc:creator>
				<category><![CDATA[DotNet - .net]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Si comme moi, vous avez franchis le pas de VS2012, vous avez pu constater que le menu est en MAJUSCULES &#8230; Tout les jours, j&#8217;ai l&#8217;impression que ce menu me HURLE dessus ! Pour ramener le menu à la normale il faut modifier/Créer (si inexistante) une clé de registre : >>>> HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0\General\SuppressUppercaseConversion >>>> REG_DWORD value: 1 (trouvé ici) Là, je suis presque content]]></description>
				<content:encoded><![CDATA[<p>Si comme moi, vous avez franchis le pas de VS2012, vous avez pu constater que le menu est en MAJUSCULES &#8230; </p>
<p>Tout les jours, j&rsquo;ai l&rsquo;impression que ce menu me HURLE dessus ! <img src="https://blog.developpez.com/bdevuyst/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
<p>Pour ramener le menu à la normale il faut modifier/Créer (si inexistante) une clé de registre :</p>
<p>>>>> HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0\General\SuppressUppercaseConversion<br />
>>>> REG_DWORD value: 1</p>
<p>(trouvé <a href="http://www.richard-banks.org/2012/06/how-to-prevent-visual-studio-2012-all.html">ici</a>)</p>
<p>Là, je suis presque content <img src="https://blog.developpez.com/bdevuyst/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SharePoint Enterprise Search , server name mapping et scope</title>
		<link>https://blog.developpez.com/bdevuyst/p11107/dotnet-net/sharepoint_enterprise_search_server_name</link>
		<comments>https://blog.developpez.com/bdevuyst/p11107/dotnet-net/sharepoint_enterprise_search_server_name#comments</comments>
		<pubDate>Thu, 21 Jun 2012 14:50:22 +0000</pubDate>
		<dc:creator><![CDATA[benji_dv]]></dc:creator>
				<category><![CDATA[DotNet - .net]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Bonjour Petite finesse des scopes (étendues) de la recherche SharePoint Enterprise Search : Pour information (ou rappel) : Scope ou étendue : template de recherche dans lequel on précise des règles permettant de filtrer les résultats affichés. Ces règles influent sur l&#8217;origine, le type, etc. du contenu à afficher. Server Name Mapping ou mappage de nom de server : liaison entre une url dans laquelle le contenu est trouvé et l&#8217;url de remplacement pour l&#8217;affichage [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Bonjour <img src="https://blog.developpez.com/bdevuyst/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
<p>
Petite finesse des scopes (étendues) de la recherche SharePoint Enterprise Search :<br />
Pour information (ou rappel) :<br />
<b>Scope</b> ou étendue : template de recherche dans lequel on précise des règles permettant de filtrer les résultats affichés. Ces règles influent sur l&rsquo;origine, le type, etc. du contenu à afficher.<br />
<b>Server Name Mapping</b> ou mappage de nom de server : liaison entre une url dans laquelle le contenu est trouvé et l&rsquo;url de remplacement pour l&rsquo;affichage publique des résultats. Ce mécanisme permet (par exemple) de crawler du contenu en http et l&rsquo;afficher en https.
</p>
<p>
Lorsqu&rsquo;un server name mapping est définit, et que des scopes utilisent des règles sur les sources de contenu, ces urls doivent préciser l&rsquo;url publique de la Server Name Mapping.<br />
Sans quoi&#8230; ca marche pas <img src="https://blog.developpez.com/bdevuyst/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /><br />
<br />
En d&rsquo;autres termes<br />
Zone par défaut d&rsquo;un site SharePoint : http://monSite<br />
Zone publique du site : https://www.monsite.com</p>
<p>Server Name Mapping : http://monSite  => https://www.monsite.com</p>
<p>Scope de filtrage des document > Règle sur la source n&rsquo;est pas http://monSite/documents mais bien https://www.monsite.com
</p>
<p>
Ce cas particulier a été mis en avant grâce au fait que l&rsquo;Https n&rsquo;était pas géré dans IIS (et donc pas lié à une zone SharePoint SSL).
</p>
<p>Have a good day !</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sharepoint + problème de version lors d&#8217;une restauration</title>
		<link>https://blog.developpez.com/bdevuyst/p10688/dotnet-net/sharepoint/sharepoint_2010_versions_patchs</link>
		<comments>https://blog.developpez.com/bdevuyst/p10688/dotnet-net/sharepoint/sharepoint_2010_versions_patchs#comments</comments>
		<pubDate>Wed, 01 Feb 2012 13:55:25 +0000</pubDate>
		<dc:creator><![CDATA[benji_dv]]></dc:creator>
				<category><![CDATA[Sharepoint]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Suite au message suivant : Restore-SPSite : Votre sauvegarde provient d&#8217;une autre version de Microsoft Sha rePoint Foundation et ne peut être restaurée sur un serveur exécutant la versio n actuelle. Le fichier de sauvegarde doit être restauré sur un serveur exécutan t la version « 14.0.0.6106 » ou une version ultérieure. J&#8217;ai cherché des informations permettant d&#8217;identifier les patchs qui modifient le numéro de version de Sharepoint et le bonheur est dans ce pré : http://blogs.technet.com/b/moss_it/archive/2011/08/15/lista-di-versioni-di-sharepoint-server-2010-o-sharepoint-foundation-2010-wss-4-0.aspx [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Suite au message suivant :<br />
Restore-SPSite : Votre sauvegarde provient d&rsquo;une autre version de Microsoft Sha<br />
rePoint Foundation et ne peut être restaurée sur un serveur exécutant la versio<br />
n actuelle. Le fichier de sauvegarde doit être restauré sur un serveur exécutan<br />
t la version « 14.0.0.6106 » ou une version ultérieure.</p>
<p>J&rsquo;ai cherché des informations permettant d&rsquo;identifier les patchs qui modifient le numéro de version de Sharepoint et le bonheur est dans ce pré :<br />
<a href="http://blogs.technet.com/b/moss_it/archive/2011/08/15/lista-di-versioni-di-sharepoint-server-2010-o-sharepoint-foundation-2010-wss-4-0.aspx">http://blogs.technet.com/b/moss_it/archive/2011/08/15/lista-di-versioni-di-sharepoint-server-2010-o-sharepoint-foundation-2010-wss-4-0.aspx</a> </p>
<p>EDIT : ou dans celui ci : <a href="http://blogs.technet.com/b/sharepointjoe/archive/2011/02/01/sp2010-sharepoint-2010-build-level-and-version-numbers.aspx">http://blogs.technet.com/b/sharepointjoe/archive/2011/02/01/sp2010-sharepoint-2010-build-level-and-version-numbers.aspx</a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
