<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>nVentive Coach Factor</title>
    <link>http://www.nventive.net/Blog2/</link>
    <description>nVentive</description>
    <language>en-us</language>
    <copyright>nVentive</copyright>
    <lastBuildDate>Mon, 15 Mar 2010 19:00:00 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.1.8102.813</generator>
    <managingEditor>coach@nventive.net</managingEditor>
    <webMaster>coach@nventive.net</webMaster>
    <item>
      <trackback:ping>http://www.nventive.net/Blog2/Trackback.aspx?guid=19ac0641-898d-4759-9aac-3c2c8db3e162</trackback:ping>
      <pingback:server>http://www.nventive.net/Blog2/pingback.aspx</pingback:server>
      <pingback:target>http://www.nventive.net/Blog2/PermaLink,guid,19ac0641-898d-4759-9aac-3c2c8db3e162.aspx</pingback:target>
      <dc:creator>nVentive Coach Factor</dc:creator>
      <wfw:comment>http://www.nventive.net/Blog2/CommentView,guid,19ac0641-898d-4759-9aac-3c2c8db3e162.aspx</wfw:comment>
      <wfw:commentRss>http://www.nventive.net/Blog2/SyndicationService.asmx/GetEntryCommentsRss?guid=19ac0641-898d-4759-9aac-3c2c8db3e162</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <title>Revue du web du 15 mars</title>
      <guid isPermaLink="false">http://www.nventive.net/Blog2/PermaLink,guid,19ac0641-898d-4759-9aac-3c2c8db3e162.aspx</guid>
      <link>http://www.nVentive.net/Blog2/2010/03/15/RevueDuWebDu15Mars.aspx</link>
      <pubDate>Mon, 15 Mar 2010 19:00:00 GMT</pubDate>
      <description>&lt;div&gt;&lt;h2&gt;&lt;b&gt;Les tweets de la semaine&lt;/b&gt; &lt;/h2&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://twitter.com/gpoune/statuses/10182612504"&gt;http://twitter.com/gpoune/statuses/10182612504&lt;/a&gt; ah le monde déconnecté :) la consultation de &lt;a title="tout savoir sur le viewstate" href="http://weblogs.asp.net/infinitiesloop/archive/2006/08/03/Truly-Understanding-Viewstate.aspx"&gt;ce document&lt;/a&gt; sur la gestion viewstate en ASP.NET est en soit un rappel des difficultés du monde web&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://twitter.com/marcjohnson/statuses/10190244953"&gt;http://twitter.com/marcjohnson/statuses/10190244953&lt;/a&gt; QCon a toujours eu une bonne réputation, on en reparle dans un instant&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://twitter.com/TigerHasse/statuses/10361767261"&gt;http://twitter.com/TigerHasse/statuses/10361767261&lt;/a&gt; les nouveaux jouets pour architectes dans Visual Studio 2010&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;La question Stackoverflow&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://stackoverflow.com/questions/2432281/get-sum-of-two-columns-in-one-linq-query"&gt;http://stackoverflow.com/questions/2432281/get-sum-of-two-columns-in-one-linq-query&lt;/a&gt; On est toujours étonné par la puissance de Linq pour ces petites requêtes de la vie de tous les jours, on en serait où si on avait pas l’opérateur &lt;a title="documentation" href="http://msdn.microsoft.com/en-us/vcsharp/aa336750.aspx#FirstOrDefaultSimple"&gt;FirstOrDefault()&lt;/a&gt; ? La réponse la plus adaptée utilise un opérateur peu utilisé : le &lt;a title="l'op&amp;eacute;rateur groupby dans la documentation" href="http://msdn.microsoft.com/en-us/vcsharp/aa336754.aspx"&gt;groupby&lt;/a&gt;.&lt;/p&gt; &lt;h2&gt;&lt;b&gt;Actualités Microsoft&lt;/b&gt;&amp;nbsp;&lt;/h2&gt; &lt;p&gt;Après avoir lancé son offre commerciale autour des technologies “cloud” sous le nom Azure au mois de janvier dernier, Microsoft la complète maintenant avec une offre “serveur d’application”: Azure App Fabric. Cette dernière vient rejoindre Windows Azure (offre “computing” simple avec des rôles web et/ou services et un stockage non relationnel) et SQL Azure (base de données relationelle). &lt;/p&gt; &lt;p&gt;AppFabric se décompose en deux grandes fonctionnalités : &lt;/p&gt; &lt;p&gt;Un Bus de services pour permettre à des applications d’entreprises (souvent derrière des pare-feux) de communiquer via Azure :&lt;/p&gt; &lt;p&gt;&lt;a title="page descriptive de AppFabric Azure" href="http://www.microsoft.com/windowsazure/appfabric/"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="diagramme ServiceBus" border="0" alt="diagramme ServiceBus" src="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/Revueduwebdu15mars_104AE/ServiceBus_1.png" width="644" height="413"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;et un composant de gestion d’identité ou fédération et y associer des règles d’accès :&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/Revueduwebdu15mars_104AE/AccessControl.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="AccessControl" border="0" alt="AccessControl" src="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/Revueduwebdu15mars_104AE/AccessControl_thumb.png" width="644" height="393"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;On trouvera aussi les prix associés dans ce &lt;a title="d&amp;eacute;tails sur les prix" href="http://blogs.msdn.com/netservices/archive/2010/01/04/announcing-windows-azure-platform-commercial-offer-availability-and-updated-appfabric-pricing.aspx"&gt;billet&lt;/a&gt;. Un &lt;a title="lien vers le site de t&amp;eacute;l&amp;eacute;chargement" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=39856a03-1490-4283-908f-c8bf0bfad8a5&amp;amp;displaylang=en"&gt;SDK&lt;/a&gt; est publié.&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;Actualités “Alt.NET”&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;&lt;a title="le site de la conf&amp;eacute;rence" href="http://qconlondon.com/london-2010/"&gt;QCon&lt;/a&gt; est une conférence (une édition à Londres et l’autre en Novembre aux USA) sur le développement informatique organisée par &lt;a title="site d'information" href="http://www.infoq.com"&gt;InfoQ&lt;/a&gt;, un site d’ínformations sur le monde de l’informatique de l’entreprise (un theserverside.com des années 2000 pour les plus anciens d’entre nous). Ce qui distingue QCon des autres conférences ce sont&amp;nbsp; la qualité des présentateurs et les sujets sur des technologies, méthodes innovante et/ou sur des questions d’architectures peu discutées autre part. On y trouve des classiques Robert C. Martin mais aussi des sessions sur des architecture atypiques comme &lt;a title="sessions sur les architectures atypiques" href="http://qconlondon.com/london-2010/tracks/show_track.jsp?trackOID=319"&gt;Skype ou Facebook&lt;/a&gt;,&amp;nbsp; ou des technologies en particulier (comme &lt;a title="sessions sur .NET" href="http://qconlondon.com/london-2010/tracks/show_track.jsp?trackOID=323"&gt;.NET&lt;/a&gt;). La &lt;a title="liste des tracks" href="http://qconlondon.com/london-2010/tracks/"&gt;liste des tracks&lt;/a&gt; en elle-même est assez alléchante.&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.pledgie.com/campaigns/8615"&gt;&lt;/a&gt;&lt;/p&gt;&lt;strong&gt;&lt;/strong&gt; &lt;p&gt;&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;De l’autre côté&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;&lt;a href="http://highscalability.com/blog/2010/2/8/how-farmville-scales-to-harvest-75-million-players-a-month.html"&gt;http://highscalability.com/blog/2010/2/8/how-farmville-scales-to-harvest-75-million-players-a-month.html&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Vous avez tous vu dans votre flux de nouvelles sur Facebook ces messages d’amis qui ont eu telle ou telle récompense dans le jeu FarmVille. Luke Rajlich réponds ici à quelques questions sur la façon dont on rend disponible une application web utilisée par 75 millions d’utilisateurs. Le jeu a un ratio de lecture/écriture très différents d’une application web classique où les utilisateurs passent plus de temps à lire (site de journal par exemple) qu’à écrire (laisser un commentaire). On y apprend que l’utilisation de cache est primordiale (classique dans ce genre d’architecture mais ici ils doivent aussi mettre en cache les données de Facebook), de considére chaque composant (Facebook, les SGBD, le serveur de cache) comme un point de latence et de pouvoir les isoler en cas d’incident.&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;Un projet&lt;/strong&gt;&lt;/h2&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;Les bases de données relationelles ont la vie dure en ce moment (voir le mouvement &lt;a title="fiche wikipedia du mouvement" href="http://en.wikipedia.org/wiki/NoSQL"&gt;NoSQL&lt;/a&gt;) mais est-ce dire que c’est au bénéfice des bases de données orientées objets ? Un de systèmes OODBMS qui connaît un certain succès est &lt;a title="site internet de l'&amp;eacute;diteur" href="http://developer.db4o.com/"&gt;db4o de Versant&lt;/a&gt;. La version .NET fournie un plugin d’administration pour Visual Studio 2005 et 2008 : &lt;/p&gt; &lt;p&gt;&lt;a href="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/Revueduwebdu15mars_104AE/db4omanager.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="la manager db4o dans visual studio" border="0" alt="la manager db4o dans visual studio" src="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/Revueduwebdu15mars_104AE/db4omanager_thumb.png" width="644" height="466"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Le moteur peut s’utiliser en local (fichier) ou pour une connection à un serveur :&lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;IObjectContainer db = 
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;Db4oEmbedded.OpenFile(Db4oEmbedded.NewConfiguration(), YapFileName);&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;IObjectContainer sera notre UnitOfWork pour dialoguer avec la base de données (il fournit ainsi les méthodes pour le Commit ou le RollBback) pour&amp;nbsp; :&lt;/p&gt;
&lt;p&gt;- Insérer des données :&lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;Pilot pilot1 = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Pilot("&lt;span style="color: #8b0000"&gt;Michael Schumacher&lt;/span&gt;", 100);
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;db.Store(pilot1);&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;- Retrouver des données : &lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;IList&amp;lt;Pilot&amp;gt; result = 
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        db.Query&amp;lt;Pilot&amp;gt;(p =&amp;gt; p.Name == "&lt;span style="color: #8b0000"&gt;Michael Schumacher&lt;/span&gt;");&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;- Mettre à jour :&lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;IObjectSet result = db.QueryByExample(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Pilot("&lt;span style="color: #8b0000"&gt;Michael Schumacher&lt;/span&gt;", 0));
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;var found = (Pilot)result.Next();
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;found.AddPoints(11);
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;db.Store(found);&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;Les classes sont des POCOS. &lt;/p&gt;
&lt;p&gt;Un founisseur Linq existe (bien qu’il souffre de certaines limitations du fait qu’il traduit les requêtes en un langage interne, SODA) :&lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;IEnumerable&amp;lt;Pilot&amp;gt; result = from Pilot p &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; db
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                            where p.Name.StartsWith("&lt;span style="color: #8b0000"&gt;Michael&lt;/span&gt;")
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                            select p;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;Pour gérer la profondeur en mise à jour et en lecture (opérations en cascade et lazy-loading) on doit modifier la configuration par défaut qui ne cascade pas les mises à jour sur les types référence :&lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;config.Common.ObjectClass(&lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(Car)).CascadeOnUpdate(&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;);&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;En plus des propriétés de types primitifs (string, int etc.), les références sur Car seront mises à jours (Pilot par exemple). Pour la lecture la profondeur par défaut est de 5 niveau, on peut modifier ce paramétrage : c’est le concept d’Activation dans db4o. Pour rendre systématique ce processus vos classes doivent implémenter une interface (IActivatable) ou vous devez activer faire cette décoration au moment de la compilation via une tâche MSBuild ou en utilisant l’outil fourni par db4o.&lt;/p&gt;
&lt;p&gt;Les concepts objet comme l’héritage sont bien sûr supportés. Il existe un langage bas niveau pour requêter (SODA) mais il est assez verbeux et repose beaucoup sur les chaînes de caractères. On utilisera plutôt Linq ou le langage natif de requête (en plus du requêtage par exemple déjà vu ) :&lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;var result = db.Query&amp;lt;Pilot&amp;gt;(pilot =&amp;gt; pilot.Points &amp;gt; 99
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;		                  &amp;amp;&amp;amp; pilot.Points &amp;lt; 199
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;		                  || pilot.Name == "&lt;span style="color: #8b0000"&gt;Rubens Barrichello&lt;/span&gt;");&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Une version silverlight existe en beta. On pourra consulter le &lt;a title="compte github" href="http://github.com/jhicks"&gt;compte github&lt;/a&gt; de &lt;a title="son blog" href="http://jamesrhicks.blogspot.com/"&gt;James Hicks&lt;/a&gt; pour avoir des exemples d’applications utilisant db40 : une abstraction de db4o à travers le concept de Session, une application avec une implémentation du pattern CQRS-Event Sourcing et l’utilisation de db4o avec NServiceBus.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.nventive.net/Blog2/aggbug.ashx?id=19ac0641-898d-4759-9aac-3c2c8db3e162"/&gt;&lt;/div&gt;</description>
      <comments>http://www.nventive.net/Blog2/CommentView,guid,19ac0641-898d-4759-9aac-3c2c8db3e162.aspx</comments>
      <category>.net</category>
      <category>Revue du Web</category>
    </item>
    <item>
      <trackback:ping>http://www.nventive.net/Blog2/Trackback.aspx?guid=3dd5727c-68c6-4b92-a925-ded5c3e0575f</trackback:ping>
      <pingback:server>http://www.nventive.net/Blog2/pingback.aspx</pingback:server>
      <pingback:target>http://www.nventive.net/Blog2/PermaLink,guid,3dd5727c-68c6-4b92-a925-ded5c3e0575f.aspx</pingback:target>
      <dc:creator>nVentive Coach Factor</dc:creator>
      <wfw:comment>http://www.nventive.net/Blog2/CommentView,guid,3dd5727c-68c6-4b92-a925-ded5c3e0575f.aspx</wfw:comment>
      <wfw:commentRss>http://www.nventive.net/Blog2/SyndicationService.asmx/GetEntryCommentsRss?guid=3dd5727c-68c6-4b92-a925-ded5c3e0575f</wfw:commentRss>
      <title>Revue du web du 8 Mars</title>
      <guid isPermaLink="false">http://www.nventive.net/Blog2/PermaLink,guid,3dd5727c-68c6-4b92-a925-ded5c3e0575f.aspx</guid>
      <link>http://www.nVentive.net/Blog2/2010/03/08/RevueDuWebDu8Mars.aspx</link>
      <pubDate>Mon, 08 Mar 2010 20:00:00 GMT</pubDate>
      <description>&lt;div&gt;&lt;h2&gt;&lt;b&gt;Les tweets de la semaine&lt;/b&gt; &lt;/h2&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://twitter.com/rcravens/status/9824210272"&gt;http://twitter.com/rcravens/status/9824210272&lt;/a&gt; Hudson est un serveur d’intégration continu (et populaire), si vos poches ne sont pas assez profondes pour TFS, Hudson peut être une bonne alternative.&lt;/p&gt; &lt;p&gt;&lt;a href="http://twitter.com/craighead/statuses/9837013687"&gt;http://twitter.com/craighead/statuses/9837013687&lt;/a&gt; Java vs C#, maintenant en version Robots&lt;/p&gt; &lt;p&gt;&lt;a href="http://twitter.com/UdiDahan/status/9858485324"&gt;http://twitter.com/UdiDahan/status/9858485324&lt;/a&gt; on en parlait dans notre première revue du web : NServiceBus passe en version 2&lt;/p&gt; &lt;p&gt;&lt;a href="http://twitter.com/gruuf/statuses/10073663444"&gt;http://twitter.com/gruuf/statuses/10073663444&lt;/a&gt; un sondage autour des frameworks d’inversion de contôle / injection de dépendances dans le monde .NET&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;La question Stackoverflow&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://serverfault.com/questions/45516/recommended-logparser-queries-for-iis-monitoring"&gt;http://serverfault.com/questions/45516/recommended-logparser-queries-for-iis-monitoring&lt;/a&gt; Nous allons faire un petit tour sur serverfault.com cette semaine. Ce dernier est la première spin-off de SO (il existe une version en marque blanche même). On y trouve des questions sur la gestion des systèmes informatiques en général : installation serveur, les systèmes d’exploitation, les bases de données etc. La question de la semaine énumère des requêtes possibles contre les fichiers de log de IIS : fichier le plus demandé, user-agent le plus présent etc. Nécessaire quand on a fini sa belle application et qu’on la rend disponible sur le grand Interweb.&lt;/p&gt; &lt;h2&gt;&lt;b&gt;Actualités Microsoft&lt;/b&gt;&amp;nbsp;&lt;/h2&gt; &lt;p&gt;Les MVP se réunissent chaque année sur le campus de Microsoft, &lt;a title="r&amp;eacute;sum&amp;eacute; en anlglais du MVP Summit" href="http://dotnet.dzone.com/articles/mvp-global-summit-2010-wrap"&gt;dans cet article&lt;/a&gt; Dzone fait un résumé. Ce qui est toujours surprenant c’est que cet évènement réuni des centaines de participants mais qui sont tous rendu nuets par un accord de non divulgation (les fameux “NDA”). En attendant MIX approche et Microsoft &lt;a title="article sur unwired" href="http://www.theunwired.net/?item=confirmed-no-windows-phone-7-backward-compatibility-and-more-development-information"&gt;confirme du bout des lèvres&lt;/a&gt; que la migration vers Windows Phone 7 ne sera pas possible pour les téléphones actuels. On pourra consulter la &lt;a title="liveside nous livre les d&amp;eacute;tails" href="http://www.liveside.net/mobility/archive/2010/03/05/windows-phone-sessions-at-mix-unveiled.aspx"&gt;liste des sessions&lt;/a&gt; consacrées au nouveau système d’exploitation.&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;Actualités “Alt.NET”&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;Le groupe Alt.net virtual européen organise un &lt;a href="http://europevan.blogspot.com/2010/03/next-european-van-on-06-april-2010.html"&gt;session spéciale&lt;/a&gt;&amp;nbsp; le 6 avril 2010 sur le mouvement “&lt;a href="http://manifesto.softwarecraftsmanship.org/"&gt;Software Craftsmanship&lt;/a&gt;”avec du beau monde. On pourra aussi écouter la série de podcast “&lt;a title="la s&amp;eacute;rie des &amp;eacute;pisodes" href="http://msdn.microsoft.com/en-ca/ff182908.aspx"&gt;Ignite your coding&lt;/a&gt;” organisée par le groupe d’évangélistes de Microsoft Canada dont le &lt;a title="premier &amp;eacute;pisode" href="http://blogs.msdn.com/cdndevs/archive/2010/03/04/ignite-your-coding-begins-today-2-p-m-eastern-with-andy-pragmatic-thinking-and-learning-hunt.aspx"&gt;premier invité est Andy Hunt&lt;/a&gt;, co-auteur du livre &lt;em&gt;The Pragmatic Programmer&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.pledgie.com/campaigns/8615"&gt;&lt;/a&gt;&lt;/p&gt;&lt;strong&gt;&lt;/strong&gt; &lt;p&gt;&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;De l’autre côté&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;Flash, la descente aux enfers continue. L’enfant chéri des années 2000 n’en finit plus d’être traité comme le nouveau vilain. Après avoir révolutionné l’accès aux contenus vidéos puis connu une percée significative dans le monde des applications d’entreprise avec Flex, la technologie est maintenant vue comme un handicap. Tout cela provient du succès de l’íPhone qui a accentué les défauts du runtime propriétaire. Il est&amp;nbsp; ironique de voir Apple qui a dû founir un SDK natif car les applications web n’étaient pas suffisantes faire “cause commune”avec les défenseurs du standard HTML contre Flash. The Register rapporte que &lt;a href="http://www.theregister.co.uk/2010/03/02/virgin_america_html_flash/"&gt;Virgin America&lt;/a&gt; abondonne Flash pour HTML dans ses sites internet (70 % du revenu). Il est intéressant toutefois de remarquer que Flash restera utilisé dans les systèmes comme les kiosques “Touch Screen ”dans les aéroports. Finalement on revient aux basiques : un internet standard pour du contenu à destination d’appareils multiples (navigateurs différents avec des plateforme différentes) et des frameworks plus puissants pour des applications en environment plus contrôlé. &lt;/p&gt; &lt;h2&gt;&lt;strong&gt;Un projet&lt;/strong&gt;&lt;/h2&gt; &lt;p&gt;&lt;a href="http://www.shazzam-tool.com/"&gt;Shazzam&lt;/a&gt; est un outil pour générer des Pixels Shaders. Le code source est disponible sur &lt;a title="shazzam sur codeplex" href="http://www.codeplex.com/Wikipage?ProjectName=shazzam"&gt;codeplex&lt;/a&gt;. Il existe des &lt;a title="librairie de shder effects" href="http://www.codeplex.com/wpffx"&gt;bibliothèques&lt;/a&gt; d’effets 3D existants mais cet outil vous permet de générer le code pour vos propres créations. Basé sur HLSL (High Level Shading Language) Microsoft vous permet d’ajouter des directives de transformations de pixels et un compilateur DirectX permet de générer le code machine nécessaire. Il suffit d’un wrapper C# pour les utiliser ensuite dans vos applications. Après avoir installé l’utilitaire et le SDK DirectX vous pouvez modfiier le code des effets via le langage HSLSL :&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/Revueduwebdu8Mars_8650/HLSL.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="HLSL" border="0" alt="HLSL" src="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/Revueduwebdu8Mars_8650/HLSL_thumb.png" width="576" height="484"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Ici l’effet bloom est appliqué sur une image de test :&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/Revueduwebdu8Mars_8650/image_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/Revueduwebdu8Mars_8650/image_thumb.png" width="656" height="484"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Le code C# généré expose les Dependecy Properties qui vont bien pour paramétrer les effets :&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/Revueduwebdu8Mars_8650/ShaderGenerated.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="ShaderGenerated" border="0" alt="ShaderGenerated" src="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/Revueduwebdu8Mars_8650/ShaderGenerated_thumb.png" width="644" height="427"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.nventive.net/Blog2/aggbug.ashx?id=3dd5727c-68c6-4b92-a925-ded5c3e0575f"/&gt;&lt;/div&gt;</description>
      <comments>http://www.nventive.net/Blog2/CommentView,guid,3dd5727c-68c6-4b92-a925-ded5c3e0575f.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://www.nventive.net/Blog2/Trackback.aspx?guid=909f1cf3-b62b-4c5f-b354-668316291df3</trackback:ping>
      <pingback:server>http://www.nventive.net/Blog2/pingback.aspx</pingback:server>
      <pingback:target>http://www.nventive.net/Blog2/PermaLink,guid,909f1cf3-b62b-4c5f-b354-668316291df3.aspx</pingback:target>
      <dc:creator>nVentive Coach Factor</dc:creator>
      <wfw:comment>http://www.nventive.net/Blog2/CommentView,guid,909f1cf3-b62b-4c5f-b354-668316291df3.aspx</wfw:comment>
      <wfw:commentRss>http://www.nventive.net/Blog2/SyndicationService.asmx/GetEntryCommentsRss?guid=909f1cf3-b62b-4c5f-b354-668316291df3</wfw:commentRss>
      <title>Revue du Web du 1er Mars</title>
      <guid isPermaLink="false">http://www.nventive.net/Blog2/PermaLink,guid,909f1cf3-b62b-4c5f-b354-668316291df3.aspx</guid>
      <link>http://www.nVentive.net/Blog2/2010/03/01/RevueDuWebDu1erMars.aspx</link>
      <pubDate>Mon, 01 Mar 2010 20:00:00 GMT</pubDate>
      <description>&lt;div&gt;&lt;h2&gt;&lt;b&gt;Les tweets de la semaine&lt;/b&gt; &lt;/h2&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://twitter.com/loiane/statuses/9694669388"&gt;http://twitter.com/loiane/statuses/9694669388&lt;/a&gt; Travailler pour la NASA en programmant du Silverlight.&lt;/p&gt; &lt;p&gt;&lt;a href="http://twitter.com/veryfancy/statuses/9582184256"&gt;http://twitter.com/veryfancy/statuses/9582184256&lt;/a&gt; On utilise régulièrement System.Uri sans vraiment y faire attention, voici un petit rappel de son contenu&lt;/p&gt; &lt;p&gt;&lt;a href="http://twitter.com/dataartist/statuses/9575476761"&gt;http://twitter.com/dataartist/statuses/9575476761&lt;/a&gt; une requête Linq peut compliquer le code&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;La question Stackoverflow&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://stackoverflow.com/questions/2346394/should-i-use-byte-or-int"&gt;http://stackoverflow.com/questions/2346394/should-i-use-byte-or-int&lt;/a&gt; Pouquoi utilsier un type int plutôt qu’un byte (ou un short) ? Un dilemme entre performance (ou sur-optimisation) et sémantique.&lt;/p&gt; &lt;h2&gt;&lt;b&gt;Actualités Microsoft&lt;/b&gt;&amp;nbsp;&lt;/h2&gt; &lt;p&gt;Avec la dernière version de Visual Studio (2010 RC) on peut dire que le développement WPF/Silverlight est devenu une expérience plaisante. Le mode prévisualisation fonctionne pour les deux technologies et l’intellisense autour des expressions de binding a été améliorée. Mais une des nouveautés intéressantes réside dans le support au design time des types d’objets bindés aux contrôles. Les propriétés du namespace d: permettent de spécifier des valeurs ignorées au moment de la compilation et donc du runtime. On les connaît déjà pour la hauteur et la largeur des UserControl. Karl Shifflett introduit &lt;a title="le billet de Karl" href="http://karlshifflett.wordpress.com/2009/10/28/ddesigninstance-ddesigndata-in-visual-studio-2010-beta2/"&gt;d:DataContext et d:DesignInstance&lt;/a&gt; qui permet de spécifier son type pour ensuite voir les propriétés dans les boîtes de dialogue de databindig.&lt;/p&gt; &lt;p&gt;En parlant de Silverlight, la prochaine que vous en faites une démo et que tout le monde baille, montrer &lt;a title="vid&amp;eacute;o sur youtube" href="http://www.youtube.com/watch?v=9QFvfHXkd2o&amp;amp;feature=player_embedded"&gt;cette vidéo&lt;/a&gt; de Bing à la conférence TED par Blaise Aguera y Arcas (aux alentours de 4:45) : &lt;/p&gt; &lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=9QFvfHXkd2o&amp;amp;feature=player_embedded"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image de la vid&amp;eacute;o montrant un prototype de r&amp;eacute;alit&amp;eacute; augment&amp;eacute;e avec Visual Studio" border="0" alt="image de la vid&amp;eacute;o montrant un prototype de r&amp;eacute;alit&amp;eacute; augment&amp;eacute;e avec Visual Studio" src="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/RevueduWebdu1erMars_B46F/streetviewaugmented_1.png" width="544" height="409"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Oui c’est bien une “House View” à l’intérieur d’un bâtiment avec un flux direct de vidéo en sur-impression. Street View est tellement 1996.&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;Actualités “Alt.NET”&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;On connaît tous NHibernate ce framwork de mapping objet-relationnel qui semble être là depuis toujours et même avant si on considère sa version Java. Il fait aussi parti des projets phares dans le monde .NET car il est un des premiers&amp;nbsp; projets open source ayant un grand succès. Son développement a été financé dans le passé par&amp;nbsp; la passion de certains développeurs, des entreprises ont aussi donné du temps de développent par exemple sur le founisseur Linq. &lt;/p&gt; &lt;p&gt;Voux pouvez faire un don directement en cliquant sur ce lien :&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.pledgie.com/campaigns/8615"&gt;&lt;img border="0" alt="Click here to lend your support to: NHibernate and make a donation at www.pledgie.com !" src="http://www.pledgie.com/campaigns/8615.png?skin_name=chrome"&gt;&lt;/a&gt;&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;De l’autre côté&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;Pour envoyer des messages entre systèmes on connaît MSMQ (&lt;a title="article wikipedia sur MSMQ" href="http://en.wikipedia.org/wiki/Microsoft_Message_Queuing"&gt;Microsoft Message Queuing&lt;/a&gt;). Un des équivalents dans le monde Java est JMS (&lt;a title="Java Message Service" href="http://en.wikipedia.org/wiki/Java_Message_Service"&gt;Java Message Service&lt;/a&gt;), un standard implémenté par différents produits dont les plus connus sont IBM MQ, TibCo. Dans ce billet &lt;a title="billet sur AMQP" href="http://blog.xebia.fr/2010/02/23/amqp-une-alternative-a-jms/"&gt;Xebia&lt;/a&gt; nous introduit à AMQP (Advanced Message Queuing Protocol). Ce protocole initié par JP Morgan se concentre sur la performance et propose les différents cas d’utilisation d’un systèmes de messages (Store and Forward, Point to Point etc). Les deux implémentations connues sont RabbitMQ en Erlang et&amp;nbsp; OpenAMQ en C++. La spécification 1.0 est attendue pour cette année et on apprend aussi que Microsoft a collaboré avec QPid (projet Apache autour de AMQP).&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;Un projet&lt;/strong&gt;&amp;nbsp;&lt;/h2&gt; &lt;p&gt;&lt;a title="site du projet sur codeplex" href="http://www.codeplex.com/entlib"&gt;Enterprise Library&lt;/a&gt; va bientôt connaître une nouvelle version, la beta de la version 5 est déjà disponible et une &lt;a title="roadmap de EntLib 5" href="http://blogs.msdn.com/agile/archive/2010/01/20/announcing-enterprise-library-5-0-and-unity-2-0-roadmap.aspx"&gt;beta 2&lt;/a&gt; doit sortir le 15 mars pour une version finale attendue juste après la sortie de Visual Studio 2010. Dans le framework on trouve &lt;a title="site du projet Unity" href="http://www.codeplex.com/unity"&gt;Unity 2&lt;/a&gt;, le framework d’injection des dépendances de Microsoft. Comme pour la version précédente il existe deux modes : par fichier de configuration ou par code. Le premier offre maintenant un outil (en WPF BTW):&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/RevueduWebdu1erMars_B46F/image_4.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="outil de configuration de UNity" border="0" alt="outil de configuration de UNity" src="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/RevueduWebdu1erMars_B46F/image_thumb_1.png" width="593" height="245"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;a href="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/RevueduWebdu1erMars_B46F/image_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="ajout d'un mapping" border="0" alt="ajout d'un mapping" src="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/RevueduWebdu1erMars_B46F/image_thumb.png" width="617" height="178"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Mais Unity offre aussi une API fluent :&lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;var container = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; UnityContainer();
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;container.RegisterType&amp;lt;IRepository&amp;lt;&amp;gt;, Repository&amp;lt;&amp;gt;()
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;.RegisterType&amp;lt;IContactRepository, ContactRepository&amp;gt;();&lt;/pre&gt;&lt;/pre&gt;Avec de nouvelles méthodes comme &lt;font face="Courier New"&gt;IsRegistered&lt;/font&gt; pour vérifier l’existance d’un mapping, 
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Les deux nouveaux lifetime managers (les objets qui déclarent quand instancier ou réutiliser une instance au moment de la résolution du type) sont &lt;font face="Courier New"&gt;HierarchicalifetimeManager&lt;/font&gt; (les containes enfants ne partagent pas les instances des containers parents qui sont singleton) et &lt;font face="Courier New"&gt;PerResolveLifetimeManager&lt;/font&gt; (même instance dans un graphe donné : mon IRepository est utilisé comme propriété à deux endroits différents dans deux objets liés à une instance construite par Unity, j’aurai la même référence pour une résolution).&lt;/p&gt;&lt;img width="0" height="0" src="http://www.nventive.net/Blog2/aggbug.ashx?id=909f1cf3-b62b-4c5f-b354-668316291df3"/&gt;&lt;/div&gt;</description>
      <comments>http://www.nventive.net/Blog2/CommentView,guid,909f1cf3-b62b-4c5f-b354-668316291df3.aspx</comments>
      <category>Revue du Web</category>
    </item>
    <item>
      <trackback:ping>http://www.nventive.net/Blog2/Trackback.aspx?guid=283bd800-b2ef-47bc-9810-d57e3d283d06</trackback:ping>
      <pingback:server>http://www.nventive.net/Blog2/pingback.aspx</pingback:server>
      <pingback:target>http://www.nventive.net/Blog2/PermaLink,guid,283bd800-b2ef-47bc-9810-d57e3d283d06.aspx</pingback:target>
      <dc:creator>nVentive Coach Factor</dc:creator>
      <wfw:comment>http://www.nventive.net/Blog2/CommentView,guid,283bd800-b2ef-47bc-9810-d57e3d283d06.aspx</wfw:comment>
      <wfw:commentRss>http://www.nventive.net/Blog2/SyndicationService.asmx/GetEntryCommentsRss?guid=283bd800-b2ef-47bc-9810-d57e3d283d06</wfw:commentRss>
      <title>Revue du web .NET du 22 février</title>
      <guid isPermaLink="false">http://www.nventive.net/Blog2/PermaLink,guid,283bd800-b2ef-47bc-9810-d57e3d283d06.aspx</guid>
      <link>http://www.nVentive.net/Blog2/2010/02/22/RevueDuWebNETDu22F%c3%a9vrier.aspx</link>
      <pubDate>Mon, 22 Feb 2010 20:00:00 GMT</pubDate>
      <description>&lt;div&gt;&lt;h2&gt;&lt;b&gt;Les tweets de la semaine&lt;/b&gt; &lt;/h2&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://twitter.com/cadred/statuses/9242655924"&gt;http://twitter.com/cadred/statuses/9242655924&lt;/a&gt; une revue du web .NET quotidienne, elle va très bien avec le café du matin&lt;/p&gt; &lt;p&gt;&lt;a href="http://twitter.com/romainverdier/status/8922567409"&gt;http://twitter.com/romainverdier/status/8922567409&lt;/a&gt; la conversion de delegate, Func&amp;lt;T,bool&amp;gt; == Predicate&amp;lt;T&amp;gt; ?&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.alexatnet.com/content/net-memory-management-and-garbage-collector"&gt;http://www.alexatnet.com/content/net-memory-management-and-garbage-collector&lt;/a&gt; un petit rappel sur le Garbage collector en .NET&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;La question Stackoverflow&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://stackoverflow.com/questions/129453/net-eventhandlers-generic-or-no"&gt;http://stackoverflow.com/questions/129453/net-eventhandlers-generic-or-no&lt;/a&gt; les bonnes pratiques officielles concernant les events en .NET peuvent être rébarbatives, cette question se concentre sur la classe représentant les arguments des évènements et sa version générique.&amp;nbsp; &lt;/p&gt; &lt;h2&gt;&lt;b&gt;Actualités Microsoft&lt;/b&gt;&amp;nbsp;&lt;/h2&gt; &lt;p&gt;Windows Phone 7 Series a été annoncé, enfin les détails “grand public”, concernant les développements il faudra attendre un peu : on parle d’une version de Visual Studio gratuite et dédiée pour le début de l’été et un environnement de développement autour de Silverlight ou XNA pour le jeux. En attendant voici un graphique &lt;a href="http://www.businessinsider.com/chart-of-the-day-microsoft-operating-income-by-division-2010-2"&gt;intéressant&lt;/a&gt; qui donne la répartition des profits de Microsoft selon les lignes de produits – on y voit bien l’effet de Windows 7 :&lt;/p&gt; &lt;p&gt;&lt;a title="voir la source" href="http://www.businessinsider.com/chart-of-the-day-microsoft-operating-income-by-division-2010-2"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="Microsoft profit" border="0" src="http://static.businessinsider.com/image/4b7337bc0000000000a10a91/chart-of-the-day-msft-operating-profit.gif"&gt;&lt;/a&gt;&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;Actualités “Alt.NET”&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;On vous indiquait dans une édition précédente de la revue du web les présentations de SkillsMatter, celle de Udi Dahan sur Command Query Responsibility Segregation est maintenant en ligne : &lt;a href="http://skillsmatter.com/podcast/open-source-dot-net/udi-dahan-command-query-responsibility-segregation/rl-311"&gt;http://skillsmatter.com/podcast/open-source-dot-net/udi-dahan-command-query-responsibility-segregation/rl-311&lt;/a&gt;&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;De l’autre côté&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt; Hibernate, un des plus anciens ORM, continue son bonhomme de chemin et devient avec la version &lt;a title="blog sur la release candidate" href="http://in.relation.to/Bloggers/Hibernate350CR1Release"&gt;3.5&lt;/a&gt; conforme à la version 2 de la spécification JPA (un standard Java pour la persistance des données). Quelques &lt;a href="https://www.hibernate.org/357.html#A8"&gt;nouveautés&lt;/a&gt; : Les annotations (équivalent des attributs en C#) sont incorporées dans le projet général, support de JDBC 4, la possibilité de décrire des schémas de chargement (Fetch Profiles). Cette dernière fonctionnalité est intéressante car si un ORM vous débarasse de l’écriture d’une couche d’accès aux données fastidieuse, le lazy loading a un effet pervers : on ne contrôle plus la granularité du graphe d’objets récupérés et on se retrouve vite avec des problèmes comme le &lt;a title="une explication en anglais du probl&amp;egrave;me" href="http://ayende.com/Blog/archive/2006/05/02/CombatingTheSelectN1ProblemInNHibernate.aspx"&gt;Select N+1&lt;/a&gt;. &lt;/p&gt; &lt;h2&gt;&lt;strong&gt;Un projet&lt;/strong&gt;&amp;nbsp;&lt;/h2&gt; &lt;p&gt;&lt;a title="site du projet sur Google Code" href="http://code.google.com/p/elmah/"&gt;ELMAH&lt;/a&gt; est un projet qui permet de gérer l’audit des erreurs dans une applications ASP.NET. Les exceptions sont sauvegardées dans une base de données (Sql Server, Oracle, SQlite, un fichier XML). &lt;/p&gt; &lt;p&gt;La configuration consiste à ajouter un certain nombre de section pour paramétrer les différents aspects : logging, reporting, notifications etc. :&lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;sectionGroup&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"elmah"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;section&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"security"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;requirePermission&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"false"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Elmah.SecuritySectionHandler, Elmah"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;section&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"errorLog"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;requirePermission&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"false"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Elmah.ErrorLogSectionHandler, Elmah"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;section&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"errorMail"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;requirePermission&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"false"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Elmah.ErrorMailSectionHandler, Elmah"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;section&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"errorFilter"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;requirePermission&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"false"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Elmah.ErrorFilterSectionHandler, Elmah"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;sectionGroup&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;Ainsi que les handler et le httpmodule dans les sections respectives :&lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;add&lt;/span&gt; &lt;span style="color: #ff0000"&gt;verb&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"POST,GET,HEAD"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;path&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"elmah.axd"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Elmah.ErrorLogPageFactory, Elmah"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;add&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"ErrorLog"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Elmah.ErrorLogModule, Elmah"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;On configure le datastore, ici SQLite :&amp;nbsp; &lt;pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;elmah&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;   &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;errorLog&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Elmah.SQLiteErrorLog, Elmah"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;connectionStringName&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Elmah.SQLite"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;elmah&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;connectionStrings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;add&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Elmah.SQLite"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;connectionString&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"data source=~/App_Data/Elmah.SQLite.db"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;connectionStrings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;On peut aussi specifier une notification par email (ou Twitter):&lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;errorMail&lt;/span&gt; &lt;span style="color: #ff0000"&gt;from&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"elmah@example.com"&lt;/span&gt;    
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;             &lt;span style="color: #ff0000"&gt;to&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"admin@example.com"&lt;/span&gt;    
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;             &lt;span style="color: #ff0000"&gt;cc&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"carboncopy@example.com"&lt;/span&gt;    
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;             &lt;span style="color: #ff0000"&gt;subject&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"..."&lt;/span&gt;  
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;             &lt;span style="color: #ff0000"&gt;async&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"true|false"&lt;/span&gt;  
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;             &lt;span style="color: #ff0000"&gt;smtpPort&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"25"&lt;/span&gt;  
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;             &lt;span style="color: #ff0000"&gt;smtpServer&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"smtp.example.com"&lt;/span&gt;    
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;             &lt;span style="color: #ff0000"&gt;userName&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"johndoe"&lt;/span&gt;  
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;             &lt;span style="color: #ff0000"&gt;password&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"secret"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;  &lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;La page permet de voir une liste des erreurs survenues et de voir le détail de la requête HTTP à l’origine du problème. On peut alors téleécharger le log et s’abonner à un flux RSS des erreurs :&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/Revueduweb.NETdu26octobre_90B0/ErrorLog.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="copie d'&amp;eacute;cran de la page d'erreur" border="0" alt="copie d'&amp;eacute;cran de la page d'erreur" src="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/Revueduweb.NETdu26octobre_90B0/ErrorLog_thumb.png" width="632" height="370"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;Auto-promotion&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;nVentive organise une série de bootcamps sur des sujets très variés comme WPF, TDD ou encore NHibernate.Tous ces ateliers sont orientés développement d’applications d’affaires et font une large place aux labs.&lt;/p&gt;
&lt;p&gt;Voici une &lt;a title="liste des &amp;eacute;v&amp;egrave;nements" href="http://www.eventbrite.com/org/249982715?s=1547965"&gt;liste des formations et leur description plus complète&lt;/a&gt;.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.nventive.net/Blog2/aggbug.ashx?id=283bd800-b2ef-47bc-9810-d57e3d283d06"/&gt;&lt;/div&gt;</description>
      <comments>http://www.nventive.net/Blog2/CommentView,guid,283bd800-b2ef-47bc-9810-d57e3d283d06.aspx</comments>
      <category>.net</category>
      <category>Revue du Web</category>
    </item>
    <item>
      <trackback:ping>http://www.nventive.net/Blog2/Trackback.aspx?guid=ab297bcd-9382-4a07-a5cd-e7116eaca320</trackback:ping>
      <pingback:server>http://www.nventive.net/Blog2/pingback.aspx</pingback:server>
      <pingback:target>http://www.nventive.net/Blog2/PermaLink,guid,ab297bcd-9382-4a07-a5cd-e7116eaca320.aspx</pingback:target>
      <dc:creator>nVentive Coach Factor</dc:creator>
      <wfw:comment>http://www.nventive.net/Blog2/CommentView,guid,ab297bcd-9382-4a07-a5cd-e7116eaca320.aspx</wfw:comment>
      <wfw:commentRss>http://www.nventive.net/Blog2/SyndicationService.asmx/GetEntryCommentsRss?guid=ab297bcd-9382-4a07-a5cd-e7116eaca320</wfw:commentRss>
      <title>Revue du web .NET du 22 février</title>
      <guid isPermaLink="false">http://www.nventive.net/Blog2/PermaLink,guid,ab297bcd-9382-4a07-a5cd-e7116eaca320.aspx</guid>
      <link>http://www.nVentive.net/Blog2/2010/02/22/RevueDuWebNETDu22F%c3%a9vrier.aspx</link>
      <pubDate>Mon, 22 Feb 2010 20:00:00 GMT</pubDate>
      <description>&lt;div&gt;&lt;h2&gt;&lt;b&gt;Les tweets de la semaine&lt;/b&gt; &lt;/h2&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://twitter.com/cadred/statuses/9242655924"&gt;http://twitter.com/cadred/statuses/9242655924&lt;/a&gt; une revue du web .NET quotidienne, elle va très bien avec le café du matin&lt;/p&gt; &lt;p&gt;&lt;a href="http://twitter.com/romainverdier/status/8922567409"&gt;http://twitter.com/romainverdier/status/8922567409&lt;/a&gt; la conversion de delegate, Func&amp;lt;T,bool&amp;gt; == Predicate&amp;lt;T&amp;gt; ?&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.alexatnet.com/content/net-memory-management-and-garbage-collector"&gt;http://www.alexatnet.com/content/net-memory-management-and-garbage-collector&lt;/a&gt; un petit rappel sur le Garbage collector en .NET&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;La question Stackoverflow&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://stackoverflow.com/questions/129453/net-eventhandlers-generic-or-no"&gt;http://stackoverflow.com/questions/129453/net-eventhandlers-generic-or-no&lt;/a&gt; les bonnes pratiques officielles concernant les events en .NET peuvent être rébarbatives, cette question se concentre sur la classe représentant les arguments des évènements et sa version générique.&amp;nbsp; &lt;/p&gt; &lt;h2&gt;&lt;b&gt;Actualités Microsoft&lt;/b&gt;&amp;nbsp;&lt;/h2&gt; &lt;p&gt;Windows Phone 7 Series a été annoncé, enfin les détails “grand publics”, concernant les développements il faudra attendre un peu : on parle d’une version de Visual Studio gratuite et dédiée pour le début de l’été et un environnement de développement autour de Silverlight ou XNA pour le jeux. En attendant voici un graphique &lt;a href="http://www.businessinsider.com/chart-of-the-day-microsoft-operating-income-by-division-2010-2"&gt;intéressant&lt;/a&gt; qui donne la répartition des revenus de Microsoft selon les lignes de produits :&lt;/p&gt; &lt;p&gt;&lt;a title="voir la source" href="http://www.businessinsider.com/chart-of-the-day-microsoft-operating-income-by-division-2010-2"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Microsoft profit" border="0" src="http://static.businessinsider.com/image/4b7337bc0000000000a10a91/chart-of-the-day-msft-operating-profit.gif"&gt;&lt;/a&gt;&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;Actualités “Alt.NET”&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;On vous indiquait dans une édition précédente de la revue du web les présentations de SkillsMatter, celle de Udi Dahan sur Command Query Responsibility Segregation est maintenant en ligne : &lt;a href="http://skillsmatter.com/podcast/open-source-dot-net/udi-dahan-command-query-responsibility-segregation/rl-311"&gt;http://skillsmatter.com/podcast/open-source-dot-net/udi-dahan-command-query-responsibility-segregation/rl-311&lt;/a&gt;&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;De l’autre côté&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;Un projet&lt;/strong&gt;&amp;nbsp;&lt;/h2&gt; &lt;p&gt;&amp;nbsp;&lt;strong&gt;Auto-promotion&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;nVentive organise une série de bootcamps sur des sujets très variés comme WPF, TDD ou encore NHibernate.Tous ces ateliers sont orientés développement d’applications d’affaires et font une large place aux labs.&lt;/p&gt; &lt;p&gt;Voici une &lt;a title="liste des &amp;eacute;v&amp;egrave;nements" href="http://www.eventbrite.com/org/249982715?s=1547965"&gt;liste des formations et leur description plus complète&lt;/a&gt;.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.nventive.net/Blog2/aggbug.ashx?id=ab297bcd-9382-4a07-a5cd-e7116eaca320"/&gt;&lt;/div&gt;</description>
      <comments>http://www.nventive.net/Blog2/CommentView,guid,ab297bcd-9382-4a07-a5cd-e7116eaca320.aspx</comments>
      <category>.net</category>
      <category>Revue du Web</category>
    </item>
    <item>
      <trackback:ping>http://www.nventive.net/Blog2/Trackback.aspx?guid=23cbdd65-b013-4fa9-bd49-fbd7acee7808</trackback:ping>
      <pingback:server>http://www.nventive.net/Blog2/pingback.aspx</pingback:server>
      <pingback:target>http://www.nventive.net/Blog2/PermaLink,guid,23cbdd65-b013-4fa9-bd49-fbd7acee7808.aspx</pingback:target>
      <dc:creator>nVentive Coach Factor</dc:creator>
      <wfw:comment>http://www.nventive.net/Blog2/CommentView,guid,23cbdd65-b013-4fa9-bd49-fbd7acee7808.aspx</wfw:comment>
      <wfw:commentRss>http://www.nventive.net/Blog2/SyndicationService.asmx/GetEntryCommentsRss?guid=23cbdd65-b013-4fa9-bd49-fbd7acee7808</wfw:commentRss>
      <title>Revue du web .NET du 15 février</title>
      <guid isPermaLink="false">http://www.nventive.net/Blog2/PermaLink,guid,23cbdd65-b013-4fa9-bd49-fbd7acee7808.aspx</guid>
      <link>http://www.nVentive.net/Blog2/2010/02/15/RevueDuWebNETDu15F%c3%a9vrier.aspx</link>
      <pubDate>Mon, 15 Feb 2010 20:00:00 GMT</pubDate>
      <description>&lt;div&gt;&lt;h2&gt;&lt;b&gt;Les tweets de la semaine&lt;/b&gt; &lt;/h2&gt; &lt;p&gt;&lt;a href="http://twitter.com/tormodfj/statuses/8900636543"&gt;http://twitter.com/tormodfj/statuses/8900636543&lt;/a&gt; une nouvelle version de l’éditeur de code est arrivée, non non, ce n’est pas ce que vous pensez&lt;/p&gt; &lt;p&gt;&lt;a href="http://twitter.com/darthpanda/statuses/8905432346"&gt;http://twitter.com/darthpanda/statuses/8905432346&lt;/a&gt; une liste de méthodes d’extension pour toutes les situations de la vie&lt;/p&gt; &lt;p&gt;&lt;a href="http://twitter.com/ManningBooks/statuses/8912372298"&gt;http://twitter.com/ManningBooks/statuses/8912372298&lt;/a&gt; Un article d’introduction sur l’intégration continue en .NET par les auteurs d’un livre qui sort prochainement sur le sujet&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;La question Stackoverflow&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;&lt;a href="http://stackoverflow.com/questions/2237275/what-does-default-keyword-mean-in-c"&gt;http://stackoverflow.com/questions/2237275/what-does-default-keyword-mean-in-c&lt;/a&gt; Un peu d’humour aujourd’hui : cela part mal on dirait pour cet utilisateur de Visual Studio.&lt;/p&gt; &lt;h2&gt;&lt;b&gt;Actualités Microsoft&lt;/b&gt;&amp;nbsp;&lt;/h2&gt; &lt;p&gt;Depuis la semaine dernière les rumeurs les plus folles courent sur la (très attendue) prochaine version de Windows Mobile : Windows Phone Series 7. Dans ce &lt;a title="windows mobile 7" href="http://www.mobiletechworld.com/2010/02/06/more-windows-mobile-7-rumors-grab-some-salt/"&gt;billet&lt;/a&gt; on trouve quelques hypothèses dont un SDK basé sur Silvelright version mobile (un mix de 3 et 4), une version de Visual Studio Express dédiée et la fin du multitasking. On en sera sans doute plus au cours de la semaine avec la conférence &lt;a title="Le site de la conf&amp;eacute;rence" href="http://www.mobileworldcongress.com/index.htm"&gt;Mobile Wolrd Congress&lt;/a&gt; qui se tient à Barcelone.&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;Actualités “Alt.NET”&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;&amp;nbsp;&lt;a title="site web du projet" href="http://git-scm.com/"&gt;GIT&lt;/a&gt; est en passe de supplanter Subversion le système de gestion de configuration alternatif au composant dédíé de TFS. Dans un &lt;a title="vid&amp;eacute;o de la session" href="http://www.vimeo.com/9324683"&gt;webcast&lt;/a&gt; du groupe Europe Virtual Alt.NET James Gregory nous parle de l’utilisation de l’outil. On pourra consulter l’excellent add-in &lt;a title="page du projet sur sourceforge" href="http://sourceforge.net/projects/gitextensions/"&gt;GIT Extensions&lt;/a&gt; pour les utilisateurs de Visual Studio.&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;De l’autre côté&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;La version 3.2 &lt;a href="http://blogs.sun.com/GullFOSS/entry/openoffice_org_3_2_0"&gt;d’Open Office&lt;/a&gt; est sortie. Est-ce devenue une anomalie dans un monde de plus en plus tourné vers les applications web (Google Docs, la future version web d’Office, &lt;a title="une suite bureautique" href="http://www.zoho.com/"&gt;Zoho&lt;/a&gt;…). Certains regrettent aussi la communuaté de développeurs peu dynamique, le fait que C++ soit le langage principal n’a pas joué en sa faveur (bien qu’Apple soit arrivé à rendre sexy le développement avec pointeur, mais Open Office n’est pas un iPhone). Le récent rachat de Sun par Oracle a fait beaucoup coulé d’encre à cause de Mysql mais peu sur Open Office. Peut-on s’attendre à une mort lente ?&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;Un projet&lt;/strong&gt;&amp;nbsp;&lt;/h2&gt; &lt;p&gt;&amp;nbsp;&lt;a title="le site du projet" href="http://www.mongodb.org/display/DOCS/Home"&gt;MongoDB&lt;/a&gt; est un système de stockage orienté document. Ces documents sont stockés au format binaire et les requêtes utilisent un langage similaire au JSON pour dialoguer avec le système de base de données. Contrairement aux systèmes relationnels les SGBD document n’ont pas de structure fixe, deux documents peuvent partager un certain nombre de champs mais ce n’est pas obligatoire.&lt;/p&gt; &lt;p&gt;Dans ces &lt;a title="premier tutorial sur MongoDB" href="http://daniel.wertheim.se/2010/02/05/getting-started-with-mongodb-using-json-net-and-castle-dynamic-proxy/"&gt;deux&lt;/a&gt; &lt;a title="deuxi&amp;egrave;me billet sur mongodb" href="http://daniel.wertheim.se/2010/02/07/mongodb-in-c-extensions-to-support-json-mapping-or-proxy-generation/"&gt;billets&lt;/a&gt; Daniel Wertheim nous montre comment utiliser MongoDB dans un environnment C#. Après télécharger MongoDB la console nous permet d’ajouter des données :&lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;p&gt;db.Notes.save({ Title: "&lt;span style="color: #8b0000"&gt;The first document&lt;/span&gt;", Body: "&lt;span style="color: #8b0000"&gt;My first document stored in MongoDB.&lt;/span&gt;", &lt;/p&gt;&lt;p&gt;Tags: ["&lt;span style="color: #8b0000"&gt;MongoDB&lt;/span&gt;", "&lt;span style="color: #8b0000"&gt;Getting started&lt;/span&gt;"]})&lt;/p&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;le requêtage :&lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;db.Notes.find({Tags : "&lt;span style="color: #8b0000"&gt;Getting started&lt;/span&gt;"})&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;Il existe un pilote c# pour interagir avec la base de données à travers une interface JSON (avec des litérales ou en sérialisant des objets vers JSON) :&lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;var firstNote = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Note {
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	Title = "&lt;span style="color: #8b0000"&gt;First note using Serialization&lt;/span&gt;",
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	Tags = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;[] { "&lt;span style="color: #8b0000"&gt;MongoDB&lt;/span&gt;", "&lt;span style="color: #8b0000"&gt;Getting started&lt;/span&gt;" },
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	Body = "&lt;span style="color: #8b0000"&gt;Some nice text.&lt;/span&gt;" };
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;//Convert Note &lt;span style="color: #0000ff"&gt;to&lt;/span&gt; Document &lt;span style="color: #0000ff"&gt;and&lt;/span&gt; insert it
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;var firstNoteDocument = json.DocumentFrom(firstNote);
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;notes.Insert(firstNoteDocument);&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;et le requêtage :&lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;var noteDocument = notes.FindOne(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Document { { "&lt;span style="color: #8b0000"&gt;Tags&lt;/span&gt;", MongoDBNull.Value } });
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;25
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;var note = json.ObjectFrom&amp;lt;Note&amp;gt;(noteDocument);&lt;/pre&gt;&lt;/pre&gt;Daniel montre ensuite l’utilisation de classes proxy générées avec Castle pour simplifier la sérialisation.&amp;nbsp; &lt;h2&gt;&lt;strong&gt;Auto-promotion&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;nVentive organise une série de bootcamps sur des sujets très variés comme WPF, TDD ou encore NHibernate.Tous ces ateliers sont orientés développement d’applications d’affaires et font une large place aux labs.&lt;/p&gt;
&lt;p&gt;Voici une &lt;a title="liste des &amp;eacute;v&amp;egrave;nements" href="http://www.eventbrite.com/org/249982715?s=1547965"&gt;liste des formations et leur description plus complète&lt;/a&gt;.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.nventive.net/Blog2/aggbug.ashx?id=23cbdd65-b013-4fa9-bd49-fbd7acee7808"/&gt;&lt;/div&gt;</description>
      <comments>http://www.nventive.net/Blog2/CommentView,guid,23cbdd65-b013-4fa9-bd49-fbd7acee7808.aspx</comments>
      <category>Revue du Web</category>
    </item>
    <item>
      <trackback:ping>http://www.nventive.net/Blog2/Trackback.aspx?guid=745c834e-95be-4018-a242-4f70e72e9dc7</trackback:ping>
      <pingback:server>http://www.nventive.net/Blog2/pingback.aspx</pingback:server>
      <pingback:target>http://www.nventive.net/Blog2/PermaLink,guid,745c834e-95be-4018-a242-4f70e72e9dc7.aspx</pingback:target>
      <dc:creator>nVentive Coach Factor</dc:creator>
      <wfw:comment>http://www.nventive.net/Blog2/CommentView,guid,745c834e-95be-4018-a242-4f70e72e9dc7.aspx</wfw:comment>
      <wfw:commentRss>http://www.nventive.net/Blog2/SyndicationService.asmx/GetEntryCommentsRss?guid=745c834e-95be-4018-a242-4f70e72e9dc7</wfw:commentRss>
      <title>Revue du web .NET du 8 février</title>
      <guid isPermaLink="false">http://www.nventive.net/Blog2/PermaLink,guid,745c834e-95be-4018-a242-4f70e72e9dc7.aspx</guid>
      <link>http://www.nVentive.net/Blog2/2010/02/08/RevueDuWebNETDu8F%c3%a9vrier.aspx</link>
      <pubDate>Mon, 08 Feb 2010 20:00:00 GMT</pubDate>
      <description>&lt;div&gt;&lt;h2&gt;&lt;b&gt;Les tweets de la semaine&lt;/b&gt; &lt;/h2&gt; &lt;p&gt;&lt;a href="http://twitter.com/pm5links/statuses/8498715256"&gt;http://twitter.com/pm5links/statuses/8498715256&lt;/a&gt; on a tous utilisé Reflector au moins une fois dans notre vie de développeur .NET. La version PRO payante de RedGate est prometteuse&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.lesnikowski.com/blog/index.php/testing-datetime-now/"&gt;http://www.lesnikowski.com/blog/index.php/testing-datetime-now/&lt;/a&gt; utiliser DateTime,Now dans du code semble inoffensive&amp;nbsp; jusuqu’au moment où vous écrivez votre test&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://twitter.com/Saucerdk/statuses/8670557833"&gt;http://twitter.com/Saucerdk/statuses/8670557833&lt;/a&gt; Symbian est devenu open source il y a quleques temps, on peut maintenant développer en .NET pour ce système d’explotation. Un peu trop tard ?&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;La question Stackoverflow&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;&lt;a href="http://stackoverflow.com/questions/1704487/algorithm-to-flatten-peak-usage-over-time"&gt;http://stackoverflow.com/questions/1704487/algorithm-to-flatten-peak-usage-over-time&lt;/a&gt; Comment répartir de façon égale une quantité dans un contenant subdivisble, voici une réponse qui fait intervenir une classe que nous connaissons tous mais utilisons peu : HashTable.&lt;/p&gt; &lt;h2&gt;&lt;b&gt;Actualités Microsoft&lt;/b&gt;&amp;nbsp;&lt;/h2&gt; &lt;p&gt;Microsoft a présenté ses résultats financiers en ce début 2010, et Windows 7 en plus d’être un système d’exploitation fini et réussi apporte un souffle financier signatificatif à l’éditeur. Comme l’explique &lt;a title="article de ArsTechnica sur les r&amp;eacute;sultats de Microsoft" href="http://arstechnica.com/microsoft/news/2010/01/windows-7-leads-the-way-to-record-quarter-for-microsoft.ars"&gt;ArsTechnica&lt;/a&gt;&amp;nbsp; les 60 millions de copies vendues lors ce trimestre sont sans doute pour beaucoup dans l’augmentation de 14% du chiffres d’affaires de Microsoft par rapport à l’année précèdente. Mais cet &lt;a title="op-ed du NYT" href="http://www.nytimes.com/2010/02/04/opinion/04brass.html"&gt;éditorial&lt;/a&gt; dans le New York Times d’un ancien vice-président de Microsoft sur les problèmes internes qui empêchent de faire emerger des produits innovants va sans doute un peu assombrir le tableau.&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;Actualités “Alt.NET”&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://code.google.com/p/sharp-architecture/"&gt;Sharp architecture&lt;/a&gt; est un projet qui se propose de faciliter le développement d’architecture en couches avec NHibernate. Commencé après un &lt;a title="article sur les bonnes pratiques avec NHibernate" href="http://www.codeproject.com/KB/architecture/NHibernateBestPractices.aspx"&gt;article&lt;/a&gt; sur codeproject (il y a presque 4 ans !), le projet est maintenant une application à part entière avec son site internet et un forum très actif. &lt;/p&gt; &lt;p&gt;On pourrait penser que ce ne sont que des bonnes pratiques d’architectes sans réelle application dans la vraie vie mais dans ce &lt;a title="utilisation de sharp architecture" href="http://devlicio.us/blogs/billy_mccafferty/archive/2010/02/03/using-s-arp-architecture-in-the-real-world.aspx"&gt;billet&lt;/a&gt; Billy McCafferty (créateur du projet) présente des applications en production qui utilisent ce “framework” dont Fancy Dress Outfitters &lt;a href="http://www.fancydressoutfitters.co.uk/"&gt;http://www.fancydressoutfitters.co.uk/&lt;/a&gt; . Ils lancent une autre application didactique cette fois-ci mais qui utilise les mêmes outils qu’une application réelle : &lt;a href="http://who-can-help.me/"&gt;http://who-can-help.me/&lt;/a&gt; dont le code source est &lt;a title="code source de l'application sur codeplex" href="http://whocanhelpme.codeplex.com/"&gt;disponible&lt;/a&gt;.&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;De l’autre côté&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;On parle design cette semaine ! La signature email, c’est un peu les sites web personnels, on a tout vu : le gif animé, les polices de caractères de couleur fluo ou qui changent à chaque syllabe sans parler de celles qui font 20 lignes et s’entassent lors des échanges. &lt;a title="signature" href="http://www.smashingmagazine.com/2010/02/04/the-art-and-science-of-the-email-signature/"&gt;Smahing Magazine&lt;/a&gt; nous présente une étude détaillée et nous livre quelques bons conseils.&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;Un projet&lt;/strong&gt;&amp;nbsp;&lt;/h2&gt; &lt;p&gt;&lt;a title="poscast sur le projet" href="http://herdingcode.com/?p=233"&gt;Fluent Migrator&lt;/a&gt; est issu d’une amélioration de &lt;a title="site internet du projet" href="http://code.google.com/p/migratordotnet/"&gt;Migrator.NET&lt;/a&gt; un outil pour migrer des données entre différentes SGBD mais surtout entre différentes version d’un schéma. La gestion de configuration des bases de données n’est pas chose aisée il est agréable de voir des outils pour y remédier.&lt;/p&gt; &lt;p&gt;En Migrator.NET on utilise des attributs pour versionner des actions à exécuter contre un schéma :&lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;[Migration(20080805151231)]
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; AddCustomerTable : Migration
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;{
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Up()
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        {
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                Database.AddTable("&lt;span style="color: #8b0000"&gt;Customer&lt;/span&gt;",
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                          &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Column("&lt;span style="color: #8b0000"&gt;name&lt;/span&gt;", DbType.String, 50),
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                          &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Column("&lt;span style="color: #8b0000"&gt;address&lt;/span&gt;", DbType.String, 100),
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                          &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Column("&lt;span style="color: #8b0000"&gt;age&lt;/span&gt;", DbType.Int32, 100)
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                         );
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        }
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Down()
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        {
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                Database.RemoveTable("&lt;span style="color: #8b0000"&gt;Customer&lt;/span&gt;");
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        }
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;}&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;L'attribut peut contenir un numéro version avec un entier ou un timestamp. Les actions possibles sont varíées : clés étrangères, du code SQL pour un SGBD particulier :&lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;[Migration(5)]
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; AddForeignKeyToTheBookAuthor : Migration
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;{
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; FK_NAME = "&lt;span style="color: #8b0000"&gt;FK_Book_Author&lt;/span&gt;";
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Up()
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        {
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                Database.AddForeignKey(FK_NAME, "&lt;span style="color: #8b0000"&gt;Book&lt;/span&gt;", "&lt;span style="color: #8b0000"&gt;authorId&lt;/span&gt;", "&lt;span style="color: #8b0000"&gt;Author&lt;/span&gt;", "&lt;span style="color: #8b0000"&gt;id&lt;/span&gt;");
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        }
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Down()
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        {
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                Database.RemoveForeignKey(FK_NAME);
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        }
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;}&lt;/pre&gt;&lt;/pre&gt;Une application console, des tâches Nant et &lt;a title="article pour utiliser MSBuild avec Migrator.NET" href="http://michielvoo.net/blog/configuring-migrator-net-as-an-external-tool-in-visual-studio-using-msbuild/"&gt;MSBuild&lt;/a&gt; existent pour exécuter et automatiser des migrations. 
&lt;p&gt;L’interface Fluent rajoutée par Sean Chambers simplifie l’API :&lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;[Migration(1)]
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; TestCreateAndDropTableMigration: Migration
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;{
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Up()
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	{
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;		Create.Table("&lt;span style="color: #8b0000"&gt;TestTable&lt;/span&gt;")
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;			.WithColumn("&lt;span style="color: #8b0000"&gt;Id&lt;/span&gt;").AsInt32().NotNullable().PrimaryKey().Identity()
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;			.WithColumn("&lt;span style="color: #8b0000"&gt;Name&lt;/span&gt;").AsString(255).NotNullable().WithDefaultValue("&lt;span style="color: #8b0000"&gt;Anonymous&lt;/span&gt;");
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;		
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;		Create.Index("&lt;span style="color: #8b0000"&gt;ix_Name&lt;/span&gt;").OnTable("&lt;span style="color: #8b0000"&gt;TestTable2&lt;/span&gt;").OnColumn("&lt;span style="color: #8b0000"&gt;Name&lt;/span&gt;").Ascending()
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;			.WithOptions().NonClustered();
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;		
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;		Create.ForeignKey("&lt;span style="color: #8b0000"&gt;fk_TestTable2_TestTableId_TestTable_Id&lt;/span&gt;")
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;			.FromTable("&lt;span style="color: #8b0000"&gt;TestTable2&lt;/span&gt;").ForeignColumn("&lt;span style="color: #8b0000"&gt;TestTableId&lt;/span&gt;")
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;			.ToTable("&lt;span style="color: #8b0000"&gt;TestTable&lt;/span&gt;").PrimaryColumn("&lt;span style="color: #8b0000"&gt;Id&lt;/span&gt;");
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;		Insert.IntoTable("&lt;span style="color: #8b0000"&gt;TestTable&lt;/span&gt;").Row(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; { Name = "&lt;span style="color: #8b0000"&gt;Test&lt;/span&gt;" });
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	}
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Down()
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	{
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;		Delete.Table("&lt;span style="color: #8b0000"&gt;TestTable2&lt;/span&gt;");
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;		Delete.Table("&lt;span style="color: #8b0000"&gt;TestTable&lt;/span&gt;");
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	}
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;}&lt;/pre&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;strong&gt;Auto-promotion&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;nVentive organise une série de bootcamps sur des sujets très variés comme WPF, TDD ou encore NHibernate.Tous ces ateliers sont orientés développement d’applications d’affaires et font une large place aux labs.&lt;/p&gt;
&lt;p&gt;Voici une &lt;a title="liste des &amp;eacute;v&amp;egrave;nements" href="http://www.eventbrite.com/org/249982715?s=1547965"&gt;liste des formations et leur description plus complète&lt;/a&gt;.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.nventive.net/Blog2/aggbug.ashx?id=745c834e-95be-4018-a242-4f70e72e9dc7"/&gt;&lt;/div&gt;</description>
      <comments>http://www.nventive.net/Blog2/CommentView,guid,745c834e-95be-4018-a242-4f70e72e9dc7.aspx</comments>
      <category>.net</category>
      <category>Revue du Web</category>
    </item>
    <item>
      <trackback:ping>http://www.nventive.net/Blog2/Trackback.aspx?guid=111fa30d-4e29-4fc1-84a8-9c863782a680</trackback:ping>
      <pingback:server>http://www.nventive.net/Blog2/pingback.aspx</pingback:server>
      <pingback:target>http://www.nventive.net/Blog2/PermaLink,guid,111fa30d-4e29-4fc1-84a8-9c863782a680.aspx</pingback:target>
      <dc:creator>nVentive Coach Factor</dc:creator>
      <wfw:comment>http://www.nventive.net/Blog2/CommentView,guid,111fa30d-4e29-4fc1-84a8-9c863782a680.aspx</wfw:comment>
      <wfw:commentRss>http://www.nventive.net/Blog2/SyndicationService.asmx/GetEntryCommentsRss?guid=111fa30d-4e29-4fc1-84a8-9c863782a680</wfw:commentRss>
      <title>Revue du web .NET du 1er février</title>
      <guid isPermaLink="false">http://www.nventive.net/Blog2/PermaLink,guid,111fa30d-4e29-4fc1-84a8-9c863782a680.aspx</guid>
      <link>http://www.nVentive.net/Blog2/2010/02/01/RevueDuWebNETDu1erF%c3%a9vrier.aspx</link>
      <pubDate>Mon, 01 Feb 2010 20:00:00 GMT</pubDate>
      <description>&lt;div&gt;&lt;h2&gt;&lt;b&gt;Les tweets de la semaine&lt;/b&gt; &lt;/h2&gt; &lt;p&gt;&lt;a href="http://twitter.com/MrWaz/statuses/8198003333"&gt;http://twitter.com/MrWaz/statuses/8198003333&lt;/a&gt; WCF avec Mono sur Solaris, si si c’est possible &lt;/p&gt; &lt;p&gt;&lt;a href="http://twitter.com/colinsurprenant/statuses/8203661366"&gt;http://twitter.com/colinsurprenant/statuses/8203661366&lt;/a&gt; un autre jour, un autre système de stockage clé-valeur&lt;/p&gt; &lt;p&gt;&lt;a href="http://twitter.com/webAgencyFAIL"&gt;http://twitter.com/webAgencyFAIL&lt;/a&gt; une sorte de Daily What the Fuck pour web agencies.&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;La question Stackoverflow&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://stackoverflow.com/questions/1204309/force-lazy-entity-to-load-real-instance"&gt;http://stackoverflow.com/questions/1204309/force-lazy-entity-to-load-real-instance&lt;/a&gt; Les framework modernes d’ORM gèrent&amp;nbsp; les associations polymorphiques de façon transparente pour le développeur mais il faut être conscient que cette magie peut vous jouer des tours (voir aussi le &lt;a title="billet sur Proxy" href="http://ayende.com/Blog/archive/2010/01/09/nhibernate-polymorphic-associations-and-ghost-objects.aspx"&gt;billet&lt;/a&gt; d’un des développeurs de NHIbernate sur ce sujet).&lt;/p&gt; &lt;h2&gt;&lt;b&gt;Actualités Microsoft&lt;/b&gt;&amp;nbsp;&lt;/h2&gt; &lt;p&gt;&lt;a href="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/Revueduweb.NETdu26octobre_90B0/vs2010perf_2.gif"&gt;&lt;img style="border-right-width: 0px; margin: 0px 5px 0px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="vs2010perf" border="0" alt="vs2010perf" align="left" src="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/Revueduweb.NETdu26octobre_90B0/vs2010perf_thumb.gif" width="400" height="307"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;On dirait que l’équipe de développement de Visual Studio a bien travaillé sur les performances de la dernière version de l’éditeur de code. Dans un &lt;a title="performance de visual studio 2010" href="http://blogs.msdn.com/bharry/archive/2010/01/24/state-of-vs-2010-performance.aspx"&gt;billet&lt;/a&gt; l’équipe nous mets l’eau à la bouche avec le résultat d’un sondage fait auprès des utilisateurs d’une version beta privée comportant les améliorations.&amp;nbsp; Cela ressemble à un feu vert pour la Release Candidate ?&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/h2&gt; &lt;h2&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/h2&gt; &lt;h2&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/h2&gt; &lt;h2&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/h2&gt; &lt;h2&gt;&lt;strong&gt;Actualités “Alt.NET”&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;Voici une &lt;a title="en bas de page le lien vers les podcast" href="http://skillsmatter.com/go/open-source-dot-net"&gt;série de podcasts&lt;/a&gt; autour des projets open-source ou des méthodes agiles du monde .NET (Architecture MVC, F#, Command Query, etc)&amp;nbsp; et si vous habitez pas très loin de Londres vous pouvez assister à deux évènements gratuits sous la forme de discussion avec Udi Dahan (créateur de NServiceBus) et Ayende Rahien sur NHibernate.&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;De l’autre côté&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;Pendant que nous développons (et livrons) avec des technologies comme Silverlight, Flex ou ASP.NET MVC, HTML 5 fait son bonhomme de chemin (en octobre 2009 la dernière phase du processus - initié en 2007- de validation de la spécification a commencé). Mais ce chemin n’est pas si paisible que ça : la dernière contreverse concerne le nouvel élèment &amp;lt;video&amp;gt; qui permet de présenter un média sans passer par un plug-in propriétaire. Or les premières implémentations de YouTube ou Vimeo utilisent des codecs supportant H.264 (non libre) et d’autres Ogg comme Firefox. Il faudra donc sans doute founir plusieurs versions du même média. Les &lt;a title="billets sur HTML5 et les codecs vid&amp;eacute;os" href="http://robertnyman.com/2010/01/25/the-video-element-in-html5-great-possibilites-but-also-codec-and-licensing-problems/"&gt;explications&lt;/a&gt; sur le site de Robert Nyman.&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;Un projet&lt;/strong&gt;&lt;/h2&gt; &lt;p&gt;&amp;nbsp;&lt;a title="le site codeplex" href="http://dejavu.codeplex.com/"&gt;DejaVu&lt;/a&gt; se propose de fournir une bibliothèque légère gérant un système de commandes, leurs objets et l’enregistrement de l’état des données pour revenir en arrière (undo / redo).Un des principaux arguments pour l’utilisation de DTO en lieu et place d’objets métiers (POCO) dans la couche de présentation vient du souhait de ne pas les polluer avec les préoccupations de cette couche : notification de changement (la famause interface INotifyPropertyChanged), des validations de premier niveau, et la gestion des modifications. &lt;a title="article sur codeproject" href="http://www.codeproject.com/KB/cs/AutomatingUndoRedo.aspx"&gt;Cet article&lt;/a&gt; sur codeproject est une bonne introduction à cette bibliothèque. Bien qu’on puisse sans doute améliorer son utilisation, elle fait réfléchir sur le problème sous-jacent.&lt;/p&gt; &lt;p&gt;Voici un exemple où on explicite le début de l’enregistrement des modifications et leur commit ou rollback :&lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;UndoRedoManager.Start("&lt;span style="color: #8b0000"&gt;My Command&lt;/span&gt;"); &lt;span style="color: #008000"&gt;// start point&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;data.Name = "&lt;span style="color: #8b0000"&gt;Name1&lt;/span&gt;";
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;data.Weight = 33;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;data.MyList.Add(other);
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;UndoRedoManager.Commit(); 
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #008000"&gt;//ou&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;UndoRedoManager.Undo();
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;strong&gt;Auto-promotion&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;nVentive organise une série de bootcamps sur des sujets très variés comme WPF, TDD ou encore NHibernate.Tous ces ateliers sont orientés développement d’applications d’affaires et font une large place aux labs.&lt;/p&gt;
&lt;p&gt;Voici une &lt;a title="liste des &amp;eacute;v&amp;egrave;nements" href="http://www.eventbrite.com/org/249982715?s=1547965"&gt;liste des formations et leur description plus complète&lt;/a&gt;.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.nventive.net/Blog2/aggbug.ashx?id=111fa30d-4e29-4fc1-84a8-9c863782a680"/&gt;&lt;/div&gt;</description>
      <comments>http://www.nventive.net/Blog2/CommentView,guid,111fa30d-4e29-4fc1-84a8-9c863782a680.aspx</comments>
      <category>.net</category>
      <category>Revue du Web</category>
    </item>
    <item>
      <trackback:ping>http://www.nventive.net/Blog2/Trackback.aspx?guid=bb13b1e9-7c28-4394-935a-dc448f17851d</trackback:ping>
      <pingback:server>http://www.nventive.net/Blog2/pingback.aspx</pingback:server>
      <pingback:target>http://www.nventive.net/Blog2/PermaLink,guid,bb13b1e9-7c28-4394-935a-dc448f17851d.aspx</pingback:target>
      <dc:creator>nVentive Coach Factor</dc:creator>
      <wfw:comment>http://www.nventive.net/Blog2/CommentView,guid,bb13b1e9-7c28-4394-935a-dc448f17851d.aspx</wfw:comment>
      <wfw:commentRss>http://www.nventive.net/Blog2/SyndicationService.asmx/GetEntryCommentsRss?guid=bb13b1e9-7c28-4394-935a-dc448f17851d</wfw:commentRss>
      <title>Revue du web .NET du 25 janvier</title>
      <guid isPermaLink="false">http://www.nventive.net/Blog2/PermaLink,guid,bb13b1e9-7c28-4394-935a-dc448f17851d.aspx</guid>
      <link>http://www.nVentive.net/Blog2/2010/01/25/RevueDuWebNETDu25Janvier.aspx</link>
      <pubDate>Mon, 25 Jan 2010 20:00:00 GMT</pubDate>
      <description>&lt;div&gt;&lt;h2&gt;&lt;b&gt;Les tweets de la semaine&lt;/b&gt; &lt;/h2&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://twitter.com/MichelSchep/statuses/7986002678"&gt;http://twitter.com/MichelSchep/statuses/7986002678&lt;/a&gt; une vue d’ensemble des API du .NET Framework 4 avec DeepZoom&lt;/p&gt; &lt;p&gt;&lt;a href="http://twitter.com/ReedCopsey/statuses/7959294663"&gt;http://twitter.com/ReedCopsey/statuses/7959294663&lt;/a&gt; Toujours .NET Framework 4, une série d’articles pour aborder le parallélisme&lt;/p&gt; &lt;p&gt;&lt;a href="http://twitter.com/jschmiede/statuses/7912861843"&gt;http://twitter.com/jschmiede/statuses/7912861843&lt;/a&gt; On connaît TFS, Cruise Control et PSake, voici Rake pour .NET en vidéo&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;La question Stackoverflow&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://stackoverflow.com/questions/2040924/best-way-to-communicate-between-net-1-1-and-net-3-5"&gt;http://stackoverflow.com/questions/2040924/best-way-to-communicate-between-net-1-1-and-net-3-5&lt;/a&gt; Comment faire communiquer une application basée sur la version 1.1 du Framework avec une application qui utilise la version 3.5 ? Socket, Remoting, WebServices tout y passe.&lt;/p&gt; &lt;h2&gt;&lt;b&gt;Actualités Microsoft&lt;/b&gt; et &lt;strong&gt;Actualités “Alt.NET”&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;Nous essayons d’avoir le contenu le plus original possible mais il est difficile de passer sous silence ce billet d’Ian Cooper sur la communauté &lt;a title="destin de alt.net" href="http://codebetter.com/blogs/ian_cooper/archive/2010/01/19/whither-alt-net.aspx"&gt;Alt.Net&lt;/a&gt;. Il est certain que la philosophie derrière ce mouvement (qui tourne autour de l’agilité, du TDD, des principes S.O.L.I.D. de développement) a fait du chemin dans la communauté .NET en général. Il est intéressant de voir les réactions / actions entre Microsoft et cette communauté dans divers domaines : ORM (Nhibernate, Entity- Framework, Subsonic etc.), IoC (Unity, StructureMap, Autofac) et le web: FubuMVC existerait-il si ASP.NET MVC n’avait pas été développé par Microsoft ? On espère que cette saine compétition continuera et s’étendra à d’autres domaines comme par exemple les ESB (on parle encore peu de AppFabric/Dublin, NServiceBus ou MassTransit). &lt;/p&gt; &lt;h2&gt;&lt;strong&gt;De l’autre côté&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;&amp;nbsp;&lt;a title="le projet" href="http://code.google.com/p/google-collections/"&gt;Google Collections&lt;/a&gt; est un projet comme il en existe beaucoup : compléter le framework Java dans un domaine bien particulier. &lt;a title="site web du proje apache commons" href="http://commons.apache.org/"&gt;Apache Commons&lt;/a&gt; est un autre exemple : client HTTP, Codecs, Emails etc… Il se sert du JDK 1.5 et des génériques pour apporter plus flexibilité, moins de friction dans l’usage des API de base. Par exemple faire un join &lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;Joiner.on("&lt;span style="color: #8b0000"&gt;, &lt;/span&gt;").join(iterable);
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;Joiner.on("&lt;span style="color: #8b0000"&gt;, &lt;/span&gt;").skipNulls().join(iterable);
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;Joiner.on("&lt;span style="color: #8b0000"&gt;, &lt;/span&gt;").useForNull("&lt;span style="color: #8b0000"&gt;&amp;lt;null&amp;gt;&lt;/span&gt;").join(iterable);&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;Voici &lt;a title="introduction &amp;agrave; Google Collections" href="http://users.mafr.de/~matthias/articles/google-collections.html"&gt;un article&lt;/a&gt; concis qui montre les fonctionnalités de la bibliothèque.&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;Un projet&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="http://www.codeplex.com/htmlagilitypack"&gt;HTML Agility Pack&lt;/a&gt; est une bibliothèque pour parser du code HTML, une tâche des plus ingrates qui puisse exister pour un développeur (après écrire une documentation peut-être). Les navigateurs pardonnant beaucoup il existe beaucoup de pages qui ne respectent pas les schémas sans parler des pages générées qui rendent le code des plus exotiques. &lt;/p&gt;
&lt;p&gt;Ce projet qui a connu en fin d’année dernière un renouveau grâce à une série de patchs et maintenant un nouveau lead technique a encore rendu son utilisation plus agréable : requête de type XPath avec l’usage de Linq, Extraction facile du texte nettoyé des balises html etc.&lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;var atts = _doc.DocumentNode.SelectNodes("&lt;span style="color: #8b0000"&gt;//*[@background or @lowsrc or @src or @href]&lt;/span&gt;");
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;var hrefs = _doc.DocumentNode.SelectNodes("&lt;span style="color: #8b0000"&gt;//a[@href]&lt;/span&gt;");
&lt;/pre&gt;&lt;pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;var nodes = from node &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; hrefs
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            where node.Attributes["&lt;span style="color: #8b0000"&gt;target&lt;/span&gt;"].Value == "&lt;span style="color: #8b0000"&gt;_blank&lt;/span&gt;"
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	    select node;&lt;/pre&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;strong&gt;Auto-promotion&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;nVentive organise une série de bootcamps sur des sujets très variés comme WPF, TDD ou encore NHibernate.Tous ces ateliers sont orientés développement d’applications d’affaires et font une large place aux labs.&lt;/p&gt;
&lt;p&gt;Voici une &lt;a title="liste des &amp;eacute;v&amp;egrave;nements" href="http://www.eventbrite.com/org/249982715?s=1547965"&gt;liste des formations et leur description plus complète&lt;/a&gt;.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.nventive.net/Blog2/aggbug.ashx?id=bb13b1e9-7c28-4394-935a-dc448f17851d"/&gt;&lt;/div&gt;</description>
      <comments>http://www.nventive.net/Blog2/CommentView,guid,bb13b1e9-7c28-4394-935a-dc448f17851d.aspx</comments>
      <category>.net</category>
      <category>Revue du Web</category>
    </item>
    <item>
      <trackback:ping>http://www.nventive.net/Blog2/Trackback.aspx?guid=c81d7d1e-3c30-41a5-a389-5e9d61f330b7</trackback:ping>
      <pingback:server>http://www.nventive.net/Blog2/pingback.aspx</pingback:server>
      <pingback:target>http://www.nventive.net/Blog2/PermaLink,guid,c81d7d1e-3c30-41a5-a389-5e9d61f330b7.aspx</pingback:target>
      <dc:creator>nVentive Coach Factor</dc:creator>
      <wfw:comment>http://www.nventive.net/Blog2/CommentView,guid,c81d7d1e-3c30-41a5-a389-5e9d61f330b7.aspx</wfw:comment>
      <wfw:commentRss>http://www.nventive.net/Blog2/SyndicationService.asmx/GetEntryCommentsRss?guid=c81d7d1e-3c30-41a5-a389-5e9d61f330b7</wfw:commentRss>
      <title>Revue du web .NET du 18 janvier</title>
      <guid isPermaLink="false">http://www.nventive.net/Blog2/PermaLink,guid,c81d7d1e-3c30-41a5-a389-5e9d61f330b7.aspx</guid>
      <link>http://www.nVentive.net/Blog2/2010/01/18/RevueDuWebNETDu18Janvier.aspx</link>
      <pubDate>Mon, 18 Jan 2010 20:00:00 GMT</pubDate>
      <description>&lt;div&gt;&lt;h2&gt;&lt;b&gt;Les tweets de la semaine&lt;/b&gt; &lt;/h2&gt; &lt;p&gt;&lt;a href="http://twitter.com/csharp_tan/status/7857602895"&gt;http://twitter.com/csharp_tan/status/7857602895&lt;/a&gt; une liste des frameworks MVVM (Model View VierwModel – un des patrons de conception pour la couche de présentation) &lt;/p&gt; &lt;p&gt;&lt;a href="http://twitter.com/wanswins/status/7793053854"&gt;http://twitter.com/wanswins/status/7793053854&lt;/a&gt; on vous parlait la &lt;a title="dans l'&amp;eacute;pisode pr&amp;eacute;c&amp;eacute;dent" href="http://www.nventive.net/Blog2/2010/01/12/RevueDuWebNETDu11Janvier.aspx"&gt;semaine dernière&lt;/a&gt; de Script# un compilateur C# vers Javascript, il en existe d’autres comme sharpkit&lt;/p&gt; &lt;p&gt;&lt;a href="http://twitter.com/dotnettv/statuses/7745427907"&gt;http://twitter.com/dotnettv/statuses/7745427907&lt;/a&gt; Event Driven architecture en vidéo&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;La question Stackoverflow&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;Nous allons parler d’une méta-question aujourd’hui : Quelle API doit avoir &lt;a title="la question" href="http://meta.stackoverflow.com/questions/33397/sxapi-a-net-api-for-so-f-u-meta-updated-to-version-4-0"&gt;Stackoverflow&lt;/a&gt; ? Le projet a été annoncé sur le &lt;a title="le billet sur la future API" href="http://blog.stackoverflow.com/2010/01/what-would-a-stack-overflow-api-look-like/"&gt;blog&lt;/a&gt; et déjà une liste de possibles &lt;a href="http://meta.stackoverflow.com/questions/35723"&gt;applications&lt;/a&gt; est apparue. Une application web n’est une application web sans une API externe : quels formats supportés, le mode d’authentification, lecture seulement etc. ? &lt;/p&gt; &lt;h2&gt;&lt;b&gt;Actualités Microsoft&lt;/b&gt; &lt;/h2&gt; &lt;p&gt;La saison des conférences va commencer dans quelques semaines : &lt;a href="http://visitmix.com/"&gt;Mix 2010&lt;/a&gt; où on devait parler de Visual Studio mais on entendra plus parler de Silverlight 4 et on espère de Internet Explorer 9 et Windows Mobile 7. Le lancement de Visual Studio sera annoncé le 12 avril lors de la conférence &lt;a title="DevConnections" href="http://www.devconnections.com/"&gt;Devconnections&lt;/a&gt; Visual Studio&amp;nbsp; &lt;/p&gt; &lt;h2&gt;&lt;strong&gt;Actualités “Alt.NET”&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;S’il y a bien un domaine où le monde .NET est actif c’est celui des frameworks de mapping objet-relationnel (et on dirait que cela se transpose dans le développement de frameworks de présentation WPF ou même du côté&amp;nbsp; web avec MVC). Voici un billet d’humour qui résume bien &lt;a title="les frameworks ORM vus les uns par les autres" href="http://www.kevinwilliampang.com/post/How-Fanboys-See-NET-ORMs.aspx"&gt;les relations entre eux&lt;/a&gt;. Un classique mais toujours efficace.&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;De l’autre côté&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;ToughtWorks édite &lt;a title="le produit" href="http://www.thoughtworks-studios.com/mingle-agile-project-management"&gt;Mingle&lt;/a&gt; qui est une application de gestion de projet supportant les méthodes agile. Ce dernier utilise une base de données : Mysql, Postgresql ou Oracle. L’éditeur a décidé d’abondonner &lt;a title="billet sur la d&amp;eacute;cision" href="http://community.thoughtworks.com/posts/a0e9ee4773"&gt;le support de Mysql&lt;/a&gt;. C’est un SGBD très flexible : il y a une multitude d’autres moteurs de stockage que ISAM ou Innodb (livrés en standard) pour couvrir des besoins telle que les gros volumes. Mais il semblerait que certains se tournent vers des applications plus spécialisées (voir le mouvement Nosql (MongoDb, CouchDb etc ) ou plus orientées “entreprise”comme Postgresql.&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;Un projet&lt;/strong&gt;&lt;/h2&gt; &lt;p&gt;Pas un projet mais une liste de projets cette semaine : &lt;a href="http://csharpopensource.com/"&gt;C# open source&lt;/a&gt; (base de données, PDF, CRM). Comme son l’indique ce site répertorie les projets open-source du monde .NET par catégorie. On pourra consulter aussi &lt;a title="site annuaire d'outils" href="http://sharptoolbox.com/"&gt;SharpToollbox&lt;/a&gt; qui est plus orienté outils de développement.&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;Auto-promotion&lt;/strong&gt;&lt;/h2&gt; &lt;p&gt;nVentive organise une série de bootcamps sur des sujets très variés comme WPF, TDD ou encore NHibernate.Tous ces ateliers sont orientés développement d’applications d’affaires et font une large place aux labs.&lt;/p&gt; &lt;p&gt;Voici une &lt;a title="liste des &amp;eacute;v&amp;egrave;nements" href="http://www.eventbrite.com/org/249982715?s=1547965"&gt;liste des formations et leur description plus complète&lt;/a&gt;.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.nventive.net/Blog2/aggbug.ashx?id=c81d7d1e-3c30-41a5-a389-5e9d61f330b7"/&gt;&lt;/div&gt;</description>
      <comments>http://www.nventive.net/Blog2/CommentView,guid,c81d7d1e-3c30-41a5-a389-5e9d61f330b7.aspx</comments>
      <category>.net</category>
      <category>Revue du Web</category>
    </item>
    <item>
      <trackback:ping>http://www.nventive.net/Blog2/Trackback.aspx?guid=90a686d6-8eea-4bce-a651-10f209f7528a</trackback:ping>
      <pingback:server>http://www.nventive.net/Blog2/pingback.aspx</pingback:server>
      <pingback:target>http://www.nventive.net/Blog2/PermaLink,guid,90a686d6-8eea-4bce-a651-10f209f7528a.aspx</pingback:target>
      <dc:creator>nVentive Coach Factor</dc:creator>
      <wfw:comment>http://www.nventive.net/Blog2/CommentView,guid,90a686d6-8eea-4bce-a651-10f209f7528a.aspx</wfw:comment>
      <wfw:commentRss>http://www.nventive.net/Blog2/SyndicationService.asmx/GetEntryCommentsRss?guid=90a686d6-8eea-4bce-a651-10f209f7528a</wfw:commentRss>
      <title>Revue du web .NET du 11 janvier</title>
      <guid isPermaLink="false">http://www.nventive.net/Blog2/PermaLink,guid,90a686d6-8eea-4bce-a651-10f209f7528a.aspx</guid>
      <link>http://www.nVentive.net/Blog2/2010/01/12/RevueDuWebNETDu11Janvier.aspx</link>
      <pubDate>Tue, 12 Jan 2010 10:02:00 GMT</pubDate>
      <description>&lt;div&gt;&lt;h2&gt;&lt;b&gt;Les tweets de la semaine&lt;/b&gt; &lt;/h2&gt; &lt;p&gt;&lt;a href="http://twitter.com/penderi/statuses/7514754215"&gt;http://twitter.com/penderi/statuses/7514754215&lt;/a&gt; Souvent cité comme l’outil indispensable de Visual Studio, Resharper 5 est en beta et la dernière version semble prometteuse&lt;/p&gt; &lt;p&gt;&lt;a href="http://twitter.com/dougcunha/status/7496302216"&gt;http://twitter.com/dougcunha/status/7496302216&lt;/a&gt; un aide-mémoire sur les principaux opérateurs Linq sous la forme de 101 exemples.&lt;/p&gt; &lt;p&gt;&lt;a href="http://twitter.com/escobar5/statuses/7406606555"&gt;http://twitter.com/escobar5/statuses/7406606555&lt;/a&gt; attention long article sur les fondamentaux de Linq&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;La question Stackoverflow&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://stackoverflow.com/questions/2030636/c-read-only-calculated-properties-should-they-be-methods"&gt;http://stackoverflow.com/questions/2030636/c-read-only-calculated-properties-should-they-be-methods&lt;/a&gt; les propriétés calculées en .NET : doit-on coder une méthode ou une propriété en lecture seule ?&lt;/p&gt; &lt;h2&gt;&lt;b&gt;Actualités Microsoft&lt;/b&gt; &lt;/h2&gt; &lt;p&gt;C’est peut-être une des nouvelles fonctionnalités de Silverlight 4 les moins discutées : l’incorporation de MEF dans le runtime. MEF est un framework open-source soutenu par Microsoft pour construire des applications extensibles en fournissant un système de plug-ins. Voici une série de vidéos pour aborder le nouveau couple &lt;a title="MEF et Silverlight" href="http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2009/12/31/silverlight-4-screencasts-the-managed-extensibility-framework-mef.aspx"&gt;MEF et Silverlight&lt;/a&gt;.&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;Actualités “Alt.NET”&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;Une des évolutions du TDD, BDD (Behaviour Driven Design) se propose de fournir une définition des tests en langage presque naturel et surtout très proche du domaine métier (c’est en cela qu’on présente le BDD comme étant du TDD + DDD). &lt;a title="Cucumber framework" href="http://cukes.info/"&gt;Cucumber&lt;/a&gt; est un framework BDD ruby mais qui supporte .NET et Java, Gojko Adzic en donne un exemple dans &lt;a title="Cucumber en .NET" href="http://gojko.net/2010/01/01/bdd-in-net-with-cucumber-cuke4nuke-and-teamcity/"&gt;un billet&lt;/a&gt;.&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;De l’autre côté&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;&lt;a href="http://www.djangoproject.com/"&gt;Django&lt;/a&gt; est un framework web fondé sur le langage Python. Il a fait à Python ce que Ruby on Rails a fait à Ruby : démocratiser l’usage d’un langage pas très populaire. Ce &lt;a title="8 reasons to love django" href="http://www.coderholic.com/8-reasons-why-you-should-try-django/"&gt;développeur&lt;/a&gt; parle de son expérience en mettant en avant les fonctionnalités souvent citées : ORM, templating, interface d’administration. De plus le langage a connu un regain d’intérêt quand Google l’a choisi pour sa plate-forme cloud Google App Engine (depuis complétée avec Java). &lt;/p&gt; &lt;h2&gt;&lt;strong&gt;Un projet&lt;/strong&gt;&lt;/h2&gt; &lt;p&gt;&lt;a title="page sur script#" href="http://projects.nikhilk.net/ScriptSharp"&gt;Script#&lt;/a&gt; est peu reconnu car c’est plus un outil qu’un Framework web classique comme ASP.NET MVC. Son développeur, Nikhil Kothari, est connu dans la communauté .NET pour fabriquer beaucoup de choses dans son “garage”. Script# est un compilateur C# vers Javascript pour être utilisé dans des applications web ou des gadgets Vista par exemple. L’une des applications de Microsoft qui l’utilise est &lt;a title="le blog de office web apps" href="http://blogs.msdn.com/officewebapps/"&gt;Office Web&lt;/a&gt;, la version en ligne des applications bureautiques.&lt;/p&gt; &lt;p&gt;L’expérience de codage en C# : &lt;/p&gt; &lt;p&gt;&lt;a href="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/Revueduweb.NETdu26octobre_90B0/scriplet.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="scriplet" border="0" alt="scriplet" src="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/Revueduweb.NETdu26octobre_90B0/scriplet_thumb.png" width="634" height="484"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Le debug : &lt;/p&gt; &lt;p&gt;&lt;a href="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/Revueduweb.NETdu26octobre_90B0/debug.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="debug" border="0" alt="debug" src="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/Revueduweb.NETdu26octobre_90B0/debug_thumb.png" width="624" height="549"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Script# permet aussi la communication avec le serveur (JSON), incorpore une bibliothèque de composants graphiques de base comme la textbox mais aussi des textboxes avec des comportements auto-complétion ou watermaquée&amp;nbsp; etc. &lt;/p&gt; &lt;p&gt;Pour avoir une idée plus précise des possibilités et des limitations n’oubliez pas de parcourir le fichier PDF &lt;a href="http://projects.nikhilk.net/Content/Projects/ScriptSharp/ScriptSharp.pdf"&gt;readme&lt;/a&gt; (40 pages) qui est une vraie documentation.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.nventive.net/Blog2/aggbug.ashx?id=90a686d6-8eea-4bce-a651-10f209f7528a"/&gt;&lt;/div&gt;</description>
      <comments>http://www.nventive.net/Blog2/CommentView,guid,90a686d6-8eea-4bce-a651-10f209f7528a.aspx</comments>
      <category>.net</category>
      <category>Revue du Web</category>
    </item>
    <item>
      <trackback:ping>http://www.nventive.net/Blog2/Trackback.aspx?guid=a0e7a710-4ae8-4984-acac-75835ed245a4</trackback:ping>
      <pingback:server>http://www.nventive.net/Blog2/pingback.aspx</pingback:server>
      <pingback:target>http://www.nventive.net/Blog2/PermaLink,guid,a0e7a710-4ae8-4984-acac-75835ed245a4.aspx</pingback:target>
      <dc:creator>nVentive Coach Factor</dc:creator>
      <wfw:comment>http://www.nventive.net/Blog2/CommentView,guid,a0e7a710-4ae8-4984-acac-75835ed245a4.aspx</wfw:comment>
      <wfw:commentRss>http://www.nventive.net/Blog2/SyndicationService.asmx/GetEntryCommentsRss?guid=a0e7a710-4ae8-4984-acac-75835ed245a4</wfw:commentRss>
      <title>Revue du web .NET du 15 décembre</title>
      <guid isPermaLink="false">http://www.nventive.net/Blog2/PermaLink,guid,a0e7a710-4ae8-4984-acac-75835ed245a4.aspx</guid>
      <link>http://www.nVentive.net/Blog2/2009/12/14/RevueDuWebNETDu15D%c3%a9cembre.aspx</link>
      <pubDate>Mon, 14 Dec 2009 22:26:07 GMT</pubDate>
      <description>&lt;div&gt;&lt;h2&gt;&lt;b&gt;Les tweets de la semaine&lt;/b&gt; &lt;/h2&gt; &lt;p&gt;&lt;a href="http://twitter.com/thierry_n/statuses/6581723672"&gt;http://twitter.com/thierry_n/statuses/6581723672&lt;/a&gt; : une nouvelle version de Mono, qui voit son offre commerciale prendre forme avec Mono Touch (développement pour l’iPhone), Mono Tools for Visual Studio et la plateforme serveur avec support (Suse Linux). Au passage le compilateur Mono devient aussi “C# 4.0 compatible”.&lt;/p&gt; &lt;p&gt;&lt;a href="http://twitter.com/EdgarSanchez/statuses/6566426910"&gt;http://twitter.com/EdgarSanchez/statuses/6566426910&lt;/a&gt; on parlait la semaine dernière de GWT, Volta, voici un produit open source commercial, SharpKit, qui permet de travailler en C# et compiler vers Javascript et vice versa. &lt;/p&gt; &lt;h2&gt;&lt;strong&gt;La question Stackoverflow&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://stackoverflow.com/questions/1681546/custom-wpf-control-dependency-property-not-binding-to-external-dp/1681624#1681624"&gt;http://stackoverflow.com/questions/1681546/custom-wpf-control-dependency-property-not-binding-to-external-dp/1681624#1681624&lt;/a&gt; Les “dependency properties” de WPF sont un des aspects les plus puissants du framework mais aussi un des plus difficiles à appréhender. Ici un exemple qui met en lumière l’importance des metadata associées aux DP.&lt;/p&gt; &lt;h2&gt;&lt;b&gt;Actualités Microsoft&lt;/b&gt; &lt;/h2&gt; &lt;p&gt;Bien que &lt;a title="Patrick Smacchia et VS2010" href="http://codebetter.com/blogs/patricksmacchia/archive/2009/12/08/a-vs-2010-beta3-would-be-welcomed.aspx"&gt;certains&lt;/a&gt; pensent qu’une beta 3 ou une RC pour Visual Studio 2010 serait la bienvenue, la date de sortie (22 mars 2010) approche (moins de 100 jours maintenant). Dans &lt;a href="http://blogs.msdn.com/somasegar/archive/2009/12/09/creating-extensions-for-vs-2010.aspx"&gt;cet article&lt;/a&gt;, Somasegar présente les nouveautés autour du développement d’add-in pour Visual Studio :&lt;/p&gt; &lt;ul&gt; &lt;li&gt;un SDK de 10 MB au lieu de 100 MB (= documentation en ligne)&amp;nbsp; &lt;li&gt;WPF comme framework de base  &lt;li&gt;facilité d’extension autour de l’éditeur  &lt;li&gt;un &lt;a title="extension gallerie" href="http://visualstudiogallery.msdn.microsoft.com/en-us/"&gt;site renouvelé&lt;/a&gt; pour découvrir les extensions existantes&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;On pourra consulter aussi &lt;a title="vid&amp;eacute;os sur channel 9" href="http://channel9.msdn.com/tags/Development-Tools-Ecosystem-Summit/"&gt;les nombreuses vidéos&lt;/a&gt; issues de la conférence “Development Tools Ecosystem” &lt;/p&gt; &lt;h2&gt;&lt;strong&gt;Actualités “Alt.NET”&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;&lt;a title="le site de DDD France" href="www.dddfrance.org"&gt;DDDFrance&lt;/a&gt; est un site francophone qui propose des ressources autour du Domain Drivern Design en français. Par exemple le livre DDD Quickly a été traduit : &lt;a title="lien vers la page du livre" href="http://www.dddfrance.org/DDDViteFait"&gt;DDD vite fait&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;Au passage, en suivant les principes du DDD dont l’utilisation au plus proche du langage du domaine métier, doit-on coder en anglais ou dans &lt;a title="DDD en VO ou pas ?" href="http://www.dddfrance.org/EcrireLeCodeDansSaLangueMaternelle"&gt;sa langue maternelle&lt;/a&gt; ? &lt;/p&gt; &lt;h2&gt;&lt;strong&gt;De l’autre côté&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;&lt;a title="Virtual Box" href="http://www.virtualbox.org"&gt;VirtualBox&lt;/a&gt; est une application de virtualisation rachetée par SUN il y a maintenant un peu plus d’un an. La version 3.1 sortie fin novembre apporte des fonctionnalités telle que la migration “live’” d’une instance d’un hôte à un autre ou encore la restauration à partir d’un snapshot (arbitraire et non le dernier). Un &lt;a title="console pour virtual box" href="http://code.google.com/p/vboxweb/"&gt;projet&lt;/a&gt; communautaire fournit une console web pour administrer les machines virtuelles.&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;Un projet&lt;/strong&gt;&lt;/h2&gt; &lt;p&gt;&lt;a title="le site du projet" href="http://statlight.net/"&gt;&lt;img style="border-right-width: 0px; margin: 0px 0px 5px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="StatLight.logo.home" border="0" alt="StatLight.logo.home" align="left" src="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/Revueduweb.NETdu26octobre_90B0/StatLight.logo.home_3.jpg" width="244" height="83"&gt;&lt;/a&gt;&amp;nbsp;&lt;a title="le site du projet" href="http://statlight.net/"&gt;Statlight&lt;/a&gt; est un framework de tests automatisés pour Silverlight. Vous pouvez le penser un peu comme le Nunit de Silverlight. Dans la définition de xUnit et du TDD en général il faut que l’outil fournisse un moyen de :&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;définir les tests (attributs) &lt;li&gt;les exécuter  &lt;li&gt;vérifier les résultats (méthodes d’assertions) &lt;li&gt;et les assembler en suite&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Il faut d’abord se procurer le &lt;a title="template de TU pour silverlight" href="http://code.msdn.microsoft.com/silverlightut/"&gt;template&lt;/a&gt; de projet de tests unitaires pour Silverlight et le code source du framework de test unitaires (on le trouvera dans le sous-répertoire source code du toolkit : C:\Program Files (x86)\Microsoft SDKs\Silverlight\v3.0\Toolkit\Jul09\Source par exemple, extraire les dlls du répertoires binaries du dossier compressé). Vous devez arriver à cette structure&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/Revueduweb.NETdu26octobre_90B0/setup.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="setup" border="0" alt="setup" src="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/Revueduweb.NETdu26octobre_90B0/setup_thumb.png" width="234" height="244"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Voici un test sur l’interface : &lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;[TestClass]
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Test : SilverlightTest
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;{
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; MainPage sut;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; [TestInitialize]
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Setup()
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; {
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    sut = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; MainPage();
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #008000"&gt;//pour nettoyer les pages entre chaque TU&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.TestPanel.Children.Add(sut);
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; }
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; [TestMethod]
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; TestButton()
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; {
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    Assert.AreEqual(300, sut.Width);
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #008000"&gt;//no automation&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #008000"&gt;//visible with the [assembly: &lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #008000"&gt;//InternalsVisibleTo("MySLApplication.Tests")] &lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    sut.Button_Click(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;);
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    Assert.AreEqual(Visibility.Visible, sut.childrenPanel.Visibility);
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; }
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;}&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;Le changement de visibilité sur les contrôles et l’assembly vient du manque d’automation dans le Framework de test. Quand vous lancez le test une page apparaît avec les résultats : &lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/Revueduweb.NETdu26octobre_90B0/resultat.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="resultat du test" border="0" alt="resultat du test" src="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/Revueduweb.NETdu26octobre_90B0/resultat_thumb.png" width="244" height="203"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;a title="le site du projet" href="http://statlight.net/"&gt;Statlight&lt;/a&gt; permet d’automatiser cette démarche et est compatible avec TeamCity ou MSBuild par exemple. Ici on ajoute l’appel à l’outil dans un post-build (à exécuter avec un compte admnistrateur) :&lt;/p&gt;
&lt;p&gt;C:\StatLight.v0.9\StatLight.exe -x='C:/Projects/MySLApplication.Tests/Bin/Debug/MySLApplication.Tests.xap"&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/Revueduweb.NETdu26octobre_90B0/image_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="r&amp;eacute;sultat du test dans VS" border="0" alt="r&amp;eacute;sultat du test dans VS" src="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/Revueduweb.NETdu26octobre_90B0/image_thumb.png" width="594" height="232"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;La version de Visual Studio 2010 de Web Testing devrait être compatible Silverlight mais en attendant et/ou vous êtes sur une plateforme moins récente, StatLight est l’outil à évaluer.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.nventive.net/Blog2/aggbug.ashx?id=a0e7a710-4ae8-4984-acac-75835ed245a4"/&gt;&lt;/div&gt;</description>
      <comments>http://www.nventive.net/Blog2/CommentView,guid,a0e7a710-4ae8-4984-acac-75835ed245a4.aspx</comments>
      <category>.net</category>
      <category>Revue du Web</category>
    </item>
    <item>
      <trackback:ping>http://www.nventive.net/Blog2/Trackback.aspx?guid=960a95d3-7c89-4fd7-b066-eb96682d0f1b</trackback:ping>
      <pingback:server>http://www.nventive.net/Blog2/pingback.aspx</pingback:server>
      <pingback:target>http://www.nventive.net/Blog2/PermaLink,guid,960a95d3-7c89-4fd7-b066-eb96682d0f1b.aspx</pingback:target>
      <dc:creator>nVentive Coach Factor</dc:creator>
      <wfw:comment>http://www.nventive.net/Blog2/CommentView,guid,960a95d3-7c89-4fd7-b066-eb96682d0f1b.aspx</wfw:comment>
      <wfw:commentRss>http://www.nventive.net/Blog2/SyndicationService.asmx/GetEntryCommentsRss?guid=960a95d3-7c89-4fd7-b066-eb96682d0f1b</wfw:commentRss>
      <title>Revue du web .NET du 8 décembre</title>
      <guid isPermaLink="false">http://www.nventive.net/Blog2/PermaLink,guid,960a95d3-7c89-4fd7-b066-eb96682d0f1b.aspx</guid>
      <link>http://www.nVentive.net/Blog2/2009/12/08/RevueDuWebNETDu8D%c3%a9cembre.aspx</link>
      <pubDate>Tue, 08 Dec 2009 22:44:00 GMT</pubDate>
      <description>&lt;div&gt;&lt;h2&gt;&lt;b&gt;Les tweets de la semaine&lt;/b&gt; &lt;/h2&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://twitter.com/sbohlen/statuses/6236293827"&gt;http://twitter.com/sbohlen/statuses/6236293827&lt;/a&gt; les vidéos de la NotAtPdc sont en lignes. &lt;/p&gt; &lt;p&gt;&lt;a href="http://twitter.com/programmingjoy/status/6296011683"&gt;http://twitter.com/programmingjoy/status/6296011683&lt;/a&gt; Mono everywhere ? Un projet qui le rend disponible pour Android.&lt;/p&gt; &lt;p&gt;&lt;a href="http://twitter.com/thbonk/status/6235070045"&gt;http://twitter.com/thbonk/status/6235070045&lt;/a&gt; Windows Mobile n’a pas peut-être pas l’interface utilisateur qu’il mérite mais il a tous les atouts d’un système d’entreprise dont la présence d’un système de messaging comme MSMQ&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;La question Stackoverflow&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;&amp;nbsp;&lt;a title="question stackoverflow" href="http://stackoverflow.com/questions/1855211/how-to-store-several-states-in-one-variable"&gt;http://stackoverflow.com/questions/1855211/how-to-store-several-states-in-one-variable&lt;/a&gt; on connaît tous les énumérations mais leur utilisation en tant que flag (combinaison de plusieurs valeurs) est moins évidente même si souvent rencontrée dans le Framework lui-même.&lt;/p&gt; &lt;h2&gt;&lt;b&gt;Actualités Microsoft&lt;/b&gt; &lt;/h2&gt; &lt;p&gt;Une des nouveautés du .NET Framework 4 sont les API autour du parallélisme. Afin de profiter des processeurs à cœurs multiples Microsoft ajoute des classes de base pour simplifier le développement de traitements en parallèle. On a beaucoup entendu parler de PLinq qui permet d’appliquer des traitements parallélisés à des ensembles d’objets. Task Parallel Library (TPL) est moins connue, &lt;a title="article sur TPL" href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=c3ea8fb5-650d-434b-a216-7e54c53965d1"&gt;un article au format PDF&lt;/a&gt; permet de découvrir les tâches parent-enfant, leur utilisation et leur debugging.&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;Actualités “Alt.NET”&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;Un nouveau site qui dépasse le monde .NET : &lt;a href="http://www.algorithmatic.com/browse"&gt;http://www.algorithmatic.com/browse&lt;/a&gt; pour apprendre, découvrir et contribuer à un répertoire d’algorithmes, le site est en ASP.NET MVC et l’éditeur de code en Silverlight. &lt;/p&gt; &lt;h2&gt;&lt;strong&gt;De l’autre côté&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;La spécification de JavaEE a été &lt;a title="un billet sur la sp&amp;eacute;cification JavaEE 6" href="http://sacha.labourey.com/2009/12/03/ee6-has-been-approved-yet/"&gt;voté&lt;/a&gt;e cette semaine.&amp;nbsp; Le vote (non) de la fondation Apache reflète une inquiétude grandissante chez les membres du comité d’après &lt;a href="http://www.theserverside.com/news/thread.tss?thread_id=58718"&gt;TheServideSide.com&lt;/a&gt; sans parler du &lt;a title="d&amp;eacute;bat sur le JCP" href="http://www.theserverside.com/news/thread.tss?thread_id=58629"&gt;débat&lt;/a&gt; sur le processus même d’évolution, certains militant pour un abandon du JCP (Java Community Process) pour un modèle complètement Open Source.&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;Un projet&lt;/strong&gt;&lt;/h2&gt; &lt;p&gt;&lt;a href="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/Revueduweb.NETdu26octobre_90B0/wix_2.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="logo de wix" border="0" alt="logo de wix" align="left" src="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/Revueduweb.NETdu26octobre_90B0/wix_thumb.gif" width="125" height="94"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;Dans ce monde d’applications web ou SAAS (Software As A Service) on en oublierait presque les programmes d’installation… &lt;/p&gt; &lt;p&gt;&lt;a title="site du projet Wix" href="http://wix.sourceforge.net/index.html"&gt;Wix&lt;/a&gt; est un projet que Microsoft a arrêté de développer et l’a mis à disposition de la communauté qui l’a fait vivre depuis : la version 3 est sortie cet été. &lt;/p&gt; &lt;p&gt;Wix est un outil pour packager les applications. Comme l’illustre &lt;a title="tutorial de Wix" href="http://www.tramontana.co.hu/wix/"&gt;le tutorial&lt;/a&gt; très riche, les fonctionnalités de Wix sont riches. Basé sur XML il vous permet de gérer les dépendances comme le .NET Framework, les raccourcis ou encore les fichiers d’aide etc. Le support de Visual Studio 2008 prend la forme de plusieurs types de projets dont les customs actions pour étendre l’installation avec des étapes personnalisées. La mise à jour d’application est aussi gérée.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/Revueduweb.NETdu26octobre_90B0/wixProjetcs.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="wixProjetcs" border="0" alt="wixProjetcs" src="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/Revueduweb.NETdu26octobre_90B0/wixProjetcs_thumb.png" width="244" height="197"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Déclaration d’une dépendance avec le .NET Framework :&lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;PropertyRef&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Id&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"NETFRAMEWORK35_CLIENT"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Condition&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Message&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;'This setup requires the .NET Framework 3.5 client profile installed.'&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;![CDATA[Installed OR NETFRAMEWORK35_CLIENT]]&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Condition&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;Installation d’une base de données :&lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;sql&lt;/span&gt;:&lt;span style="color: #800000"&gt;SqlDatabase&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Id&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;'SqlDatabase'&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Database&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;'Foobar'&lt;/span&gt; &lt;span style="color: #ff0000"&gt;User&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;'SQLUser'&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Server&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;'[SQLSERVER]'&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;              &lt;span style="color: #ff0000"&gt;CreateOnInstall&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;'yes'&lt;/span&gt; &lt;span style="color: #ff0000"&gt;DropOnUninstall&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;'yes'&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ContinueOnError&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;'yes'&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;sql&lt;/span&gt;:&lt;span style="color: #800000"&gt;SqlScript&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Id&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;'CreateTable'&lt;/span&gt; &lt;span style="color: #ff0000"&gt;BinaryKey&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;'CreateTable'&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ExecuteOnInstall&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;'yes'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;sql&lt;/span&gt;:&lt;span style="color: #800000"&gt;SqlDatabase&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;pre&gt; ou encore &lt;a title="configuration du firewall" href="http://wix.sourceforge.net/manual-wix3/firewall_xsd_firewallexception.htm"&gt;configurer le firewall&lt;/a&gt;.&lt;/pre&gt;&lt;img width="0" height="0" src="http://www.nventive.net/Blog2/aggbug.ashx?id=960a95d3-7c89-4fd7-b066-eb96682d0f1b"/&gt;&lt;/div&gt;</description>
      <comments>http://www.nventive.net/Blog2/CommentView,guid,960a95d3-7c89-4fd7-b066-eb96682d0f1b.aspx</comments>
      <category>.net</category>
      <category>Revue du Web</category>
    </item>
    <item>
      <trackback:ping>http://www.nventive.net/Blog2/Trackback.aspx?guid=95943e30-b841-4ebc-ad05-8a28d2b780a7</trackback:ping>
      <pingback:server>http://www.nventive.net/Blog2/pingback.aspx</pingback:server>
      <pingback:target>http://www.nventive.net/Blog2/PermaLink,guid,95943e30-b841-4ebc-ad05-8a28d2b780a7.aspx</pingback:target>
      <dc:creator>nVentive Coach Factor</dc:creator>
      <wfw:comment>http://www.nventive.net/Blog2/CommentView,guid,95943e30-b841-4ebc-ad05-8a28d2b780a7.aspx</wfw:comment>
      <wfw:commentRss>http://www.nventive.net/Blog2/SyndicationService.asmx/GetEntryCommentsRss?guid=95943e30-b841-4ebc-ad05-8a28d2b780a7</wfw:commentRss>
      <title>Revue du web .NET du 1er décembre</title>
      <guid isPermaLink="false">http://www.nventive.net/Blog2/PermaLink,guid,95943e30-b841-4ebc-ad05-8a28d2b780a7.aspx</guid>
      <link>http://www.nVentive.net/Blog2/2009/12/01/RevueDuWebNETDu1erD%c3%a9cembre.aspx</link>
      <pubDate>Tue, 01 Dec 2009 18:18:23 GMT</pubDate>
      <description>&lt;div&gt;&lt;h2&gt;&lt;b&gt;Les tweets de la semaine&lt;/b&gt; &lt;/h2&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://twitter.com/pedeveloper/statuses/6046161616"&gt;http://twitter.com/pedeveloper/statuses/6046161616&lt;/a&gt; les index en base de données, on connaît mais les index clustérisés ? Un rapide et intéressant tour d’horizon des index sous SQL Server.&lt;/p&gt; &lt;p&gt;&lt;a href="http://twitter.com/prodotnet"&gt;http://twitter.com/prodotnet&lt;/a&gt; pour apprendre (ou ré-apprendre) .NET un tweet à la fois.&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;La question Stackoverflow&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://stackoverflow.com/questions/129389/how-do-you-do-a-deep-copy-an-object-in-net-c-specifically"&gt;http://stackoverflow.com/questions/129389/how-do-you-do-a-deep-copy-an-object-in-net-c-specifically&lt;/a&gt; Copier un objet de type valeur est facile, copier un objet de type référence l’est moins car il a souvent lui même des références vers d’autres objets d’où le concept de “deep copy”, “deep”car on doit gérer un graphe d’objets. &lt;/p&gt; &lt;h2&gt;&lt;b&gt;Actualités Microsoft&lt;/b&gt; &lt;/h2&gt; &lt;p&gt;C’est le grand calme après la tempête PDC. Que retenir de cette édition ? D’après &lt;a title="article sur le site communautire dzone" href="http://dotnet.dzone.com/news/net-40-start-reading-between"&gt;Keith Elder&lt;/a&gt; dans un post sur dzone il faut faire le pari de Silverlight 4 et Entity Framework. Il est vrai qu’avec la version 4 de Silverlight on arrive au WPF/E (Everywhere) annoncé lors de sa première incarnation. De son côté le framework de mapping objet relationnel semble être le plus stable des investissements fait dans&amp;nbsp; ce domaine et son orientation “POCO” est un très bon signe. &lt;/p&gt; &lt;h2&gt;&lt;strong&gt;Actualités “Alt.NET”&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;Depuis que &lt;a title="attention 404 devant" href="http://livelabs.com/volta"&gt;Volta&lt;/a&gt; a été abandonné par Microsoft, il y a une place pour un framework comme GWT en .NET. &lt;a title="site du projet" href="http://projects.nikhilk.net/ScriptSharp"&gt;Script#&lt;/a&gt; est similaire mais incomplet. &lt;a href="http://tech.groups.yahoo.com/group/altdotnet/message/22758"&gt;Un message&lt;/a&gt; sur la liste de discussion altnet parle d’un effort par un développeur, Frank, de répondre à ce besoin. Est-ce qu’il y une place entre Silverlight et le couple ASP.NET MVC + jQuery ? Si cela ne vient pas de Microsoft peut-être que la communauté délivrera, appel à contribution lancé donc.&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;De l’autre côté&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;&amp;nbsp;&lt;a title="l'annonce officielle" href="http://labs.adobe.com/technologies/air2/"&gt;La beta d’Adobe Air 2&lt;/a&gt; est sortie en même temps que celle de Silverlight 4. Flash a connu 4 grandes étapes : &lt;/p&gt; &lt;ul&gt; &lt;li&gt;la création du plugin en 1996-97 qui a permis d’utiliser (et d'abuser) des animations vectorielles  &lt;li&gt;le codec vidéo qui a révolutionné le streaming de vidéo sur le web (et de perdre beaucoup de temps sur youtube.com)  &lt;li&gt;Flex : peu connu du grand public (sauf pour les 10.000 clients Twitter), c’est avec Flex et ActionScript (le langage) que Macromedia a fait son entrée dans le monde du développement d’entreprise (avec un back-end en Java)  &lt;li&gt;Air : qui permet d’exécuter un programme en dehors du navigateur. &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;On compare souvent Air et Silverlight car ils se positionnent comme la plate-forme “smart client” (et sont souvent cités comme les concurrents de HTML5). Silverlight a l’avantage d’offrir une expérience de développement unifiée (client et serveur en .NET), Flash/Flex/Air celui du pourcentage de déploiement sur les postes des particuliers. Dans sa dernière incarnation Adobe fournit dans la suite un nouvel outil &lt;a href="http://labs.adobe.com/technologies/flashcatalyst/"&gt;Catalyst&lt;/a&gt; qui permet de passer plus facilement d’un design de contrôle purement vectoriel à un “skin”réutilisable dans l’environnement de développement.&amp;nbsp; &lt;/p&gt; &lt;h2&gt;&lt;strong&gt;Un projet&lt;/strong&gt;&lt;/h2&gt; &lt;p&gt;&lt;a title="le site du projet" href="http://www.dotlesscss.com/"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="logo" border="0" alt="logo" src="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/Revueduweb.NETdu26octobre_90B0/logo_3.jpg" width="135" height="73"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;a title="le site du projet" href="http://www.dotlesscss.com/"&gt;dotlesscss&lt;/a&gt; (.less{}) se propose de moderniser la manipulation et la définition&amp;nbsp; des feuilles de styles (CSS). Il existe des techniques pour optimiser les styles en utilisant les bons sélecteurs mais il est vrai que la maintenance peut être fastidieuse. &lt;/p&gt; &lt;p&gt;dotlesscss supporte par exemple la déclaration de variables globales, ici une couleur :&lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;@&lt;span style="color: #800000"&gt;brand&lt;/span&gt;_&lt;span style="color: #800000"&gt;color&lt;/span&gt;: &lt;span style="color: #800000"&gt;#4D926F&lt;/span&gt;;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #800000"&gt;#header&lt;/span&gt; {
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #ff0000"&gt;color&lt;/span&gt;: &lt;span style="color: #0000ff"&gt;@brand_color&lt;/span&gt;;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;}
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #800000"&gt;h2&lt;/span&gt; {
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #ff0000"&gt;color&lt;/span&gt;: &lt;span style="color: #0000ff"&gt;@brand_color&lt;/span&gt;;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;}&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;ou encore les propriétés calculées : &lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;@&lt;span style="color: #800000"&gt;the-border&lt;/span&gt;: &lt;span style="color: #800000"&gt;1px&lt;/span&gt;;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;@&lt;span style="color: #800000"&gt;base-color&lt;/span&gt;: &lt;span style="color: #800000"&gt;#111&lt;/span&gt;;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #800000"&gt;#header&lt;/span&gt; {
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #ff0000"&gt;color&lt;/span&gt;: &lt;span style="color: #0000ff"&gt;@base-color * 3&lt;/span&gt;;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #ff0000"&gt;border-left&lt;/span&gt;: &lt;span style="color: #0000ff"&gt;@the-border&lt;/span&gt;;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #ff0000"&gt;border-right&lt;/span&gt;: &lt;span style="color: #0000ff"&gt;@the-border * 2&lt;/span&gt;;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;}
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #800000"&gt;#footer&lt;/span&gt; { 
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #ff0000"&gt;color&lt;/span&gt;: &lt;span style="color: #0000ff"&gt;(@base-color + #111) * 1.5&lt;/span&gt;; 
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;}
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;strong&gt;Autopromotion (juste un peu)&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;nVentive sera présente lors des &lt;a title="site des techdays" href="http://www.microsoft.com/canada/techdays/"&gt;TechDays&lt;/a&gt; à Montréal : Erik Renaud animera une présentation d’introduction sur le Test-Driven Development (TDD). &lt;/p&gt;&lt;img width="0" height="0" src="http://www.nventive.net/Blog2/aggbug.ashx?id=95943e30-b841-4ebc-ad05-8a28d2b780a7"/&gt;&lt;/div&gt;</description>
      <comments>http://www.nventive.net/Blog2/CommentView,guid,95943e30-b841-4ebc-ad05-8a28d2b780a7.aspx</comments>
      <category>.net</category>
      <category>Revue du Web</category>
    </item>
    <item>
      <trackback:ping>http://www.nventive.net/Blog2/Trackback.aspx?guid=7cd1c546-824a-4413-aade-d57060fc68a1</trackback:ping>
      <pingback:server>http://www.nventive.net/Blog2/pingback.aspx</pingback:server>
      <pingback:target>http://www.nventive.net/Blog2/PermaLink,guid,7cd1c546-824a-4413-aade-d57060fc68a1.aspx</pingback:target>
      <dc:creator>nVentive Coach Factor</dc:creator>
      <wfw:comment>http://www.nventive.net/Blog2/CommentView,guid,7cd1c546-824a-4413-aade-d57060fc68a1.aspx</wfw:comment>
      <wfw:commentRss>http://www.nventive.net/Blog2/SyndicationService.asmx/GetEntryCommentsRss?guid=7cd1c546-824a-4413-aade-d57060fc68a1</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <title>Revue du web .NET du 24 novembre</title>
      <guid isPermaLink="false">http://www.nventive.net/Blog2/PermaLink,guid,7cd1c546-824a-4413-aade-d57060fc68a1.aspx</guid>
      <link>http://www.nVentive.net/Blog2/2009/11/24/RevueDuWebNETDu24Novembre.aspx</link>
      <pubDate>Tue, 24 Nov 2009 20:00:00 GMT</pubDate>
      <description>&lt;div&gt;&lt;h2&gt;&lt;b&gt;Les tweets de la semaine&lt;/b&gt; &lt;/h2&gt; &lt;p&gt;Voici un site intéressant pour suivre les tweets de la communauté .NET : &lt;a href="http://managedassembly.com/twitter"&gt;http://managedassembly.com/twitter&lt;/a&gt; C’est seulement un groupe sélectionné, certains se transforment en “drama queen” parfois mais l’essentiel est là : le partage de connaissances au sens large dans la communauté .NET &lt;/p&gt; &lt;h2&gt;&lt;strong&gt;La question Stackoverflow&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;&lt;a href="http://stackoverflow.com/questions/289176/how-is-duck-typing-different-from-the-old-variant-type-and-or-interfaces"&gt;http://stackoverflow.com/questions/289176/how-is-duck-typing-different-from-the-old-variant-type-and-or-interfaces&lt;/a&gt; Avec les fonctionnalités de C# 4 comme le mot-clé dynamic, on parle de duck-typing, mais que recouvre ce terme ? Une explication avec exemple dans la question de la semaine.&lt;/p&gt; &lt;h2&gt;&lt;b&gt;Actualités Microsoft&lt;/b&gt; &lt;/h2&gt; &lt;p&gt;La PDC 2009 ne restera sans doute pas dans les annales comme une des plus importantes. Sauf peut-être pour les conférenciers qui ont reçu un PC portable Tablet PC gratuitement.&lt;/p&gt; &lt;p&gt;Comme on le pressentait dans cette chronique les semaines précédentes, les sessions et annonces ont tourné autour de Azure, Dublin, Office 2010 et Silverlight 4 avec aussi un bilan de Windows 7.&lt;/p&gt; &lt;p&gt;Azure : en plus de l’offre commerciale qui démarre en 2010, l’éditeur a annoncé un AppStore de Azure sous le nom de code &lt;a title="Dallas, AppStore de Azure" href="http://www.microsoft.com/windowsazure/dallas/"&gt;Dallas&lt;/a&gt; qui sortira en beta dans le courant de l ‘année prochaine. Mais aussi des outils comme ce Power Pack de synchronisation de base de données &lt;a href="http://blogs.msdn.com/mahjayar/archive/2009/11/17/announcing-microsoft-sync-framework-power-pack-for-sql-azure-ctp.aspx"&gt;SQL Server vers Azure&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Dublin : Le projet a au moins un nom : &lt;a title="site officiel" href="http://msdn.microsoft.com/en-us/windowsserver/ee695849.aspx"&gt;Windows Server AppFabric&lt;/a&gt; et une beta. Et Velocity, le cache distribué, est aussi absorbé dans ce projet qui permet manager WCF et le nouveau WF dans IIS.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Silvelright 4 : en plus des nouvelles API autour de la webcam et l’accès au système de fichiers local, on assiste au un rattrapage (attendu) du framework avec la CLR classique : présence des ICommand et IDataeErrorInfo chères aux développeurs WPF, compatibilité des binaires (i.e. plus de projets spécifiques Silverlight pour les composants communs), Tim Heuer a comme toujours &lt;a title="le d&amp;eacute;tail de SL4" href="http://timheuer.com/blog/archive/2009/11/18/whats-new-in-silverlight-4-complete-guide-new-features.aspx"&gt;un billet&lt;/a&gt; qui détaille ces nouveautés. &lt;/p&gt; &lt;p&gt;Divers : sortie de ASP.NET MVC 2 Beta, des renommages de produits : RIA Services et ADO.NET Data Services tombent dans l’ombrelle de WCF, un protocole d'accès aux données basé sur Atom : &lt;a title="pr&amp;eacute;sentation de OData" href="http://blogs.msdn.com/astoriateam/archive/2009/11/17/breaking-down-data-silos-the-open-data-protocol-odata.aspx"&gt;OData&lt;/a&gt; , la sortie de Geneva ou Windows Identity Foundation … Ah si on oubliait : l’annonce de IE9 mais à part un Power Point repris partout les informations intéressantes seront divulguées lors de MIX2010 en mars prochain.&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;Actualités “Alt.NET”&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;Finalement la PDC virtuelle alternative (NotAtPdc) a connu un certain succès avec une &lt;a title="le site de NotatPDc" href="http://www.notatpdc.com/Sessions"&gt;vingtaine&lt;/a&gt; de sessions sur ASP.NET MVC, Entity Framework, les bonnes pratiques de développement et même Javascript :) Espérons que les enregistrements soient disponibles.&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;De l’autre côté &lt;/strong&gt;&lt;/h2&gt; &lt;p&gt;&lt;a title="site de l'application distribu&amp;eacute;e" href="http://www.terracotta.org/"&gt;Terracotta&lt;/a&gt; a annoncé le rachat de &lt;a title="nouveau site de Quartz" href="http://quartz-scheduler.org/"&gt;Quartz&lt;/a&gt; (version java) après celui de EhCache durant l’été. C’est une tendance, beaucoup d’entreprises fondées sur un projet Open Source phare rachète des projets connexes pour bâtir une offre plus complète. JBoss, Spring en sont les exemples les plus cités. Terracotta a connu un vrai succès en simplifiant la distribution d’applications. En utilisant la manipulation de byte code au runtime, l’application permet à des threads sur des JVMs différentes (CLR en .NET) de communiquer comme si elle appartenait à la même. Les cas d’utilisation les plus courants sont la distribution de cache, la réplication de sessions ou le clustering de POJO ou Spring Bean.&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;Un projet&lt;/strong&gt;&lt;/h2&gt; &lt;p&gt;&lt;a title="le site du projet" href="http://www.postsharp.org/"&gt;PostSharp&lt;/a&gt; est une librairie AOP pour .NET. Cette librairie ajoute le code de l’aspect après la compilation. On utilise souvent l’AOP pour des considérations techniques comme l’audit, le cache, les exceptions ou encore la démarcation des transactions sur des couches comme le fait Spring.NET.&lt;/p&gt; &lt;p&gt;Le projet est basé sur les attributs .NET, en héritant de &lt;font face="Courier New"&gt;OnMethodBoundaryAspect&lt;/font&gt; par exemple on développe un composant qui sera exécuté à l’entrée et à la sortie de la méthode :&lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;sealed&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; MyAttribute : OnMethodBoundaryAspect&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;On peut alors surcharger les méthodes pertinentes :&lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; OnEntry( MethodExecutionEventArgs eventArgs )
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;{
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	Trace.WriteLine(
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.Format( "&lt;span style="color: #8b0000"&gt;Entering {0}.{1}.&lt;/span&gt;",
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;				   eventArgs.Method.DeclaringType.Name,
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;				   eventArgs.Method.Name ),
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.category );
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;}
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; OnExit( MethodExecutionEventArgs eventArgs )
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;{
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	Trace.WriteLine(
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.Format( "&lt;span style="color: #8b0000"&gt;Leaving {0}.{1}.&lt;/span&gt;",
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;				   eventArgs.Method.DeclaringType.Name,
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;				   eventArgs.Method.Name ),
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.category );
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;}&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;et appliquer cet attribut sur notre méthode :&lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;[Trace]
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; ToBeTraced()
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;{
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    Console.WriteLine("&lt;span style="color: #8b0000"&gt;Hello, world.&lt;/span&gt;" );
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;}
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; &lt;/pre&gt;&lt;/pre&gt;PostSharp travaille sur les assembly compilées, au niveau du MSIL, il est donc compatible avec tous les langages .NET 
&lt;img width="0" height="0" src="http://www.nventive.net/Blog2/aggbug.ashx?id=7cd1c546-824a-4413-aade-d57060fc68a1"/&gt;&lt;/div&gt;</description>
      <comments>http://www.nventive.net/Blog2/CommentView,guid,7cd1c546-824a-4413-aade-d57060fc68a1.aspx</comments>
      <category>.net</category>
      <category>Revue du Web</category>
    </item>
    <item>
      <trackback:ping>http://www.nventive.net/Blog2/Trackback.aspx?guid=5e25b895-37df-44c0-aba1-950b982800fb</trackback:ping>
      <pingback:server>http://www.nventive.net/Blog2/pingback.aspx</pingback:server>
      <pingback:target>http://www.nventive.net/Blog2/PermaLink,guid,5e25b895-37df-44c0-aba1-950b982800fb.aspx</pingback:target>
      <dc:creator>nVentive Coach Factor</dc:creator>
      <wfw:comment>http://www.nventive.net/Blog2/CommentView,guid,5e25b895-37df-44c0-aba1-950b982800fb.aspx</wfw:comment>
      <wfw:commentRss>http://www.nventive.net/Blog2/SyndicationService.asmx/GetEntryCommentsRss?guid=5e25b895-37df-44c0-aba1-950b982800fb</wfw:commentRss>
      <title>Revue du web .NET du 17 novembre</title>
      <guid isPermaLink="false">http://www.nventive.net/Blog2/PermaLink,guid,5e25b895-37df-44c0-aba1-950b982800fb.aspx</guid>
      <link>http://www.nVentive.net/Blog2/2009/11/17/RevueDuWebNETDu17Novembre.aspx</link>
      <pubDate>Tue, 17 Nov 2009 20:22:00 GMT</pubDate>
      <description>&lt;div&gt;&lt;h2&gt;&lt;b&gt;Les tweets de la semaine&lt;/b&gt; &lt;/h2&gt; &lt;p&gt;&lt;a href="http://twitter.com/shanselman/status/5740020895"&gt;http://twitter.com/shanselman/status/5740020895&lt;/a&gt; Channel 9 la chaîne pour les développeurs .NET diffusera en direct un flux vidéo depuis la grande salle du centre de conférence. Au menu : interviews et démos par les présentateurs, partenaires et développeurs de la communauté.&lt;/p&gt; &lt;p&gt;&lt;a href="http://twitter.com/giovannibassi/statuses/5738375005"&gt;http://twitter.com/giovannibassi/statuses/5738375005&lt;/a&gt; il y a bien une underground PDC (enfin pas si underground car le principal intervenant est Scott Gutherie) mais sur twitter on a trouvé la “nopdc”, une conférence virtuelle ou une simple blague ? &lt;/p&gt; &lt;p&gt;&lt;a href="http://twitter.com/tomconte/statuses/5720465827"&gt;http://twitter.com/tomconte/statuses/5720465827&lt;/a&gt; mise à jour du Azure SDK (Novembre 2009) juste avant la PDC. L’accent est mis sur le support de Visual 2010, l‘amélioration des fonctionnalités de logs mais aussi sur le service comme la puissance des machines virtuelles, les ports HTTP ouverts etc.&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;La question Stackoverflow&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://stackoverflow.com/questions/36296/whats-the-answer-to-this-microsoft-pdc-challenge"&gt;http://stackoverflow.com/questions/36296/whats-the-answer-to-this-microsoft-pdc-challenge&lt;/a&gt; une question PDC sur Stackoverflow, un peu tirée par les cheveux mais sympathique, voir le lien de la première réponse pour un explication&lt;/p&gt; &lt;h2&gt;&lt;b&gt;Actualités Microsoft&lt;/b&gt; &lt;/h2&gt; &lt;p&gt;Nous y voilà. La PDC est le rendez-vous des développeurs .NET. Pour se tenir au courant Twitter est d’une grande &lt;a href="http://search.twitter.com/search?q=%23pdc+"&gt;aide&lt;/a&gt;. Azure sera sûrement la vedette de cette édition, Visual Studio 2010 étant déjà disponible on pourra sans doute approfondir certains points. Des surprises ? Peut-être du côté de Sharepoint ou de Office en ligne dont on a pas entendu parler même si certains produits comme Excel sont déjà disponibles. &lt;/p&gt; &lt;h2&gt;&lt;strong&gt;Actualités “Alt.NET”&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;On parlait récemment du manque de Maven pour les projets .NET. Voici un début de solution avec &lt;a href="http://www.hornget.net/packages/"&gt;HornGet&lt;/a&gt;. Ce site est un repository des librairies et frameworks couramment utilités. On y trouve la version stable courante mais aussi le trunk. Voici un exemple avec NHibernate : &lt;a href="http://www.hornget.net/packages/orm/nhibernate/"&gt;http://www.hornget.net/packages/orm/nhibernate/&lt;/a&gt; A chaque fois les dépendances sont incluses dans le package.&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;De l’autre côté &lt;/strong&gt;&lt;/h2&gt; &lt;p&gt;La version 3 de &lt;a href="http://www.springsource.com/"&gt;Spring&lt;/a&gt; va bientôt voir le jour. Du framework simplifiant le développement J2EE en passant par l ‘injection des dépendances, Spring a eu un fort impact sur la communauté Java. Racheté par VMware, le contenu payant (outils, support, serveur d’application …) est de plus en plus étoffé. Au niveau des fonctionnalités c’est le support des annotations (lire attributs en .NET) de plus en plus présents ainsi que des API REST complètes. Mais c’est aussi un mouvement de fond et Spring est passé d’une multitude librairies pour combler des manques à un stack complet qui&amp;nbsp; est en concurrence avec Java EE6.&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;Un projet&lt;/strong&gt;&lt;/h2&gt; &lt;p&gt;&lt;a title="le site web du projet" href="http://quartznet.sourceforge.net/"&gt;Quartz.NET&lt;/a&gt; est un portage .NET d’une librairie de planification de tâches. On y trouve toutes les fonctionnalités pour ce type de programme : &lt;/p&gt; &lt;ul&gt; &lt;li&gt;intégré ou application “stand-alone”  &lt;li&gt;planification par trigger sur dates, calendrier particulier (calendrier avec vacances etc.)  &lt;li&gt;l’application fournit simplement des “jobs” : classes implémentant une interface et instanciées. On peut pendre le contrôle de l’instanciation via une factory.&amp;nbsp; &lt;li&gt;des fonctionnalités “entreprise”comme le fail-over ou le load-balancing&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Voici un extrait des &lt;a href="http://quartznet.sourceforge.net/tutorial/index.html"&gt;tutoriaux&lt;/a&gt; :&lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #008000"&gt;// construct a scheduler factory&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;ISchedulerFactory schedFact = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; StdSchedulerFactory();
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #008000"&gt;// get a scheduler&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;IScheduler sched = schedFact.GetScheduler();
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;sched.Start();
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #008000"&gt;// construct job info&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;JobDetail jobDetail = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; JobDetail("&lt;span style="color: #8b0000"&gt;myJob&lt;/span&gt;", &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(HelloJob));
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #008000"&gt;// fire every hour&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;Trigger trigger = TriggerUtils.MakeHourlyTrigger();
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #008000"&gt;// start on the next even hour&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;trigger.StartTimeUtc = TriggerUtils.GetEvenHourDate(DateTime.UtcNow);  
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;trigger.Name = "&lt;span style="color: #8b0000"&gt;myTrigger&lt;/span&gt;";
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;sched.ScheduleJob(jobDetail, trigger); &lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;Le planificateur a la notion de calendrier attaché aux triggers ce qui permet d’exclure des dates pour lesquelles ceux-ci ne se déclenchent pas&amp;nbsp; :&lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;HolidayCalendar cal = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; HolidayCalendar();
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;cal.AddExcludedDate(someDate);
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;sched.AddCalendar("&lt;span style="color: #8b0000"&gt;myHolidays&lt;/span&gt;", cal, &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;);
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #008000"&gt;// fire every one hour interval&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;Trigger trigger = TriggerUtils.MakeHourlyTrigger();
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #008000"&gt;// start on the next even hour&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;trigger.StartTimeUtc = TriggerUtils.GetEvenHourDate(DateTime.Now); 
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;trigger.Name = "&lt;span style="color: #8b0000"&gt;myTrigger1&lt;/span&gt;";
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;trigger.CalendarName = "&lt;span style="color: #8b0000"&gt;myHolidays&lt;/span&gt;";
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #008000"&gt;// .. schedule job with trigger&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #008000"&gt;// fire every day at 08:00&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;Trigger trigger2 = TriggerUtils.MakeDailyTrigger(8, 0);
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #008000"&gt;// begin immediately&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;trigger.StartTimeUtc = DateTime.UtcNow; 
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;trigger2.Name = "&lt;span style="color: #8b0000"&gt;myTrigger2&lt;/span&gt;";
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;trigger2.CalendarName = "&lt;span style="color: #8b0000"&gt;myHolidays&lt;/span&gt;";
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #008000"&gt;// .. schedule job with trigger2 &lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;img width="0" height="0" src="http://www.nventive.net/Blog2/aggbug.ashx?id=5e25b895-37df-44c0-aba1-950b982800fb"/&gt;&lt;/div&gt;</description>
      <comments>http://www.nventive.net/Blog2/CommentView,guid,5e25b895-37df-44c0-aba1-950b982800fb.aspx</comments>
      <category>.net</category>
    </item>
    <item>
      <trackback:ping>http://www.nventive.net/Blog2/Trackback.aspx?guid=d5c9b596-24d2-47ea-ba54-1463fc9c8879</trackback:ping>
      <pingback:server>http://www.nventive.net/Blog2/pingback.aspx</pingback:server>
      <pingback:target>http://www.nventive.net/Blog2/PermaLink,guid,d5c9b596-24d2-47ea-ba54-1463fc9c8879.aspx</pingback:target>
      <dc:creator>nVentive Coach Factor</dc:creator>
      <wfw:comment>http://www.nventive.net/Blog2/CommentView,guid,d5c9b596-24d2-47ea-ba54-1463fc9c8879.aspx</wfw:comment>
      <wfw:commentRss>http://www.nventive.net/Blog2/SyndicationService.asmx/GetEntryCommentsRss?guid=d5c9b596-24d2-47ea-ba54-1463fc9c8879</wfw:commentRss>
      <title>Revue du web .NET du 10 novembre</title>
      <guid isPermaLink="false">http://www.nventive.net/Blog2/PermaLink,guid,d5c9b596-24d2-47ea-ba54-1463fc9c8879.aspx</guid>
      <link>http://www.nVentive.net/Blog2/2009/11/11/RevueDuWebNETDu10Novembre.aspx</link>
      <pubDate>Wed, 11 Nov 2009 08:40:00 GMT</pubDate>
      <description>&lt;div&gt;&lt;h2&gt;&lt;b&gt;Les tweets de la semaine&lt;/b&gt; &lt;/h2&gt; &lt;p&gt;&lt;a href="http://twitter.com/adamhill/statuses/5433030511"&gt;http://twitter.com/adamhill/statuses/5433030511&lt;/a&gt; : vous pensiez que les expressions lambda étaient la fin de vos peines de développeur ? Voici les “dynamic methods bags” avec C# 4.&amp;nbsp; &lt;/p&gt; &lt;p&gt;&lt;a href="http://twitter.com/rbirkby/status/5309987820"&gt;http://twitter.com/rbirkby/status/5309987820&lt;/a&gt; le copier-coller le plus grand “ami” du développeur, voilà un outil pour détecter le code dupliqué.&lt;/p&gt; &lt;p&gt;&lt;a href="http://twitter.com/Weiti/statuses/5473911173"&gt;http://twitter.com/Weiti/statuses/5473911173&lt;/a&gt; snippet console, pour tester des bouts de code.&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;La question Stackoverflow&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;&lt;a title="la question" href="http://stackoverflow.com/questions/1694297/does-entity-framework-4-0-allow-to-work-without-designers"&gt;http://stackoverflow.com/questions/1694297/does-entity-framework-4-0-allow-to-work-without-designers&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Entity-Framework en est déjà à la version 4 mais ne vous inquiétez pas si vous avez ignoré les versions précédentes, cette dernière incarnation de l’ORM de l’éditeur (rappelez-vous d’&lt;a title="article sur ObjectSpaces sur msdn" href="http://msdn.microsoft.com/en-us/library/ms971512.aspx"&gt;ObjectSpaces&lt;/a&gt;) est presque un nouveau produit. On y trouve la transparence des mécanismes de persistance et comme évoquée dans la question de la semaine une API du mapping plus accessible. &lt;/p&gt; &lt;h2&gt;&lt;b&gt;Actualités Microsoft&lt;/b&gt; &lt;/h2&gt; &lt;p&gt;Encore quelques jours avant la PDC 2009, nous continuons le tour d’horizon du .NET Framework 4.0 avec WPF. Une technologie prometteuse mais peut-être trop innovante ? Un nouveau langage (XAML), un manque certain d’outils et de contrôles de base (vous avez dit DataGrid ?). Enfin tout cela était avant la version 4.0 qui occupe le devant de la scène : le nouveau Visual Studio 2010 utilise WPF comme moteur de rendu pour l’éditeur de code.On peut consulter ici la liste des &lt;a title="liste des nouveaut&amp;eacute;s dans WPF 4.0 sur le site msdn" href="http://msdn.microsoft.com/en-us/library/bb613588(VS.100).aspx"&gt;nouveautés&lt;/a&gt;. Une des ressources les plus instructives sur le Framework de présentation est le blog de Jaime Rodriguez avec notamment son &lt;a title="exemple de billet" href="http://blogs.msdn.com/jaimer/archive/2009/11/02/wpf-discussions-091101.aspx"&gt;billet hebdomadaire&lt;/a&gt; qui condense des questions / réponses de la liste de diffusion interne de Microsoft.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt; &lt;h2&gt;Actualités “Alt.NET” &lt;/h2&gt; &lt;p&gt;On a beaucoup entendu parler ces derniers temps de Mono grâce à &lt;a title="le site de MonoTouch" href="http://monotouch.net/"&gt;MonoTouch&lt;/a&gt;, le Framework qui permet de développer en C# des applications pour l’iPhone.&amp;nbsp; Mais l’hébergement est un domaine où Mono peut faire le différence. Pour ceux qui préfèrent un hébergement sous un OS alternatif, voici &lt;a title="monoontheweb.com" href="http://blog.monoontheweb.info/default.aspx"&gt;un blog&lt;/a&gt; qui offre quelques informations sur l‘installation de Mono.Une image avec un serveur virtuel préinstallé est disponible.&lt;/p&gt; &lt;h2&gt;De l’autre côté &lt;/h2&gt; &lt;p&gt;La &lt;a title="site officiel" href="http://www.apache.org/"&gt;fondation Apache&lt;/a&gt; fête ses 10 ans. Démarré avec le fameux serveur web, la communauté comporte maintenant 65 projets dont les plus connus comme Tomcat, Strut, Commons ont presque défini le mode de travail autour de l’open source pour les projets Java. &lt;a title="liste des sponsors" href="http://apache.org/foundation/thanks.html"&gt;Microsoft&lt;/a&gt; qui est devenu partenaire en 2008,&amp;nbsp; a lancé un site d'hébergement pour les projets : &lt;a title="le site de codeplex" href="http://www.codeplex.com/"&gt;CodePlex&lt;/a&gt; et depuis peu une fondation &lt;a href="http://www.codeplex.org/about.aspx#mission"&gt;Codeplex.org&lt;/a&gt; dont on attend encore les détails de fonctionnement mais qui à l’ instar de Eclipse ou Apache sera un lieu d’incubation et de développement pour des projets Open Source de la plate-forme .NET.&lt;/p&gt; &lt;h2&gt;Un projet&lt;/h2&gt; &lt;p&gt;Aujourd’hui pas de code, car ce projet n’existe pas encore ou du moins il est encore en phase de démarrage : &lt;a title="Le lancement de Noda" href="http://msmvps.com/blogs/jon_skeet/archive/2009/11/06/noda-time-is-born.aspx"&gt;Noda&lt;/a&gt;. Né de l’idée de John Skeet, employé de Google et ancien MVP C#, cette librairie sera un portage de la librairie &lt;a title="le site de la librairie Java" href="http://joda-time.sourceforge.net/"&gt;Joda&lt;/a&gt;. L’objet ? Fournir une utilisation facile, performante et extensible des concepts de temps et date. Cela va de fournir des chronologies (ISO, Julian, Islamic) aux concepts comme les instants, les durées, les intervalles de temps et les calculs qu’on peut effectuer dessus.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.nventive.net/Blog2/aggbug.ashx?id=d5c9b596-24d2-47ea-ba54-1463fc9c8879"/&gt;&lt;/div&gt;</description>
      <comments>http://www.nventive.net/Blog2/CommentView,guid,d5c9b596-24d2-47ea-ba54-1463fc9c8879.aspx</comments>
      <category>.net</category>
    </item>
    <item>
      <trackback:ping>http://www.nventive.net/Blog2/Trackback.aspx?guid=732d26ee-01b1-4193-9925-f9bb5a58f859</trackback:ping>
      <pingback:server>http://www.nventive.net/Blog2/pingback.aspx</pingback:server>
      <pingback:target>http://www.nventive.net/Blog2/PermaLink,guid,732d26ee-01b1-4193-9925-f9bb5a58f859.aspx</pingback:target>
      <dc:creator>nVentive Coach Factor</dc:creator>
      <wfw:comment>http://www.nventive.net/Blog2/CommentView,guid,732d26ee-01b1-4193-9925-f9bb5a58f859.aspx</wfw:comment>
      <wfw:commentRss>http://www.nventive.net/Blog2/SyndicationService.asmx/GetEntryCommentsRss?guid=732d26ee-01b1-4193-9925-f9bb5a58f859</wfw:commentRss>
      <title>Atelier développement piloté par les tests, le TDD par la pratique</title>
      <guid isPermaLink="false">http://www.nventive.net/Blog2/PermaLink,guid,732d26ee-01b1-4193-9925-f9bb5a58f859.aspx</guid>
      <link>http://www.nVentive.net/Blog2/2009/11/06/AtelierD%c3%a9veloppementPilot%c3%a9ParLesTestsLeTDDParLaPratique.aspx</link>
      <pubDate>Fri, 06 Nov 2009 20:20:00 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Nous organisons un atelier sur le TDD, Test-Driven Developement,&amp;nbsp; le vendredi 27 novembre. Cette journée attache beaucoup d’importance aux exercices et aux outils que vous utiliserez dans la vie de tous les jours pour pratiquer un développement agile.&lt;/p&gt; &lt;p&gt;Voici un extrait de la description – consulter le lien ci-dessous pour plus de détails sur l’agenda.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Dans la première partie de ce cours, nous répondrons à la question "Qu'est-ce le&amp;nbsp; TDD ?" mais aussi le "pourquoi, dans quel but et à quel coût ?"&lt;br&gt;La deuxième phase est plus axée sur la mise en pratique avec les outils et frameworks orientés « xUnit » autour de cas pratiques. On verra également dans cette partie l'utilisation des « stubs » et « mocks » ainsi que les différences entre les différents types de faux objets qui permettent l’isolation des tests.&lt;br&gt;Pour terminer, on explorera les meilleures pratiques du TDD, les&amp;nbsp; pièges à éviter. On jettera également un regard sur les méthodes périphériques comme le « Behavior-Driven Development » et l'íntégration continue.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Inscription : &lt;a href="http://nventive.eventbrite.com/"&gt;http://nventive.eventbrite.com/&lt;/a&gt;&lt;br&gt;Contact : &lt;a href="mailto:info@nventive.net"&gt;info@nventive.net&lt;/a&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.nventive.net/Blog2/aggbug.ashx?id=732d26ee-01b1-4193-9925-f9bb5a58f859"/&gt;&lt;/div&gt;</description>
      <comments>http://www.nventive.net/Blog2/CommentView,guid,732d26ee-01b1-4193-9925-f9bb5a58f859.aspx</comments>
      <category>.net</category>
      <category>Agile - Development</category>
    </item>
    <item>
      <trackback:ping>http://www.nventive.net/Blog2/Trackback.aspx?guid=20b6a692-9147-40fd-a4c3-fc531c2a3a5e</trackback:ping>
      <pingback:server>http://www.nventive.net/Blog2/pingback.aspx</pingback:server>
      <pingback:target>http://www.nventive.net/Blog2/PermaLink,guid,20b6a692-9147-40fd-a4c3-fc531c2a3a5e.aspx</pingback:target>
      <dc:creator>nVentive Coach Factor</dc:creator>
      <wfw:comment>http://www.nventive.net/Blog2/CommentView,guid,20b6a692-9147-40fd-a4c3-fc531c2a3a5e.aspx</wfw:comment>
      <wfw:commentRss>http://www.nventive.net/Blog2/SyndicationService.asmx/GetEntryCommentsRss?guid=20b6a692-9147-40fd-a4c3-fc531c2a3a5e</wfw:commentRss>
      <title>Revue du web .NET du 2 novembre</title>
      <guid isPermaLink="false">http://www.nventive.net/Blog2/PermaLink,guid,20b6a692-9147-40fd-a4c3-fc531c2a3a5e.aspx</guid>
      <link>http://www.nVentive.net/Blog2/2009/10/26/RevueDuWebNETDu2Novembre.aspx</link>
      <pubDate>Mon, 26 Oct 2009 20:11:49 GMT</pubDate>
      <description>&lt;div&gt;&lt;h2&gt;&lt;b&gt;Les tweets de la semaine&lt;/b&gt; &lt;/h2&gt; &lt;p&gt;&lt;a href="http://twitter.com/PauloMorgado/statuses/5345415268"&gt;http://twitter.com/PauloMorgado/statuses/5345415268&lt;/a&gt;: Pouvoir démarrer un serveur Cassini (le serveur utilisé par Visual Studio) à partir de n’importe quel répertoire, la solution pour ASP.NET 3.5 /4.&lt;/p&gt; &lt;p&gt;&lt;a href="http://twitter.com/sensenet"&gt;http://twitter.com/sensenet&lt;/a&gt; une alternative open source à Sharepoint&lt;/p&gt; &lt;p&gt;&lt;a href="http://twitter.com/rogerjenn/statuses/5340211244"&gt;http://twitter.com/rogerjenn/statuses/5340211244&lt;/a&gt; .NET Services va connaître une mise à jour majeure le 5 novembre, deux semaines avant l’annonce officielle de l’offre commerciale.&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;La question Stackoverflow&lt;/strong&gt; &lt;/h2&gt; &lt;p&gt;&lt;a title="la question sur stackoverflow.com" href="http://stackoverflow.com/questions/885955/whats-the-compelling-reason-to-upgrade-to-visual-studio-2010-from-vs2008"&gt;http://stackoverflow.com/questions/885955/whats-the-compelling-reason-to-upgrade-to-visual-studio-2010-from-vs2008&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Pour continuer sur la sortie la semaine dernière de Visual Studio 2010 beta 2, voici une liste de fonctionnalités et améliorations pour vous déculpabiliser d'avoir installer une version beta sur votre poste de développeur (alors que votre patron vous l’a expressément interdit bien sûr).&lt;/p&gt; &lt;h2&gt;&lt;b&gt;Actualités Microsoft&lt;/b&gt; &lt;/h2&gt; &lt;p&gt;Où est passé &lt;a title="site web officiel" href="http://www.microsoft.com/NET/Dublin.aspx"&gt;Dublin&lt;/a&gt; ? Le serveur d’application présenté pendant la PDC 2008 n’a pas fait beaucoup parler de lui depuis. Un &lt;a title="planning de Dublin" href="http://blogs.microsoft.co.il/blogs/applisec/archive/2009/11/01/dublin-timeframe.aspx"&gt;planning&lt;/a&gt; a été annoncé : beta 1 fermée en fin d’année et RTM au printemps 2010 mais à part les présentations colorées on en a pas vu beaucoup plus sur l’assemblage de WCF et WF autour de IIS. En attendant on devra se contenter de retours sur certaines &lt;a title="pr&amp;eacute;sentation de Sam Gentille sur Dublin" href="http://samgentile.com/Web/presentations/sam-gentile-presentation-wf4-wcf4-and-dublin-whats-new-in-vs2010/"&gt;présentations&lt;/a&gt;. Le PDC répondra peut-être à certaines &lt;a title="les sessions sur Dublin" href="http://microsoftpdc.com/Search?term=dublin"&gt;interrogations&lt;/a&gt;, mais WF4 et WCF4 sont déjà deux Frameworks pouvant nous occuper jusqu’au printemps…  &lt;h2&gt;Actualités Alt.NET &lt;/h2&gt; &lt;p&gt;Si vous n’avez pas la chance d’habiter dans une ville dotée d’un groupe Alt.NET, vous pouvez assister aux réunions virtuelles : &lt;a title="le site internet" href="http://www.virtualaltnet.com/"&gt;virtual ALT.NET&lt;/a&gt; (la section “recording” contient des archives). Par exemple, l’épisode “&lt;a title="video de la r&amp;eacute;union" href="http://www.virtualaltnet.com/Recordings/Show/54"&gt;Separated Presentation&lt;/a&gt;” avec Jeremy Miller présente les différents patterns de présentation.  &lt;h2&gt;De l’autre côté &lt;/h2&gt; &lt;p&gt;Amazon a ajouté un nouveau membre à la famille déjà bien nombreuse de ses services "cloud": RDS pour "Relationnal Databse Service”. Basé sur MySql ce service offre un stockage relationnel avec sauvegarde programmable. Azure SQL n’est donc plus seul face aux offres non relationnelles comme les très à la mode système “clé–valeur” qu’offre aussi Amazon (SimpleDB), Microsoft (Azure), Google (GAE et Big Table). Les détails de cette annonce en suivant ce &lt;a title="l'annonce de Amazon" href="http://aws.amazon.com/rds/?ref_=pe_12300_13473310"&gt;lien&lt;/a&gt;. On trouvera une comparaison des offres d’Amazon et de Microsoft &lt;a href="http://www.cloudbzz.com/amazon-rds-vs-sql-azure-the-birth-of-the-dbms-utility/"&gt;ici&lt;/a&gt;.  &lt;h2&gt;Un projet&lt;/h2&gt; &lt;p&gt;&lt;a title="lien vers le site du projet" href="http://code.google.com/p/psake/"&gt;PSake&lt;/a&gt; est un système pour construire (compiler, packager, déployer) des projets .NET. Le monde .NET n’a pas encore son &lt;a title="site de Maven" href="http://maven.apache.org/"&gt;Maven&lt;/a&gt; qui repose sur le principe “convention over configuration”. Il y a Nant, MSBuild mais aucun outil ne nous libère de la dure tâche d’écrire des scripts. PSake ne fait pas exception mais essaie de simplifier le travail. Basé sur Powershell, il expose le concept de tâche avec dépendances.&lt;/p&gt; &lt;p&gt;On commence par déclarer une liste de propriétés : &lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;properties {
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  $currentdir= resolve-path .
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  $basedir= resolve-path .\..\..\
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  $releasedir= &lt;span style="color: #008000"&gt;'C:\Release\'&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  $releasewebsitedir = $releasedir+"&lt;span style="color: #8b0000"&gt;_PublishedWebsites\Projet.Web.Web\"
&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  $solutionfile= "&lt;span style="color: #8b0000"&gt;$basedir\Projet.Web\Projet.Web.Web.csproj&lt;/span&gt;"
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  $configuration= &lt;span style="color: #008000"&gt;'staging'&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;}&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;Puis on définit une tâche par défaut :&lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;task &lt;span style="color: #0000ff"&gt;default&lt;/span&gt; -depends tacheDependante&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;Et on peut appeler ensuite des outils externes comme msbuild de façon simplifiée :&lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;task Compile -depends Init { 
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  exec msbuild "&lt;span style="color: #8b0000"&gt;/p:OutDir=&lt;/span&gt;""$releasedir "&lt;span style="color: #8b0000"&gt;&lt;/span&gt;" $sln_file"&lt;span style="color: #8b0000"&gt;
&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;} &lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;Le support pour des serveurs d’intégration continue (Cruise Control .NET, Team City, TFS ) fait encore défaut mais pour des projets de complexité moyenne, PSake est simple et rapide à mettre en place (et puis cela permet de se familiariser avec Powershell, ce qu’en tant que développeur on a toujours voulu faire sans jamais avoir eu le temps).&lt;/p&gt;&lt;img width="0" height="0" src="http://www.nventive.net/Blog2/aggbug.ashx?id=20b6a692-9147-40fd-a4c3-fc531c2a3a5e"/&gt;&lt;/div&gt;</description>
      <comments>http://www.nventive.net/Blog2/CommentView,guid,20b6a692-9147-40fd-a4c3-fc531c2a3a5e.aspx</comments>
      <category>.net</category>
    </item>
    <item>
      <trackback:ping>http://www.nventive.net/Blog2/Trackback.aspx?guid=a179b6b2-51b1-42ed-b202-9dc765d97b14</trackback:ping>
      <pingback:server>http://www.nventive.net/Blog2/pingback.aspx</pingback:server>
      <pingback:target>http://www.nventive.net/Blog2/PermaLink,guid,a179b6b2-51b1-42ed-b202-9dc765d97b14.aspx</pingback:target>
      <dc:creator>nVentive Coach Factor</dc:creator>
      <wfw:comment>http://www.nventive.net/Blog2/CommentView,guid,a179b6b2-51b1-42ed-b202-9dc765d97b14.aspx</wfw:comment>
      <wfw:commentRss>http://www.nventive.net/Blog2/SyndicationService.asmx/GetEntryCommentsRss?guid=a179b6b2-51b1-42ed-b202-9dc765d97b14</wfw:commentRss>
      <title>Revue du web .NET du 20 octobre</title>
      <guid isPermaLink="false">http://www.nventive.net/Blog2/PermaLink,guid,a179b6b2-51b1-42ed-b202-9dc765d97b14.aspx</guid>
      <link>http://www.nVentive.net/Blog2/2009/10/20/RevueDuWebNETDu20Octobre.aspx</link>
      <pubDate>Tue, 20 Oct 2009 13:37:28 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Voici notre première revue du web sur l’actualité du monde .NET. Elle ne se veut pas exhaustive, nous essayons de mettre en avant des choses intéressantes, peu connues parfois mais toujours pertinentes. L’objectif est d’offrir une vue synthétique des nouvelles du développement sur notre plateforme préférée. &lt;/p&gt; &lt;p&gt;Vous trouverez 7 petites rubriques : les deux premières sont des extraits de sites qu’on ne présente plus maintenant (Twitter et Stackoverflow). Ensuite des actualités du monde Microsoft et de la communauté Alt.NET. Nous mettrons aussi en avant un projet ou une application .NET et jetterons un coup œil ailleurs (Java, Ruby, PHP) . Enfin on retiendra un évènement pour la semaine à venir.&lt;/p&gt; &lt;p&gt;N’hésitez pas à réagir dans la section “commentaires” !&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;Les tweets de la semaine&lt;/strong&gt;&lt;/h2&gt; &lt;p&gt;&lt;a title="lien ver le statut twitter" href="http://twitter.com/SharedProphet/statuses/4925873898"&gt;http://twitter.com/SharedProphet/statuses/4925873898&lt;/a&gt; &lt;br&gt;Une introduction à la nouvelle invention du père de Linq : Rx, Reactive framework  &lt;p&gt;&lt;a title="lien ver le statut twitter" href="http://twitter.com/EdgarSanchez/statuses/4905530109"&gt;http://twitter.com/EdgarSanchez/statuses/4905530109&lt;/a&gt;&amp;nbsp; &lt;br&gt;ServiceStack : un stack alternatif à WCF pour faire de l’appel distant depuis Linux, Windows et une version pour MonoTouch  &lt;p&gt;&lt;a title="lien ver le statut twitter" href="http://twitter.com/oising/statuses/4867514391"&gt;http://twitter.com/oising/statuses/4867514391&lt;/a&gt; &lt;br&gt;On a tous de belles machines en 64bit et on est tous un peu ennuyés par ce message du débogueur de Visual Studio : "Change to 64-bit applications are not allowed" voici une solution.  &lt;h2&gt;&lt;b&gt;La question stackoverflow.com&lt;/b&gt; &lt;/h2&gt; &lt;p&gt;&lt;a title="lien vers stackoverflow.com" href="http://stackoverflow.com/questions/9033/hidden-features-of-c"&gt;http://stackoverflow.com/questions/9033/hidden-features-of-c&lt;/a&gt;  &lt;p&gt;« hidden features of c# » c'est la question la plus "active". Il y a sans doute des choses que vous connaissez déjà dans cette liste, d'autres dont vous ne vous servirez peut-être jamais mais la parcourir de temps à autre, avec son café du matin, c'est toujours instructif.  &lt;h2&gt;&lt;b&gt;Actualités Microsoft&lt;/b&gt; &lt;/h2&gt; &lt;p&gt;Le site de MSDN a connu un lifting de son interface, ici le portail consacré à C# &lt;a title="site web de MSDN" href="http://msdn.microsoft.com/en-us/vcsharp/default.aspx"&gt;http://msdn.microsoft.com/en-us/vcsharp/default.aspx&lt;/a&gt; et le site de référence de l’API a aussi une &lt;a title="MSDN library" href="http://msdn.microsoft.com/en-us/library/system.data.dataset(VS.100).aspx" target="_blank"&gt;nouvelle version légère&lt;/a&gt;.  &lt;p&gt;Un site peu connu avec pleins de projets petits ou grands : &lt;a href="http://msdn.microsoft.com/en-us/devlabs/dd125421.aspx"&gt;http://msdn.microsoft.com/en-us/devlabs/dd125421.aspx&lt;/a&gt;  &lt;p&gt;Dans un mois c'est la PDC 09 dont les grands moments seront sans doute : le lancement commercial de Azure, .NET Framework 4 et VS 2010.&amp;nbsp; &lt;a href="http://microsoftpdc.com"&gt;http://microsoftpdc.com&lt;/a&gt; /&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;p&gt;Le support de MS pour jQuery continue encore plus avec la version 6 de la Preview des contrôles ASP.NET Ajax qui s’exposent aussi comme plugins jQuery : &lt;a title="annonce sur le site de Scott Gutherie" href="http://weblogs.asp.net/scottgu/archive/2009/10/15/announcing-microsoft-ajax-library-preview-6-and-the-microsoft-ajax-minifier.aspx"&gt;http://weblogs.asp.net/scottgu/archive/2009/10/15/announcing-microsoft-ajax-library-preview-6-and-the-microsoft-ajax-minifier.aspx&lt;/a&gt;  &lt;h2&gt;&lt;b&gt;Actualités Alt.Net&lt;/b&gt; &lt;/h2&gt; &lt;p&gt;Ce n'est pas de l'actualité chaude mais Karl Seguin (&lt;a title="blog de Karl Seguin" href="http://codebetter.com/blogs/karlseguin/"&gt;http://codebetter.com/blogs/karlseguin/&lt;/a&gt; ), développeur canadien et membre de la communauté codebetter.com a publié un e-book de près de 80 pages sur les bonnes pratiques de développement : « Foundations of Programming ». Le sommaire est alléchant et une application accompagne le texte : &lt;a title="billet pr&amp;eacute;sentant l'application" href="http://codebetter.com/blogs/karlseguin/archive/2009/05/25/revisiting-codebetter-canvas.aspx"&gt;http://codebetter.com/blogs/karlseguin/archive/2009/05/25/revisiting-codebetter-canvas.aspx&lt;/a&gt;  &lt;h2&gt;&lt;b&gt;Ailleurs&lt;/b&gt;&lt;/h2&gt; &lt;p&gt;Jetbrains, l'éditeur connu dans le monde .NET pour Resharper (le plugin pour Visual Studio) vient de rendre disponible une version gratuite de son produit phare IntelliJIDEA (un IDE Java) ainsi que le code source de la plateforme. La version dite communauté ne contient pas beaucoup de fonctionnalités au-delà de la programmation JAVA SE mais comme Eclipse un écosystème de plugin va sans doute apparaître.  &lt;p&gt;Avec Eclipse, Netbeans et maintenant IntelliJIDEA, le monde des IDE Java semble plus dynamique que celui de .NET. MonoDevelop et SharpDevelop n'ont pas vu leur adoption croître beaucoup. Et les tentatives infructueuses comme celle de Together .NET de Borland ne sont pas là pour nous rendre optimistes.  &lt;p&gt;On peut juste espérer que Visual Studio 2010 simplifie vraiment l’intégration de plugins.  &lt;p&gt;&lt;a title="annonce de JetBrains" href="http://www.jetbrains.com/idea/nextversion/editions_comparison_matrix.html?utm_source=IDEA_BLOG&amp;amp;utm_media=Anouncement&amp;amp;utm_campaign=IDEA9_CE"&gt;http://www.jetbrains.com/idea/nextversion/editions_comparison_matrix.html?utm_source=IDEA_BLOG&amp;amp;utm_media=Anouncement&amp;amp;utm_campaign=IDEA9_CE&lt;/a&gt;  &lt;p&gt;&lt;a href="http://blogs.jetbrains.com/idea/"&gt;http://blogs.jetbrains.com/idea/&lt;/a&gt;  &lt;h2&gt;&lt;b&gt;Un projet&lt;/b&gt; &lt;/h2&gt; &lt;p&gt;&lt;a href="http://www.sparkviewengine.com"&gt;http://www.sparkviewengine.com&lt;/a&gt;  &lt;p&gt;Spark View Engine est un moteur de vue pour le Framework ASP.NET MVC (et Castle MonoRail) créé par &lt;a title="le blog de Louis Dejardin" href="http://whereslou.com/"&gt;Louis Dejardin&lt;/a&gt; (qui depuis a été embauché par Microsoft) pour un projet interne à son ancien employeur. Il simplifie la construction des pages en évitant les spaghettis de tags que représentent pour certains le moteur de vue par défaut de ASP.NET MVC.  &lt;p&gt;Un des cas les plus courants courants les boucles. &lt;/p&gt;&lt;pre style="border-bottom: #c0c0c0 1px solid; border-left: #c0c0c0 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; padding-right: 5px; overflow: auto; border-top: #c0c0c0 1px solid; border-right: #c0c0c0 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  1: &amp;lt;viewdata Posts="&lt;span style="color: #8b0000"&gt;IList[[MyApp.Models.Post]&lt;/span&gt;"/&amp;gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  2: &amp;lt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt; each="&lt;span style="color: #8b0000"&gt;var post in Posts&lt;/span&gt;"&amp;gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  3:   &amp;lt;p&amp;gt;${post.Title}&amp;lt;/p&amp;gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  4: &amp;lt;/&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;ou encore plus simple :&lt;/p&gt;&lt;pre style="border-bottom: #c0c0c0 1px solid; border-left: #c0c0c0 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; padding-right: 5px; overflow: auto; border-top: #c0c0c0 1px solid; border-right: #c0c0c0 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  1: &amp;lt;var classes="&lt;span style="color: #8b0000"&gt;new [] {'even','odd'}&lt;/span&gt;"&amp;gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  2: &amp;lt;tr each="&lt;span style="color: #8b0000"&gt;var user in users&lt;/span&gt;" &lt;span style="color: #0000ff"&gt;class&lt;/span&gt;="&lt;span style="color: #8b0000"&gt;${classes[userIndex%2]}&lt;/span&gt;"&amp;gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  3: &amp;lt;td&amp;gt;${userIndex}) ${user.Name}&amp;lt;/td&amp;gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  4: &amp;lt;td&amp;gt;${user.UserType}&amp;lt;/td&amp;gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  5: &amp;lt;/tr&amp;gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  6: &amp;lt;/var&amp;gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;L’intellisense est un peu dur à mettre en place mais avec Fluent HTML du projet&amp;nbsp; MVC Contrib on arrive à une productivité agréable : &lt;/p&gt;&lt;pre style="border-bottom: #c0c0c0 1px solid; border-left: #c0c0c0 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; padding-right: 5px; overflow: auto; border-top: #c0c0c0 1px solid; border-right: #c0c0c0 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  1: &amp;lt;content name="&lt;span style="color: #8b0000"&gt;MainContent&lt;/span&gt;"&amp;gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  2: &amp;lt;viewdata model="&lt;span style="color: #8b0000"&gt;IList[[Story]]&lt;/span&gt;"/&amp;gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  3: !{&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Html.Grid(Model).Columns(column =&amp;gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  4: {
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  5: column.For(x =&amp;gt; x.Id).Named("&lt;span style="color: #8b0000"&gt;ID&lt;/span&gt;");
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  6: column.For(x =&amp;gt; x.Title);
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  7: column.For(x =&amp;gt; x.DateSubmitted).Format("&lt;span style="color: #8b0000"&gt;{0:d}&lt;/span&gt;");
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  8: column.For(x =&amp;gt; Html.ActionLink&amp;lt;StoryController&amp;gt;(c =&amp;gt; c.Single(x.Ref), "&lt;span style="color: #8b0000"&gt;View Details&lt;/span&gt;"))
.DoNotEncode();
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  9: })}
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 10: 
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 11: &amp;lt;/content&amp;gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 12: 
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 13: &lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;Qui a dit « IntelliSense pour XAML ! » ? 
&lt;p&gt;ASP.NET MVC devient un des domaines où la communauté est des plus actives. 
&lt;h2&gt;&lt;b&gt;La semaine prochaine &lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;La conférence Monospace sur 4 jours avec bien sûr la vedette du moment MonoTouch, l’environnement de développement .NET pour l’iPhone : &lt;a href="http://monospace.us/"&gt;http://monospace.us/&lt;/a&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.nventive.net/Blog2/aggbug.ashx?id=a179b6b2-51b1-42ed-b202-9dc765d97b14"/&gt;&lt;/div&gt;</description>
      <comments>http://www.nventive.net/Blog2/CommentView,guid,a179b6b2-51b1-42ed-b202-9dc765d97b14.aspx</comments>
      <category>.net</category>
    </item>
    <item>
      <trackback:ping>http://www.nventive.net/Blog2/Trackback.aspx?guid=187f3cc0-4c66-474a-a968-e29ba94de7fc</trackback:ping>
      <pingback:server>http://www.nventive.net/Blog2/pingback.aspx</pingback:server>
      <pingback:target>http://www.nventive.net/Blog2/PermaLink,guid,187f3cc0-4c66-474a-a968-e29ba94de7fc.aspx</pingback:target>
      <dc:creator>nVentive Coach Factor</dc:creator>
      <wfw:comment>http://www.nventive.net/Blog2/CommentView,guid,187f3cc0-4c66-474a-a968-e29ba94de7fc.aspx</wfw:comment>
      <wfw:commentRss>http://www.nventive.net/Blog2/SyndicationService.asmx/GetEntryCommentsRss?guid=187f3cc0-4c66-474a-a968-e29ba94de7fc</wfw:commentRss>
      <title>AltNet Montréal – Et Umbrella fut…</title>
      <guid isPermaLink="false">http://www.nventive.net/Blog2/PermaLink,guid,187f3cc0-4c66-474a-a968-e29ba94de7fc.aspx</guid>
      <link>http://www.nVentive.net/Blog2/2009/09/30/AltNetMontr%c3%a9alEtUmbrellaFut.aspx</link>
      <pubDate>Wed, 30 Sep 2009 11:57:12 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;&lt;a href="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/AltNetMontralEtUmbrellafut_76F4/AltNet_2.png"&gt;&lt;img style="border-right-width: 0px; margin: 0px 5px 0px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="logo altnet" border="0" alt="logo altnet" align="left" src="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/AltNetMontralEtUmbrellafut_76F4/AltNet_thumb.png" width="404" height="70"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Le 22 octobre prochain Matthieu animera une &lt;a title="lien ver la fiche de la pr&amp;eacute;sentation" href="http://www.altnetmontreal.com/portal/%C3%89v%C3%A9nements/tabid/63/ModuleID/405/ItemID/4/mctl/EventDetails/language/en-US/Default.aspx?selecteddate=10/22/2009" target="_blank"&gt;présentation&lt;/a&gt; organisée par le groupe ALT.NET de Montréal. Pour ceux qui ne connaissent pas ALT.NET, le groupe montréalais est tout jeune mais il fait parti d’un &lt;a title="le site de alt.net" href="http://altdotnet.org/" target="_blank"&gt;mouvement plus large&lt;/a&gt; . Bien que peu formalisée cette communauté est vivante : elle organise des conférences &lt;a title="conf&amp;eacute;rence de vancouver" href="http://www.altnetconfcanada.com/home/index.castle" target="_blank"&gt;réelles&lt;/a&gt; ou &lt;a title="virtual altnet" href="http://groups.google.com/group/virtualaltnet" target="_blank"&gt;virtuelles&lt;/a&gt;, une &lt;a href="http://tech.groups.yahoo.com/group/altdotnet/" target="_blank"&gt;liste de discussion technique&lt;/a&gt; et bien sûr des évènements locaux autour des bonnes pratiques logiciels.&lt;/p&gt; &lt;p&gt;Le sujet de cette présentation sera &lt;a title="site codeplex de Umbrella" href="http://umbrella.codeplex.com/" target="_blank"&gt;Umbrella&lt;/a&gt; :&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/AltNetMontralEtUmbrellafut_76F4/vuesur.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="vue sur hanselman.com et ayende.com" border="0" alt="vue sur hanselman.com et ayende.com" src="http://www.nventive.net/Blog2/content/binary/WindowsLiveWriter/AltNetMontralEtUmbrellafut_76F4/vuesur_thumb.png" width="640" height="422"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;Umbrella n’est pas un nième framework, il n’y a pas de setup, juste une assemblie de 56k avec plein de goodies !&lt;/p&gt; &lt;p&gt;Voici un petit avant-goût de ce que vous allez voir, Umbrella est une bonne façon d’apprendre : en connaissant ses limites, on découvre d’autres choses sur le framework .NET.&lt;/p&gt; &lt;p&gt;IEnumerable &amp;amp; Dictionnaire : les méthodes qu’on a toujours voulues avoir sans jamais avoir oser les demander !&lt;/p&gt;&lt;pre style="border-bottom: #c0c0c0 1px solid; border-left: #c0c0c0 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; padding-right: 5px; overflow: auto; border-top: #c0c0c0 1px solid; border-right: #c0c0c0 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  1: maCollection.ForEach(item =&amp;gt; Console.WriteLine(item + 1));
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  2: maCollection.Remove(item =&amp;gt; item == "&lt;span style="color: #8b0000"&gt;1&lt;/span&gt;");
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  3: var maybe = monDictionnaire.GetValueOrDefault("&lt;span style="color: #8b0000"&gt;AD&lt;/span&gt;");&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;Exécuter une action à la fin d’un bloc using : &lt;/p&gt;&lt;pre style="border-bottom: #c0c0c0 1px solid; border-left: #c0c0c0 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; padding-right: 5px; overflow: auto; border-top: #c0c0c0 1px solid; border-right: #c0c0c0 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  1: &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; DummyMethod()
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  2: {
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  3: 	&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (TimeMethod())
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  4: 	{
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  5: 		Console.WriteLine("&lt;span style="color: #8b0000"&gt;I'm in the method...&lt;/span&gt;");
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  6: 		&lt;span style="color: #008000"&gt;// Do something...&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  7: 	}
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  8: 	&lt;span style="color: #008000"&gt;//The approximate time spent in the using block has been displayed at the end &lt;br&gt;        &lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  9: }
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 10: &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IDisposable TimeMethod()
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 11: {
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 12: 	var w = Stopwatch.StartNew();
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 13: 	Action stopTimer = () =&amp;gt; {
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 14: 	   Console.WriteLine(w.Elapsed);
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 15: 	};
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 16: 	&lt;span style="color: #0000ff"&gt;return&lt;/span&gt; stopTimer.ToDisposable();
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 17: }
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 18: &lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;Ou avoir le Cast facile :&lt;/p&gt;&lt;pre style="border-bottom: #c0c0c0 1px solid; border-left: #c0c0c0 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; padding-right: 5px; overflow: auto; border-top: #c0c0c0 1px solid; border-right: #c0c0c0 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  1: &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IEnumerable&amp;lt;Type&amp;gt; EnumPlugins(Assembly assembly)
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  2: {
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  3:     &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; from pluginType &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; assembly.GetTypes()
&lt;/pre&gt;&lt;pre style="background-color: #ffff00; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  4: 	   where pluginType.Is&amp;lt;IPlugin&amp;gt;()
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  5:        select pluginType;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  6: }
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  7: &lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;Mais il y a encore plein d’autres choses à voir.&lt;/p&gt;
&lt;p&gt;Vous trouverez les détails sur le &lt;a title="fiche de la pr&amp;eacute;sentation" href="http://www.altnetmontreal.com/portal/%C3%89v%C3%A9nements/tabid/63/ModuleID/405/ItemID/4/mctl/EventDetails/language/en-US/Default.aspx?selecteddate=10/22/2009" target="_blank"&gt;site de Alt.NET Montréal&lt;/a&gt; et n’oubliez de vous &lt;a title="r&amp;eacute;servation" href="http://altnet20091022.eventbrite.com/" target="_blank"&gt;inscrire&lt;/a&gt; !&lt;/p&gt;&lt;img width="0" height="0" src="http://www.nventive.net/Blog2/aggbug.ashx?id=187f3cc0-4c66-474a-a968-e29ba94de7fc"/&gt;&lt;/div&gt;</description>
      <comments>http://www.nventive.net/Blog2/CommentView,guid,187f3cc0-4c66-474a-a968-e29ba94de7fc.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://www.nventive.net/Blog2/Trackback.aspx?guid=6df9a707-c4ad-4984-9b5e-31573e1f1d0c</trackback:ping>
      <pingback:server>http://www.nventive.net/Blog2/pingback.aspx</pingback:server>
      <pingback:target>http://www.nventive.net/Blog2/PermaLink,guid,6df9a707-c4ad-4984-9b5e-31573e1f1d0c.aspx</pingback:target>
      <dc:creator>nVentive Coach Factor</dc:creator>
      <wfw:comment>http://www.nventive.net/Blog2/CommentView,guid,6df9a707-c4ad-4984-9b5e-31573e1f1d0c.aspx</wfw:comment>
      <wfw:commentRss>http://www.nventive.net/Blog2/SyndicationService.asmx/GetEntryCommentsRss?guid=6df9a707-c4ad-4984-9b5e-31573e1f1d0c</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <title>Discovering Umbrella – Part 5 of Many</title>
      <guid isPermaLink="false">http://www.nventive.net/Blog2/PermaLink,guid,6df9a707-c4ad-4984-9b5e-31573e1f1d0c.aspx</guid>
      <link>http://www.nVentive.net/Blog2/2009/04/26/DiscoveringUmbrellaPart5OfMany.aspx</link>
      <pubDate>Sun, 26 Apr 2009 23:28:29 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;More fun with dictionaries on the way. We’ve seen how to read from a dictionary with the GetValueOrDefault() extension method but that’s not enough.&lt;/p&gt; &lt;p&gt;We usually need a way to add items to a dictionary if they aren’t already there. Here’s a simple example of a caching mechanism that relies on in-memory dictionaries:&lt;/p&gt; &lt;p&gt;Given:&lt;/p&gt; &lt;div style="font-size: 11pt; background: white; color: black; font-family: courier new"&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;interface&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IOrderRepository&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px"&gt;{&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;Order&lt;/span&gt; GetOrderById(&lt;span style="color: blue"&gt;int&lt;/span&gt; id);&lt;/p&gt; &lt;p style="margin: 0px"&gt;}&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Order&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px"&gt;{&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;int&lt;/span&gt; Id { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;}&lt;/p&gt;&lt;/div&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;A simple caching mechanism can be obtained using the &lt;a href="http://en.wikipedia.org/wiki/Decorator_pattern" target="_blank"&gt;Decorator pattern&lt;/a&gt;:&lt;/p&gt; &lt;div style="font-size: 11pt; background: white; color: black; font-family: courier new"&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;CacheOrderRepository&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;IOrderRepository&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px"&gt;{&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;int&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;Order&lt;/span&gt;&amp;gt; orders = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;int&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;Order&lt;/span&gt;&amp;gt;();&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; CacheOrderRepository(&lt;span style="color: #2b91af"&gt;IOrderRepository&lt;/span&gt; repository)&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Repository = repository;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IOrderRepository&lt;/span&gt; Repository&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;get&lt;/span&gt;;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;set&lt;/span&gt;;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region&lt;/span&gt; IOrderRepository Members&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Order&lt;/span&gt; GetOrderById(&lt;span style="color: blue"&gt;int&lt;/span&gt; id)&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;Order&lt;/span&gt; order;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;if&lt;/span&gt; (!orders.TryGetValue(id, &lt;span style="color: blue"&gt;out&lt;/span&gt; order))&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; order = Repository.GetOrderById(id);&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; orders.Add(id, order);&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;return&lt;/span&gt; order;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px"&gt;}&lt;/p&gt;&lt;/div&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;What basically happens here is that we’ll first try to find the value from the local dictionary (hence the cache) and if not present, go to the real repository to fetch the value and then create an entry in the local cache with the result. So what the code really wants to say is:&lt;/p&gt; &lt;div style="font-size: 11pt; background: white; color: black; font-family: courier new"&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Order&lt;/span&gt; GetOrderById(&lt;span style="color: blue"&gt;int&lt;/span&gt; id)&lt;/p&gt; &lt;p style="margin: 0px"&gt;{&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;return&lt;/span&gt; orders.FindOrCreate(id, () =&amp;gt; Repository.GetOrderById(id));&lt;/p&gt; &lt;p style="margin: 0px"&gt;}&lt;/p&gt;&lt;/div&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;A simple refactoring of the previous implementation into an extension method would lead to something like:&lt;/p&gt; &lt;div style="font-size: 11pt; background: white; color: black; font-family: courier new"&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt; &lt;div style="font-size: 11pt; background: white; color: black; font-family: courier new"&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;DictionaryExtensions&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px"&gt;{&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; TValue FindOrCreate&amp;lt;TKey, TValue&amp;gt;(&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IDictionary&lt;/span&gt;&amp;lt;TKey, TValue&amp;gt; items, TKey key,&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;TValue&amp;gt; factory)&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TValue value;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;if&lt;/span&gt; (!items.TryGetValue(key, &lt;span style="color: blue"&gt;out&lt;/span&gt; value))&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; value = factory();&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; items.Add(key, value);&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;return&lt;/span&gt; value;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;}&lt;/p&gt;&lt;/div&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Note again that we’re extending the minimal interface, IDictionary&amp;lt;T&amp;gt;, and leveraging an existing delegate type, Func&amp;lt;T&amp;gt;.&lt;/p&gt; &lt;p&gt;() =&amp;gt; “Francois”&lt;/p&gt;&lt;img width="0" height="0" src="http://www.nventive.net/Blog2/aggbug.ashx?id=6df9a707-c4ad-4984-9b5e-31573e1f1d0c"/&gt;&lt;/div&gt;</description>
      <comments>http://www.nventive.net/Blog2/CommentView,guid,6df9a707-c4ad-4984-9b5e-31573e1f1d0c.aspx</comments>
      <category>.net - Extension Methods</category>
      <category>Umbrella</category>
    </item>
    <item>
      <trackback:ping>http://www.nventive.net/Blog2/Trackback.aspx?guid=513982a5-dda3-4dab-8531-e36d62dae406</trackback:ping>
      <pingback:server>http://www.nventive.net/Blog2/pingback.aspx</pingback:server>
      <pingback:target>http://www.nventive.net/Blog2/PermaLink,guid,513982a5-dda3-4dab-8531-e36d62dae406.aspx</pingback:target>
      <dc:creator>nVentive Coach Factor</dc:creator>
      <wfw:comment>http://www.nventive.net/Blog2/CommentView,guid,513982a5-dda3-4dab-8531-e36d62dae406.aspx</wfw:comment>
      <wfw:commentRss>http://www.nventive.net/Blog2/SyndicationService.asmx/GetEntryCommentsRss?guid=513982a5-dda3-4dab-8531-e36d62dae406</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <title>Discovering Umbrella – Part 4 of Many</title>
      <guid isPermaLink="false">http://www.nventive.net/Blog2/PermaLink,guid,513982a5-dda3-4dab-8531-e36d62dae406.aspx</guid>
      <link>http://www.nVentive.net/Blog2/2009/04/24/DiscoveringUmbrellaPart4OfMany.aspx</link>
      <pubDate>Fri, 24 Apr 2009 12:23:50 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;So far, we’ve seen useful tricks to extend basic collection types like IEnumerable&amp;lt;T&amp;gt; and ICollection&amp;lt;T&amp;gt; but more complex collections deserve attention too!  &lt;p&gt;&amp;nbsp; &lt;p&gt;Let’s look at IDictionary&amp;lt;T&amp;gt;. Here’s some code I stumbled upon recently; it is a partial implementation of IDataErrorInfo:  &lt;p&gt;&amp;nbsp; &lt;div style="font-size: 11pt; background: white; color: black; font-family: courier new"&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Order&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;IDataErrorInfo&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px"&gt;{&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IDictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;, &lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; errors = &lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;, &lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;();&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;decimal&lt;/span&gt; amount;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;decimal&lt;/span&gt; Amount &lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;get&lt;/span&gt; { &lt;span style="color: blue"&gt;return&lt;/span&gt; amount; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;set&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; amount = &lt;span style="color: blue"&gt;value&lt;/span&gt;;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;if&lt;/span&gt; (amount &amp;lt;= 0)&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; errors[&lt;span style="color: #a31515"&gt;"Amount"&lt;/span&gt;] = &lt;span style="color: #a31515"&gt;"Amount has to be larger than 0"&lt;/span&gt;;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;else&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; errors.Remove(&lt;span style="color: #a31515"&gt;"Amount"&lt;/span&gt;);&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region&lt;/span&gt; IDataErrorInfo Members&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; Error&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;get&lt;/span&gt; { &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; &lt;span style="color: blue"&gt;this&lt;/span&gt;[&lt;span style="color: blue"&gt;string&lt;/span&gt; columnName]&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;get&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;if&lt;/span&gt; (errors.ContainsKey(columnName))&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;return&lt;/span&gt; errors[columnName];&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;else&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px"&gt;}&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt; &lt;p&gt;The interesting part is:&lt;/p&gt; &lt;div style="font-size: 11pt; background: white; color: black; font-family: courier new"&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (errors.ContainsKey(columnName))&lt;/p&gt; &lt;p style="margin: 0px"&gt;{&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;return&lt;/span&gt; errors[columnName];&lt;/p&gt; &lt;p style="margin: 0px"&gt;}&lt;/p&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;else&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px"&gt;{&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;/p&gt; &lt;p style="margin: 0px"&gt;}&lt;/p&gt;&lt;/div&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;What’s the intent of this code? Pretty obvious isn’t it? It checks whether the dictionary has a value for a given key, then returns the value. If the key isn’t found, it returns the default value. This is similar to how the Nullable&amp;lt;T&amp;gt; type works:&lt;/p&gt; &lt;div style="font-size: 11pt; background: white; color: black; font-family: courier new"&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;int&lt;/span&gt;? index = &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;int&lt;/span&gt; indexValue = index.GetValueOrDefault();&lt;/p&gt;&lt;/div&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Here, for obvious reasons, indexValue’s value will equal 0. But what’s interesting is the GetValueOrDefault() method. It clearly expresses the intent as opposed to:&lt;/p&gt; &lt;div style="font-size: 11pt; background: white; color: black; font-family: courier new"&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;int&lt;/span&gt; indexValue = index == &lt;span style="color: blue"&gt;null&lt;/span&gt; ? 0 : index.Value;&lt;/p&gt;&lt;/div&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;The same thing could apply to dictionaries but hasn’t been provided as part of the Base Class Library:&lt;/p&gt; &lt;div style="font-size: 11pt; background: white; color: black; font-family: courier new"&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; &lt;span style="color: blue"&gt;this&lt;/span&gt;[&lt;span style="color: blue"&gt;string&lt;/span&gt; columnName]&lt;/p&gt; &lt;p style="margin: 0px"&gt;{&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;get&lt;/span&gt; { &lt;span style="color: blue"&gt;return&lt;/span&gt; errors.GetValueOrDefault(columnName); }&lt;/p&gt; &lt;p style="margin: 0px"&gt;}&lt;/p&gt;&lt;/div&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Here’s Umbrella’s implementation:&lt;/p&gt; &lt;div style="font-size: 11pt; background: white; color: black; font-family: courier new"&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;DictionaryExtensions&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px"&gt;{&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; TValue GetValueOrDefault&amp;lt;TKey, TValue&amp;gt;(&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IDictionary&lt;/span&gt;&amp;lt;TKey, TValue&amp;gt; dictionary, &lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TKey key)&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;return&lt;/span&gt; GetValueOrDefault(dictionary, key, &lt;span style="color: blue"&gt;default&lt;/span&gt;(TValue));&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; TValue GetValueOrDefault&amp;lt;TKey, TValue&amp;gt;(&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IDictionary&lt;/span&gt;&amp;lt;TKey, TValue&amp;gt; dictionary, &lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TKey key, &lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TValue defaultValue)&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;return&lt;/span&gt; GetValueOrDefault(dictionary, key, () =&amp;gt; defaultValue);&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; TValue GetValueOrDefault&amp;lt;TKey, TValue&amp;gt;(&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IDictionary&lt;/span&gt;&amp;lt;TKey, TValue&amp;gt; dictionary, &lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TKey key, &lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;TValue&amp;gt; defaultValueProvider)&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TValue value;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;if&lt;/span&gt; (!dictionary.TryGetValue(key, &lt;span style="color: blue"&gt;out&lt;/span&gt; value))&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; value = defaultValueProvider();&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;return&lt;/span&gt; value;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;}&lt;/p&gt;&lt;/div&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;The first method is an overload that will return default(T) if a default value is required.&lt;/p&gt; &lt;p&gt;The second method takes the defaultValue as a parameter&lt;/p&gt; &lt;p&gt;The third method contains the actual implementation and relies on a delegate to obtain the value since the defaultValue could either take some time to process or cannot be known in advance.&lt;/p&gt; &lt;p&gt;Again, these extension methods are small helpers to reduce the friction of th BCL. They are not meant to completely change the programming paradigm. They aren’t intrusive either. They should increase predictability of the source code with a side effect of decreasing the total lines of code count.&lt;/p&gt; &lt;p&gt;() =&amp;gt; “Francois”&lt;/p&gt;&lt;img width="0" height="0" src="http://www.nventive.net/Blog2/aggbug.ashx?id=513982a5-dda3-4dab-8531-e36d62dae406"/&gt;&lt;/div&gt;</description>
      <comments>http://www.nventive.net/Blog2/CommentView,guid,513982a5-dda3-4dab-8531-e36d62dae406.aspx</comments>
      <category>.net - Extension Methods</category>
      <category>Umbrella</category>
    </item>
    <item>
      <trackback:ping>http://www.nventive.net/Blog2/Trackback.aspx?guid=c86be7d4-8b58-41ea-8231-a9be67915b55</trackback:ping>
      <pingback:server>http://www.nventive.net/Blog2/pingback.aspx</pingback:server>
      <pingback:target>http://www.nventive.net/Blog2/PermaLink,guid,c86be7d4-8b58-41ea-8231-a9be67915b55.aspx</pingback:target>
      <dc:creator>nVentive Coach Factor</dc:creator>
      <wfw:comment>http://www.nventive.net/Blog2/CommentView,guid,c86be7d4-8b58-41ea-8231-a9be67915b55.aspx</wfw:comment>
      <wfw:commentRss>http://www.nventive.net/Blog2/SyndicationService.asmx/GetEntryCommentsRss?guid=c86be7d4-8b58-41ea-8231-a9be67915b55</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <title>Discovering Umbrella – Part 3 of Many</title>
      <guid isPermaLink="false">http://www.nventive.net/Blog2/PermaLink,guid,c86be7d4-8b58-41ea-8231-a9be67915b55.aspx</guid>
      <link>http://www.nVentive.net/Blog2/2009/04/23/DiscoveringUmbrellaPart3OfMany.aspx</link>
      <pubDate>Thu, 23 Apr 2009 14:03:24 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;There is code what we type over and over again without realizing how many mistakes can be made in a few lines. Let’s take the example where we want to remove items from a collection. Intuitively, the code should be something like:&lt;/p&gt; &lt;div style="font-size: 11pt; background: white; color: black; font-family: courier new"&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; orders = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Order&lt;/span&gt;&amp;gt; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Order&lt;/span&gt; { Total = 100 },&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Order&lt;/span&gt; { Total = 150 },&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Order&lt;/span&gt; { Total = 200 }};&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue"&gt;var&lt;/span&gt; order &lt;span style="color: blue"&gt;in&lt;/span&gt; orders)&lt;/p&gt; &lt;p style="margin: 0px"&gt;{&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;if&lt;/span&gt; (order.Total &amp;gt; 100)&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; orders.Remove(order);&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;}&lt;/p&gt;&lt;/div&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;However, this will fail miserably with an “InvalidOperationException: Collection was modified; enumeration operation may not execute.” &lt;/p&gt; &lt;p&gt;In fact, it doesn’t fail on the Remove() call, it fails on the MoveNext() as we can’t enumerate a modified collection or can’t modify a collection while enumerating. In order to work correctly, we learned that we need to first keep track of the items to remove and then enumerate through those and remove them from the collection:&lt;/p&gt; &lt;div style="font-size: 11pt; background: white; color: black; font-family: courier new"&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; orders = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Order&lt;/span&gt;&amp;gt; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Order&lt;/span&gt; { Total = 100 },&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Order&lt;/span&gt; { Total = 150 },&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Order&lt;/span&gt; { Total = 200 }};&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; ordersToRemove = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Order&lt;/span&gt;&amp;gt;();&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue"&gt;var&lt;/span&gt; order &lt;span style="color: blue"&gt;in&lt;/span&gt; orders)&lt;/p&gt; &lt;p style="margin: 0px"&gt;{&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;if&lt;/span&gt; (order.Total &amp;gt; 100)&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ordersToRemove.Add(order);&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;}&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue"&gt;var&lt;/span&gt; order &lt;span style="color: blue"&gt;in&lt;/span&gt; ordersToRemove)&lt;/p&gt; &lt;p style="margin: 0px"&gt;{&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; orders.Remove(order);&lt;/p&gt; &lt;p style="margin: 0px"&gt;}&lt;/p&gt;&lt;/div&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Wow! That is a huge amount of code. At least it can be refactored in a generic extension method:&lt;/p&gt; &lt;div style="font-size: 11pt; background: white; color: black; font-family: courier new"&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;CollectionExtensions&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px"&gt;{&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Remove&amp;lt;T&amp;gt;(&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ICollection&lt;/span&gt;&amp;lt;T&amp;gt; collection, &lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style="color: blue"&gt;bool&lt;/span&gt;&amp;gt; predicate)&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;var&lt;/span&gt; itemsToRemove = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;T&amp;gt;();&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue"&gt;var&lt;/span&gt; item &lt;span style="color: blue"&gt;in&lt;/span&gt; collection)&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;if&lt;/span&gt; (predicate(item))&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; itemsToRemove.Add(item);&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue"&gt;var&lt;/span&gt; item &lt;span style="color: blue"&gt;in&lt;/span&gt; itemsToRemove)&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; collection.Remove(item);&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;}&lt;/p&gt;&lt;/div&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;And then be used as:&lt;/p&gt; &lt;div style="font-size: 11pt; background: white; color: black; font-family: courier new"&gt; &lt;p style="margin: 0px"&gt;orders.Remove(o =&amp;gt; o.Total &amp;gt; 100);&lt;/p&gt;&lt;/div&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;In Umbrella, we go the extra mile and “simplify” the implementation of the Remove() extension method and dog food our own extensions:&lt;/p&gt; &lt;div style="font-size: 11pt; background: white; color: black; font-family: courier new"&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Remove&amp;lt;T&amp;gt;(&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ICollection&lt;/span&gt;&amp;lt;T&amp;gt; collection, &lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style="color: blue"&gt;bool&lt;/span&gt;&amp;gt; predicate)&lt;/p&gt; &lt;p style="margin: 0px"&gt;{&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; collection&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Where(predicate)&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .ToList()&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .ForEach(item =&amp;gt; collection.Remove(item));&lt;/p&gt; &lt;p style="margin: 0px"&gt;}&lt;/p&gt;&lt;/div&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;What basically happens here is that we:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Filter the original collection to keep only the items to remove (Sounds familiar?)  &lt;li&gt;Copy those items to a temporary list (Remember?)  &lt;li&gt;For each of those items, call Remove() on the original collection (Rings a bell?)&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;() =&amp;gt; “Francois”&lt;/p&gt;&lt;img width="0" height="0" src="http://www.nventive.net/Blog2/aggbug.ashx?id=c86be7d4-8b58-41ea-8231-a9be67915b55"/&gt;&lt;/div&gt;</description>
      <comments>http://www.nventive.net/Blog2/CommentView,guid,c86be7d4-8b58-41ea-8231-a9be67915b55.aspx</comments>
      <category>.net - Extension Methods</category>
      <category>Umbrella</category>
    </item>
    <item>
      <trackback:ping>http://www.nventive.net/Blog2/Trackback.aspx?guid=eb997e11-796a-4ac2-915d-05bc8f79fb85</trackback:ping>
      <pingback:server>http://www.nventive.net/Blog2/pingback.aspx</pingback:server>
      <pingback:target>http://www.nventive.net/Blog2/PermaLink,guid,eb997e11-796a-4ac2-915d-05bc8f79fb85.aspx</pingback:target>
      <dc:creator>nVentive Coach Factor</dc:creator>
      <wfw:comment>http://www.nventive.net/Blog2/CommentView,guid,eb997e11-796a-4ac2-915d-05bc8f79fb85.aspx</wfw:comment>
      <wfw:commentRss>http://www.nventive.net/Blog2/SyndicationService.asmx/GetEntryCommentsRss?guid=eb997e11-796a-4ac2-915d-05bc8f79fb85</wfw:commentRss>
      <title>Discovering Umbrella – Part 2 of Many</title>
      <guid isPermaLink="false">http://www.nventive.net/Blog2/PermaLink,guid,eb997e11-796a-4ac2-915d-05bc8f79fb85.aspx</guid>
      <link>http://www.nVentive.net/Blog2/2009/04/22/DiscoveringUmbrellaPart2OfMany.aspx</link>
      <pubDate>Wed, 22 Apr 2009 16:19:16 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Some extension methods in &lt;a href="http://www.codeplex.com/umbrella" target="_blank"&gt;Umbrella&lt;/a&gt; are simple but yet useful. It usually ends up being exiting methods from the Base Class Library that weren’t defined on the simplest interface required but more as a helper method on more concrete types:&lt;/p&gt; &lt;p&gt;Let’s start with the most straighforward example:&lt;/p&gt; &lt;p&gt;Given:&lt;/p&gt; &lt;div style="font-size: 11pt; background: white; color: black; font-family: courier new"&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Order&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px"&gt;{&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;decimal&lt;/span&gt; Total { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;}&lt;/p&gt;&lt;/div&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;We’ll usually see something like:&lt;/p&gt; &lt;div style="font-size: 11pt; background: white; color: black; font-family: courier new"&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; orders = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Order&lt;/span&gt;&amp;gt;();&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; order = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Order&lt;/span&gt;();&lt;/p&gt; &lt;p style="margin: 0px"&gt;orders.Add(order);&lt;/p&gt;&lt;/div&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;But when the item to add to the collection has a default constructor, we could have a shorter syntax:&lt;/p&gt; &lt;div style="font-size: 11pt; background: white; color: black; font-family: courier new"&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; orders = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Order&lt;/span&gt;&amp;gt;();&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; order = orders.AddNew();&lt;/p&gt;&lt;/div&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;But AddNew() isn’t a member of List&amp;lt;T&amp;gt;. Have you guessed how AddNew() is implemented? Using extension methods, of course but what should be extended? List&amp;lt;T&amp;gt;? It is actually ICollection&amp;lt;T&amp;gt; as it is the interface containing the Add method.&lt;/p&gt; &lt;div style="font-size: 11pt; background: white; color: black; font-family: courier new"&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;CollectionExtensions&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px"&gt;{&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; T AddNew&amp;lt;T&amp;gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ICollection&lt;/span&gt;&amp;lt;T&amp;gt; items)&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;where&lt;/span&gt; T : &lt;span style="color: blue"&gt;new&lt;/span&gt;()&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; T item = &lt;span style="color: blue"&gt;new&lt;/span&gt; T();&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; items.Add(item);&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;return&lt;/span&gt; item;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;}&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt; &lt;p&gt;A generic constraint on T having a default constructor is required so that new() can be called.&lt;/p&gt; &lt;p&gt;I mentioned that some helper methods have been defined on concrete types on the past where now, with extension methods, they could be extending simple interfaces. It is the case of List&amp;lt;T&amp;gt;.AddRange():&lt;/p&gt; &lt;div style="font-size: 11pt; background: white; color: black; font-family: courier new"&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; orders = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Order&lt;/span&gt;&amp;gt;();&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; newOrders = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Order&lt;/span&gt;&amp;gt; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Order&lt;/span&gt; { Total = 100 },&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Order&lt;/span&gt; { Total = 150 },&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Order&lt;/span&gt; { Total = 200 }};&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;orders.AddRange(newOrders);&lt;/p&gt;&lt;/div&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;What AddRange logically does, is call Add for each new item. If we were to boil it down to its simplest form:&lt;/p&gt; &lt;div style="font-size: 11pt; background: white; color: black; font-family: courier new"&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;CollectionExtensions&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px"&gt;{&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; AddRange&amp;lt;T&amp;gt;(&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ICollection&lt;/span&gt;&amp;lt;T&amp;gt; collection, &lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; items)&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; items.ForEach(collection.Add);&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;}&lt;/p&gt;&lt;/div&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Don’t get confused by the “collection.Add” syntax, it is the method group syntax. The equivalent lambda expression would be:&lt;/p&gt; &lt;div style="font-size: 11pt; background: white; color: black; font-family: courier new"&gt; &lt;p style="margin: 0px"&gt;items.ForEach(item =&amp;gt; collection.Add(item));&lt;/p&gt;&lt;/div&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;That’s it for Part 2!&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;() =&amp;gt; “Francois”&lt;/p&gt;&lt;img width="0" height="0" src="http://www.nventive.net/Blog2/aggbug.ashx?id=eb997e11-796a-4ac2-915d-05bc8f79fb85"/&gt;&lt;/div&gt;</description>
      <comments>http://www.nventive.net/Blog2/CommentView,guid,eb997e11-796a-4ac2-915d-05bc8f79fb85.aspx</comments>
      <category>.net - Extension Methods</category>
      <category>Umbrella</category>
    </item>
    <item>
      <trackback:ping>http://www.nventive.net/Blog2/Trackback.aspx?guid=96ad6984-e3c8-471b-8c33-3a94cc77cf48</trackback:ping>
      <pingback:server>http://www.nventive.net/Blog2/pingback.aspx</pingback:server>
      <pingback:target>http://www.nventive.net/Blog2/PermaLink,guid,96ad6984-e3c8-471b-8c33-3a94cc77cf48.aspx</pingback:target>
      <dc:creator>nVentive Coach Factor</dc:creator>
      <wfw:comment>http://www.nventive.net/Blog2/CommentView,guid,96ad6984-e3c8-471b-8c33-3a94cc77cf48.aspx</wfw:comment>
      <wfw:commentRss>http://www.nventive.net/Blog2/SyndicationService.asmx/GetEntryCommentsRss?guid=96ad6984-e3c8-471b-8c33-3a94cc77cf48</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <title>Discovering Umbrella – Part 1 of Many</title>
      <guid isPermaLink="false">http://www.nventive.net/Blog2/PermaLink,guid,96ad6984-e3c8-471b-8c33-3a94cc77cf48.aspx</guid>
      <link>http://www.nVentive.net/Blog2/2009/04/22/DiscoveringUmbrellaPart1OfMany.aspx</link>
      <pubDate>Wed, 22 Apr 2009 03:30:26 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;For the last couple of days, Michael, a friend of us has changed his Messenger tagline to: “If the code speaks for itself, don’t interrupt”.&lt;/p&gt; &lt;p&gt;It expresses clearly the intent of Umbrella… To allow the developer to create code that speaks for itself as opposed to code that requires a translator.&lt;/p&gt; &lt;p&gt;Let’s take the following code:&lt;/p&gt; &lt;div style="font-size: 11pt; background: white; color: black; font-family: courier new"&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Main(&lt;span style="color: blue"&gt;string&lt;/span&gt;[] args)&lt;/p&gt; &lt;p style="margin: 0px"&gt;{&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue"&gt;var&lt;/span&gt; arg &lt;span style="color: blue"&gt;in&lt;/span&gt; args)&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;if&lt;/span&gt; (!&lt;span style="color: blue"&gt;string&lt;/span&gt;.IsNullOrEmpty(arg))&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(arg);&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.ReadLine();&lt;/p&gt; &lt;p style="margin: 0px"&gt;}&lt;/p&gt;&lt;/div&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;If we were to “listen” to the code, it would say that for each arg in the args list, if the string has a value, it should be displayed in the console. &lt;/p&gt; &lt;p&gt;So in order to let the code speak more clearly, we should be able to write something like:&lt;/p&gt; &lt;div style="font-size: 11pt; background: white; color: black; font-family: courier new"&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Main(&lt;span style="color: blue"&gt;string&lt;/span&gt;[] args)&lt;/p&gt; &lt;p style="margin: 0px"&gt;{&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; args.Where(a =&amp;gt; a.HasValue())&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .ForEach(a =&amp;gt; &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(a));&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.ReadLine();&lt;/p&gt; &lt;p style="margin: 0px"&gt;}&lt;/p&gt;&lt;/div&gt; &lt;div id="codeSnippetWrapper"&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;It might not show as there is not much going on, but the intent is clearer.&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;Even if the following two statements are equivalent, one is more focused and concise:&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div style="font-size: 11pt; background: white; color: black; font-family: courier new"&gt; &lt;p style="margin: 0px"&gt;!&lt;span style="color: blue"&gt;string&lt;/span&gt;.IsNullOrEmpty(arg)&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt; &lt;div style="font-size: 11pt; background: white; color: black; font-family: courier new"&gt; &lt;p style="margin: 0px"&gt;arg.HasValue()&lt;/p&gt;&lt;/div&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;In order to obtain this simpler syntax, we simply leverage the &lt;a href="http://www.nventive.net/Blog2/CategoryView,category,netExtensionMethods.aspx" target="_blank"&gt;extension methods&lt;/a&gt; paradigm from C# 3.0 and &lt;a href="http://msdn.microsoft.com/en-us/netframework/aa904594.aspx" target="_blank"&gt;LINQ&lt;/a&gt; for the Where clause:&lt;/p&gt; &lt;div style="font-size: 11pt; background: white; color: black; font-family: courier new"&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;StringExtensions&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px"&gt;{&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;bool&lt;/span&gt; HasValue(&lt;span style="color: blue"&gt;this&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; value)&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;return&lt;/span&gt; !&lt;span style="color: blue"&gt;string&lt;/span&gt;.IsNullOrEmpty(value);&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;}&lt;/p&gt;&lt;/div&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Remember, to code an extension it takes 3 ingredients:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;A static class  &lt;li&gt;A static method  &lt;li&gt;The this modified on the first method parameter&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;As you probably guessed, the ForEach implementation is as simple:&lt;/p&gt; &lt;div style="font-size: 11pt; background: white; color: black; font-family: courier new"&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;EnumerableExtensions&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px"&gt;{&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; ForEach&amp;lt;T&amp;gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; items, &lt;span style="color: #2b91af"&gt;Action&lt;/span&gt;&amp;lt;T&amp;gt; action)&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue"&gt;var&lt;/span&gt; item &lt;span style="color: blue"&gt;in&lt;/span&gt; items)&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; action(item);&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;}&lt;/p&gt;&lt;/div&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Two important things to node with the ForEach extension:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;We’ve extended the minimal interface required (IEnumerable&amp;lt;T&amp;gt;)  &lt;li&gt;We’ve leveraged the existing Action&amp;lt;T&amp;gt; delegate as opposed to defining a custom one&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;In the following posts, we’ll show how much more the code can say!&lt;/p&gt; &lt;p&gt;() =&amp;gt; “Francois”&lt;/p&gt;&lt;img width="0" height="0" src="http://www.nventive.net/Blog2/aggbug.ashx?id=96ad6984-e3c8-471b-8c33-3a94cc77cf48"/&gt;&lt;/div&gt;</description>
      <comments>http://www.nventive.net/Blog2/CommentView,guid,96ad6984-e3c8-471b-8c33-3a94cc77cf48.aspx</comments>
      <category>.net - Extension Methods</category>
      <category>Umbrella</category>
    </item>
    <item>
      <trackback:ping>http://www.nventive.net/Blog2/Trackback.aspx?guid=7b95a0f1-919c-4e3c-b696-4abf00774ff1</trackback:ping>
      <pingback:server>http://www.nventive.net/Blog2/pingback.aspx</pingback:server>
      <pingback:target>http://www.nventive.net/Blog2/PermaLink,guid,7b95a0f1-919c-4e3c-b696-4abf00774ff1.aspx</pingback:target>
      <dc:creator>nVentive Coach Factor</dc:creator>
      <wfw:comment>http://www.nventive.net/Blog2/CommentView,guid,7b95a0f1-919c-4e3c-b696-4abf00774ff1.aspx</wfw:comment>
      <wfw:commentRss>http://www.nventive.net/Blog2/SyndicationService.asmx/GetEntryCommentsRss?guid=7b95a0f1-919c-4e3c-b696-4abf00774ff1</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <title>Discovering Umbrella - Part 0 of Many</title>
      <guid isPermaLink="false">http://www.nventive.net/Blog2/PermaLink,guid,7b95a0f1-919c-4e3c-b696-4abf00774ff1.aspx</guid>
      <link>http://www.nVentive.net/Blog2/2009/04/20/DiscoveringUmbrellaPart0OfMany.aspx</link>
      <pubDate>Mon, 20 Apr 2009 18:57:05 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Everything is about perception. When people look at &lt;a href="http://www.codeplex.com/umbrella" target="_blank"&gt;Umbrella&lt;/a&gt;, they think it is huge; for us, it is simply a thin layer over the BCL and various MS technologies that improve the development experience.&lt;/p&gt; &lt;p&gt;Design principles for Umbrella are really simple:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Eat_one's_own_dog_food" target="_blank"&gt;Eat our own dog food&lt;/a&gt;  &lt;ul&gt; &lt;li&gt;Umbrella has been developed using Umbrella.&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Don't_repeat_yourself" target="_blank"&gt;Don’t repeat yourself&lt;/a&gt;  &lt;ul&gt; &lt;li&gt;It’s really about addressing an issue once and only once.&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;Stronger abstractions  &lt;ul&gt; &lt;li&gt;Coming up with the ISource&amp;lt;T&amp;gt; name for a generic getter-setter allows us to create higher abstraction.&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Fluent_interface" target="_blank"&gt;Fluent interface&lt;/a&gt;  &lt;ul&gt; &lt;li&gt;name.Validation().NotNull() as opposed to ArgumentHelper.CheckNotNull(name)&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;Predictability  &lt;ul&gt; &lt;li&gt;The members are where they feel natural and discoverability is easy.&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;Zero friction  &lt;ul&gt; &lt;li&gt;Supported by other principles, it is mainly focused as working effectively in a TDD environment, easily mockable, extensible, …&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;Leverage and Reuse  &lt;ul&gt; &lt;li&gt;We use Action&amp;lt;T&amp;gt; and Func&amp;lt;T&amp;gt; as opposed to defining new delegates over and over again&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;In order to make this happen, we heavily rely on new C# 3.0 language features like &lt;a href="http://msdn.microsoft.com/en-us/library/ms364047(VS.80).aspx" target="_blank"&gt;lambda expressions&lt;/a&gt; and &lt;a href="http://www.nventive.net/Blog2/CategoryView,category,netExtensionMethods.aspx" target="_blank"&gt;extension methods&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;In order to showcase many of the functionalities we use on a daily basis, we’re launching a new serie of blog posts focused specifically at Umbrella. Stay tuned!&lt;/p&gt; &lt;p&gt;() =&amp;gt; “Francois”&lt;/p&gt;&lt;img width="0" height="0" src="http://www.nventive.net/Blog2/aggbug.ashx?id=7b95a0f1-919c-4e3c-b696-4abf00774ff1"/&gt;&lt;/div&gt;</description>
      <comments>http://www.nventive.net/Blog2/CommentView,guid,7b95a0f1-919c-4e3c-b696-4abf00774ff1.aspx</comments>
      <category>Umbrella</category>
    </item>
    <item>
      <trackback:ping>http://www.nventive.net/Blog2/Trackback.aspx?guid=9b770616-b82c-4c55-a47c-55a6b4aa2482</trackback:ping>
      <pingback:server>http://www.nventive.net/Blog2/pingback.aspx</pingback:server>
      <pingback:target>http://www.nventive.net/Blog2/PermaLink,guid,9b770616-b82c-4c55-a47c-55a6b4aa2482.aspx</pingback:target>
      <dc:creator>nVentive Coach Factor</dc:creator>
      <wfw:comment>http://www.nventive.net/Blog2/CommentView,guid,9b770616-b82c-4c55-a47c-55a6b4aa2482.aspx</wfw:comment>
      <wfw:commentRss>http://www.nventive.net/Blog2/SyndicationService.asmx/GetEntryCommentsRss?guid=9b770616-b82c-4c55-a47c-55a6b4aa2482</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <title>“But it works on my machine” and why Continuous Integration matters</title>
      <guid isPermaLink="false">http://www.nventive.net/Blog2/PermaLink,guid,9b770616-b82c-4c55-a47c-55a6b4aa2482.aspx</guid>
      <link>http://www.nVentive.net/Blog2/2009/04/19/ButItWorksOnMyMachineAndWhyContinuousIntegrationMatters.aspx</link>
      <pubDate>Sun, 19 Apr 2009 20:26:00 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;In an agile team, things go fast. And when things go fast, it usually gets messy. But then, why agile teams have proven record of success? &lt;/p&gt; &lt;p&gt;An agile method is based on a set of &lt;a href="http://agilemanifesto.org/" target="_blank"&gt;values&lt;/a&gt; and &lt;a href="http://agilemanifesto.org/principles.html" target="_blank"&gt;principles&lt;/a&gt; that embrace and&amp;nbsp; support each other. When one aspect of the philosophy looks like it’s not “formal” enough, another practice supports its weaknesses.&lt;/p&gt; &lt;h2&gt;Environment&lt;/h2&gt; &lt;p&gt;In order to stay focused on the task at hand, an agile team will have to setup its environment to make sure everything runs smoothly. They will create &lt;a href="http://en.wikipedia.org/wiki/Unit_testing" target="_blank"&gt;unit tests&lt;/a&gt; and make sure they get the green light prior to a check-in; but that’s usually not enough. They need to make sure it works on their machine and that it can work on any other box matching the requirements.Those requirements represent the environment the software needs to live in to run smoothly (or at all). It will vary but can usually include:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;A specific version of the runtime  &lt;li&gt;Third party assemblies deployed (locally or in the gac)  &lt;li&gt;Configuration files at different URIs (ideally relative)  &lt;li&gt;Environment variables  &lt;li&gt;WMI schema registered  &lt;li&gt;Registry entries&lt;/li&gt;&lt;/ul&gt; &lt;h2&gt;Continuous Integration&lt;/h2&gt; &lt;p&gt;An many variables come into play, we need to make sure that for a given set of values, the software always works the same. In order to do so, agile teams will setup a clean environment (build server), seal it and automatically test that whatever changes in the software, it will continue to run on this environment. That’s what &lt;a href="http://en.wikipedia.org/wiki/Continuous_integration" target="_blank"&gt;continuous integration&lt;/a&gt; (CI) is all about: continuously integrating the latest changes into a given environment and automatically checking that it installs correctly, that it runs as expected.&lt;/p&gt; &lt;h2&gt;Contamination&lt;/h2&gt; &lt;p&gt;Why isn’t the dev environment clean enough? Because we all know many things are going on and aren’t ideal on a dev box:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;A newer version of a component is installed to test out features we might need in the future  &lt;li&gt;A beta is installed and then uninstalled (partially)  &lt;li&gt;Registry entries get deleted or manually added  &lt;li&gt;Parallel versions are running  &lt;li&gt;Debug versions are running  &lt;li&gt;Bits exist locally but aren’t in sync with source control (think Lib folder)&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Those are all reasons why it might “work on your machine” but not on “every machine”. Choose your side.&lt;/p&gt; &lt;h2&gt;Long and External&lt;/h2&gt; &lt;p&gt;When code changes, it might break existing assumption. Agile teams will try to document those assumptions in some executable format, usually unit tests. But not all tests are born equal. Some are bigger and broader that simple units. Some are testing the integration, the system and the use case as a whole. Should a developer wait for every single test to pass when he changes a string.Format() argument before he commits the change back to the repository? Ideally yes. But that’s not ideal; he might end up having to wait for a while for those exhaustive tests to pass (or will they?).&lt;/p&gt; &lt;p&gt;When you have a CI mechanism with a dedicated build machine; the whole suite of tests will automatically run in the background when something changes in the source code repository. While the developer continue working on new problems, he will get notified if something broke the build. The context the breaking change was made in has still not totally dissipated and it is easy to figure out what went wrong.&lt;/p&gt; &lt;p&gt;A long running test is one thing, but what about external tests? Some other teams might have some dependencies on your code. Some other projects of your own might have some dependencies on these modified bits? What then? Well they should also be part of the CI build so that they too can receive quick feedback that something is going wrong.&lt;/p&gt; &lt;h2&gt;&lt;/h2&gt; &lt;h2&gt;Tools&lt;/h2&gt; &lt;p&gt;There are many tools to help you with CI. &lt;a href="http://ccnet.thoughtworks.com/" target="_blank"&gt;Cruise Control .net&lt;/a&gt; is one of the most popular. &lt;a href="http://cifactory.org/" target="_blank"&gt;CI factory&lt;/a&gt; is a facade over CC.net that eases the configuration process.&lt;/p&gt; &lt;h2&gt;Process&lt;/h2&gt; &lt;p&gt;CI should be put in place as soon as possible; usually during Sprint 0 so that the team is up and running for Sprint 1 and leverage the short feedback loop quickly. A good enough CI environment can usually be setup in less than a day. &lt;/p&gt; &lt;p&gt;But what if it fails? What if it fails between the new tests have been committed and they don’t make sense? What if code shows a flaw in the acceptance criteria? What if you have a dedicated test team as opposed to a truly cross-functional dev team? That’s where things get interesting. &lt;/p&gt; &lt;p&gt;There’s no absolute truth to this one. However, depending on the type of test that failed (integrated or unit), it might end up being the dedicated test team that lives on the front line, assesses the bug and then informs the dev team that something went wrong.&lt;/p&gt; &lt;p&gt;() =&amp;gt; “Francois”&lt;/p&gt;&lt;img width="0" height="0" src="http://www.nventive.net/Blog2/aggbug.ashx?id=9b770616-b82c-4c55-a47c-55a6b4aa2482"/&gt;&lt;/div&gt;</description>
      <comments>http://www.nventive.net/Blog2/CommentView,guid,9b770616-b82c-4c55-a47c-55a6b4aa2482.aspx</comments>
      <category>.net</category>
      <category>Agile - Development</category>
    </item>
    <item>
      <trackback:ping>http://www.nventive.net/Blog2/Trackback.aspx?guid=3bc19daa-eeee-4608-8eee-774141d7d964</trackback:ping>
      <pingback:server>http://www.nventive.net/Blog2/pingback.aspx</pingback:server>
      <pingback:target>http://www.nventive.net/Blog2/PermaLink,guid,3bc19daa-eeee-4608-8eee-774141d7d964.aspx</pingback:target>
      <dc:creator>nVentive Coach Factor</dc:creator>
      <wfw:comment>http://www.nventive.net/Blog2/CommentView,guid,3bc19daa-eeee-4608-8eee-774141d7d964.aspx</wfw:comment>
      <wfw:commentRss>http://www.nventive.net/Blog2/SyndicationService.asmx/GetEntryCommentsRss?guid=3bc19daa-eeee-4608-8eee-774141d7d964</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <title>Enterprise Library V5 Backlog is Out!</title>
      <guid isPermaLink="false">http://www.nventive.net/Blog2/PermaLink,guid,3bc19daa-eeee-4608-8eee-774141d7d964.aspx</guid>
      <link>http://www.nVentive.net/Blog2/2009/04/19/EnterpriseLibraryV5BacklogIsOut.aspx</link>
      <pubDate>Sun, 19 Apr 2009 17:08:35 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Grigori, Program Manager of Enterprise Library at Microsoft Patterns &amp;amp; Practices has published the &lt;a href="http://blogs.msdn.com/agile/archive/2009/04/16/enterprise-library-5-0-product-backlog-prioritization-results.aspx" target="_blank"&gt;prioritized backlog&lt;/a&gt; for V5. He explains in details the procedure that has taken place to select items we’ll be working on. It is impressive how Microsoft has turned to the community to get feedback: blog posts, advisory board, events, Codeplex, MSDN, …&lt;/p&gt; &lt;p&gt;It also exciting to see how many of you answered the &lt;a href="http://blogs.msdn.com/agile/archive/2009/03/27/enterprise-library-5-0-tentative-product-backlog-published-story-feature-prioritization-is-open-your-participation-is-invited.aspx" target="_blank"&gt;survey&lt;/a&gt;. It shows that Enterprise Library provides great value to many of us and that we should continue working with this interesting beast.&lt;/p&gt; &lt;p&gt;If you have a look at the backlog, you’ll see that we’ll spend much time trying to simplify the EntLib story. Whether it’s through Architecture refactoring, documentation, labs, the story should become clearer to understand and easier to tell. It will also likely embrace new technologies like WPF and WCF.&lt;/p&gt; &lt;p&gt;Go have a look! With previous versions, there was a weekly drop on &lt;a href="http://www.codeplex.com/entlib" target="_blank"&gt;Codeplex&lt;/a&gt;. You should get some bits of V5 sooner than later as we’ve already started an iteration!&lt;/p&gt; &lt;p&gt;() =&amp;gt; “Francois”&lt;/p&gt;&lt;img width="0" height="0" src="http://www.nventive.net/Blog2/aggbug.ashx?id=3bc19daa-eeee-4608-8eee-774141d7d964"/&gt;&lt;/div&gt;</description>
      <comments>http://www.nventive.net/Blog2/CommentView,guid,3bc19daa-eeee-4608-8eee-774141d7d964.aspx</comments>
      <category>.net - Microsoft PnP</category>
    </item>
    <item>
      <trackback:ping>http://www.nventive.net/Blog2/Trackback.aspx?guid=5b616598-47bc-474a-afde-e00d6ec40bb1</trackback:ping>
      <pingback:server>http://www.nventive.net/Blog2/pingback.aspx</pingback:server>
      <pingback:target>http://www.nventive.net/Blog2/PermaLink,guid,5b616598-47bc-474a-afde-e00d6ec40bb1.aspx</pingback:target>
      <dc:creator>nVentive Coach Factor</dc:creator>
      <wfw:comment>http://www.nventive.net/Blog2/CommentView,guid,5b616598-47bc-474a-afde-e00d6ec40bb1.aspx</wfw:comment>
      <wfw:commentRss>http://www.nventive.net/Blog2/SyndicationService.asmx/GetEntryCommentsRss?guid=5b616598-47bc-474a-afde-e00d6ec40bb1</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <title>MVP</title>
      <guid isPermaLink="false">http://www.nventive.net/Blog2/PermaLink,guid,5b616598-47bc-474a-afde-e00d6ec40bb1.aspx</guid>
      <link>http://www.nVentive.net/Blog2/2009/04/01/MVP.aspx</link>
      <pubDate>Wed, 01 Apr 2009 21:27:05 GMT</pubDate>
      <description>&lt;div&gt;&lt;P&gt;As you know, nVentive's founders Erik Renaud and Francois Tanguay are both MVPs. Now that means that we get an opportunity to work with Microsoft in order to provide feedback from our clients and the community. Now if you'd like to read more on what it means to Erik, go ahead and read it &lt;A href="http://blogs.msdn.com/cdndevs/archive/2009/03/30/mvp-insider-q-a-with-erik-renaud.aspx"&gt;here&lt;/A&gt; !&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img width="0" height="0" src="http://www.nventive.net/Blog2/aggbug.ashx?id=5b616598-47bc-474a-afde-e00d6ec40bb1"/&gt;&lt;/div&gt;</description>
      <comments>http://www.nventive.net/Blog2/CommentView,guid,5b616598-47bc-474a-afde-e00d6ec40bb1.aspx</comments>
      <category>.net</category>
      <category>Umbrella</category>
    </item>
    <item>
      <trackback:ping>http://www.nventive.net/Blog2/Trackback.aspx?guid=2403822d-a9be-4345-be49-53d25eb2209c</trackback:ping>
      <pingback:server>http://www.nventive.net/Blog2/pingback.aspx</pingback:server>
      <pingback:target>http://www.nventive.net/Blog2/PermaLink,guid,2403822d-a9be-4345-be49-53d25eb2209c.aspx</pingback:target>
      <dc:creator>nVentive Coach Factor</dc:creator>
      <wfw:comment>http://www.nventive.net/Blog2/CommentView,guid,2403822d-a9be-4345-be49-53d25eb2209c.aspx</wfw:comment>
      <wfw:commentRss>http://www.nventive.net/Blog2/SyndicationService.asmx/GetEntryCommentsRss?guid=2403822d-a9be-4345-be49-53d25eb2209c</wfw:commentRss>
      <title>REST and Command Query Seperation</title>
      <guid isPermaLink="false">http://www.nventive.net/Blog2/PermaLink,guid,2403822d-a9be-4345-be49-53d25eb2209c.aspx</guid>
      <link>http://www.nVentive.net/Blog2/2009/03/10/RESTAndCommandQuerySeperation.aspx</link>
      <pubDate>Tue, 10 Mar 2009 21:39:16 GMT</pubDate>
      <description>&lt;div&gt;&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 10pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: 'Verdana','sans-serif'; COLOR: #003300; FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;Francois and Erik both attended the &lt;/SPAN&gt;&lt;A href="http://www.microsoft.com/mvp"&gt;&lt;SPAN style="FONT-FAMILY: 'Verdana','sans-serif'; COLOR: blue; FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;MVP Summit&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="FONT-FAMILY: 'Verdana','sans-serif'; COLOR: #003300; FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt; that just occured in Seattle, and we had a chance to visit the &lt;/SPAN&gt;&lt;A href="http://msdn.microsoft.com/en-us/data/bb931106.aspx"&gt;&lt;SPAN style="FONT-FAMILY: 'Verdana','sans-serif'; COLOR: blue; FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;ADO.NET Data Services&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="FONT-FAMILY: 'Verdana','sans-serif'; COLOR: #003300; FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt; team, where &lt;/SPAN&gt;&lt;A href="http://blogs.msdn.com/pablo/"&gt;&lt;SPAN style="FONT-FAMILY: 'Verdana','sans-serif'; COLOR: blue; FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Pablo Castro&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="FONT-FAMILY: 'Verdana','sans-serif'; COLOR: #003300; FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt; gave a few talks on potential ideas for the future of that same technology.&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 10pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: 'Verdana','sans-serif'; COLOR: #003300; FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;At nVentive, we have long used a &lt;/SPAN&gt;&lt;A href="http://en.wikipedia.org/wiki/Domain-driven_design"&gt;&lt;SPAN style="FONT-FAMILY: 'Verdana','sans-serif'; COLOR: blue; FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Domain-Driven Design&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="FONT-FAMILY: 'Verdana','sans-serif'; COLOR: #003300; FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt; approach to designing software. Our architectures used to rely on Entities, that would use &lt;/SPAN&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/ms978717.aspx"&gt;&lt;SPAN style="FONT-FAMILY: 'Verdana','sans-serif'; COLOR: blue; FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;DTO&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="FONT-FAMILY: 'Verdana','sans-serif'; COLOR: #003300; FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;s to transfer themselves to another tier. This leads to a few interesting challenges:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL type=disc&gt;
&lt;LI style="LINE-HEIGHT: normal; MARGIN: 0in 0in 10pt; COLOR: #003300; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list .5in" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: 'Verdana','sans-serif'; FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;Do you share the entities ? Do you share the actual DLL? &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;
&lt;LI style="LINE-HEIGHT: normal; MARGIN: 0in 0in 10pt; COLOR: #003300; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list .5in" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: 'Verdana','sans-serif'; FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;What if the application needs an application-model, not the entity-model? &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;
&lt;LI style="LINE-HEIGHT: normal; MARGIN: 0in 0in 10pt; COLOR: #003300; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list .5in" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: 'Verdana','sans-serif'; FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;How do you implement the Unit Of Work pattern ? deal with derived properties and business logic? &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;
&lt;LI style="LINE-HEIGHT: normal; MARGIN: 0in 0in 10pt; COLOR: #003300; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list .5in" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: 'Verdana','sans-serif'; FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;How do you make sure things always get revalidated on the server tier? &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;
&lt;LI style="LINE-HEIGHT: normal; MARGIN: 0in 0in 10pt; COLOR: #003300; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list .5in" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: 'Verdana','sans-serif'; FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;When should you be modifying properties, versus calling a specialized service? &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;
&lt;LI style="LINE-HEIGHT: normal; MARGIN: 0in 0in 10pt; COLOR: #003300; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list .5in" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: 'Verdana','sans-serif'; FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;and more...&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 10pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: 'Verdana','sans-serif'; COLOR: #003300; FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;Now we have started evaluating &lt;/SPAN&gt;&lt;A href="http://en.wikipedia.org/wiki/Command-query_separation"&gt;&lt;SPAN style="FONT-FAMILY: 'Verdana','sans-serif'; COLOR: blue; FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Command Query Seperated&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="FONT-FAMILY: 'Verdana','sans-serif'; COLOR: #003300; FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt; architectures, where data and commands are completly distinct.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 10pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: 'Verdana','sans-serif'; COLOR: #003300; FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;The current approach&amp;nbsp;is to expose the read-only data&amp;nbsp;through REST (using ADO.NET Data Services). This approach is easy to use, and best of all, allows the querying of data through LINQ, which is then serialized into the URL (i.e. &lt;/SPAN&gt;&lt;A href="http://employeesystem/Employees/$Where=firstname-eq-bob"&gt;&lt;SPAN style="FONT-FAMILY: 'Verdana','sans-serif'; COLOR: blue; FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;http://employeeSystem/Employees/$Where=firstname-eq-bob&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="FONT-FAMILY: 'Verdana','sans-serif'; COLOR: #003300; FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;).&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 10pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: 'Verdana','sans-serif'; COLOR: #003300; FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;The&amp;nbsp;current idea for the command part is to expose a second endpoint through REST (using ADO.NET Data Services) to expose the structure of the different commands. We would then use the REST syntax to create commands, edit them, and retrieve them. A runner would then execute the commands and they are queued up, altering the data.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 10pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: 'Verdana','sans-serif'; COLOR: #003300; FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;In the coming months we will be prototyping these ideas into &lt;/SPAN&gt;&lt;A href="http://www.codeplex.com/umbrella"&gt;&lt;SPAN style="FONT-FAMILY: 'Verdana','sans-serif'; COLOR: blue; FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Umbrella&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="FONT-FAMILY: 'Verdana','sans-serif'; COLOR: #003300; FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;, so keep on reading and if you have any thoughts, just let us know !&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0in 0in 10pt" class=MsoNormal&gt;&lt;o:p&gt;&lt;FONT color=#000000 size=3 face=Calibri&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;img width="0" height="0" src="http://www.nventive.net/Blog2/aggbug.ashx?id=2403822d-a9be-4345-be49-53d25eb2209c"/&gt;&lt;/div&gt;</description>
      <comments>http://www.nventive.net/Blog2/CommentView,guid,2403822d-a9be-4345-be49-53d25eb2209c.aspx</comments>
      <category>Architecture</category>
      <category>.net - ADO.NET Data Services</category>
    </item>
    <item>
      <trackback:ping>http://www.nventive.net/Blog2/Trackback.aspx?guid=8efb2ca4-34e8-4f89-9e8a-5a941b91fa83</trackback:ping>
      <pingback:server>http://www.nventive.net/Blog2/pingback.aspx</pingback:server>
      <pingback:target>http://www.nventive.net/Blog2/PermaLink,guid,8efb2ca4-34e8-4f89-9e8a-5a941b91fa83.aspx</pingback:target>
      <dc:creator>nVentive Coach Factor</dc:creator>
      <wfw:comment>http://www.nventive.net/Blog2/CommentView,guid,8efb2ca4-34e8-4f89-9e8a-5a941b91fa83.aspx</wfw:comment>
      <wfw:commentRss>http://www.nventive.net/Blog2/SyndicationService.asmx/GetEntryCommentsRss?guid=8efb2ca4-34e8-4f89-9e8a-5a941b91fa83</wfw:commentRss>
      <title>Composite Application Block for WPF 2 Just Released</title>
      <guid isPermaLink="false">http://www.nventive.net/Blog2/PermaLink,guid,8efb2ca4-34e8-4f89-9e8a-5a941b91fa83.aspx</guid>
      <link>http://www.nVentive.net/Blog2/2009/02/19/CompositeApplicationBlockForWPF2JustReleased.aspx</link>
      <pubDate>Thu, 19 Feb 2009 02:33:48 GMT</pubDate>
      <description>&lt;div&gt;&lt;P&gt;As you know, nVentive is a strong promoter of Microsoft's WPF technology for building line of business applications. We have also developped a WPF center of excellence for developping these applications in an architecturally sound way.&lt;/P&gt;
&lt;P&gt;With version 2 of "Prism" out, we can finally start to reuse our assets in both WPF and Silverlight. That means that we can develop modules, that will be "mostly" reusable across both platforms, from a similar codebase.&lt;/P&gt;
&lt;P&gt;Read the good news directly from &lt;A href="http://blogs.msdn.com/erwinvandervalk/archive/2009/02/18/just-released-composite-application-guidance-for-wpf-and-silverlight-february-2008.aspx"&gt;Erwin's blog&lt;/A&gt; and we hope to bring you more blogs soon on this great new PnP guidance package.&lt;/P&gt;&lt;img width="0" height="0" src="http://www.nventive.net/Blog2/aggbug.ashx?id=8efb2ca4-34e8-4f89-9e8a-5a941b91fa83"/&gt;&lt;/div&gt;</description>
      <comments>http://www.nventive.net/Blog2/CommentView,guid,8efb2ca4-34e8-4f89-9e8a-5a941b91fa83.aspx</comments>
      <category>.net - Microsoft PnP</category>
      <category>.net - WPF</category>
      <category>.net - Silverlight</category>
    </item>
    <item>
      <trackback:ping>http://www.nventive.net/Blog2/Trackback.aspx?guid=1399789d-d73b-44b3-ae6e-5e5f398dd189</trackback:ping>
      <pingback:server>http://www.nventive.net/Blog2/pingback.aspx</pingback:server>
      <pingback:target>http://www.nventive.net/Blog2/PermaLink,guid,1399789d-d73b-44b3-ae6e-5e5f398dd189.aspx</pingback:target>
      <dc:creator>nVentive Coach Factor</dc:creator>
      <wfw:comment>http://www.nventive.net/Blog2/CommentView,guid,1399789d-d73b-44b3-ae6e-5e5f398dd189.aspx</wfw:comment>
      <wfw:commentRss>http://www.nventive.net/Blog2/SyndicationService.asmx/GetEntryCommentsRss?guid=1399789d-d73b-44b3-ae6e-5e5f398dd189</wfw:commentRss>
      <title>Microsoft Ignite IT Awards</title>
      <guid isPermaLink="false">http://www.nventive.net/Blog2/PermaLink,guid,1399789d-d73b-44b3-ae6e-5e5f398dd189.aspx</guid>
      <link>http://www.nVentive.net/Blog2/2009/02/17/MicrosoftIgniteITAwards.aspx</link>
      <pubDate>Tue, 17 Feb 2009 22:23:40 GMT</pubDate>
      <description>&lt;div&gt;&lt;P&gt;Microsoft Ignite IT Awards are back and this year, we've submitted Umbrella. Jump in at &lt;SPAN style="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 12pt; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;&lt;A href="http://www.microsoft.ca/igniteit-awards/view_submissiondetails.aspx?ID=320"&gt;www.microsoft.ca/igniteit-awards/view_submissiondetails.aspx?ID=320&lt;/A&gt;&amp;nbsp;at start voting for your favorite CodePlex project&amp;nbsp;after March 1st !&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 12pt; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;&lt;img width="0" height="0" src="http://www.nventive.net/Blog2/aggbug.ashx?id=1399789d-d73b-44b3-ae6e-5e5f398dd189"/&gt;&lt;/div&gt;</description>
      <comments>http://www.nventive.net/Blog2/CommentView,guid,1399789d-d73b-44b3-ae6e-5e5f398dd189.aspx</comments>
      <category>Announcement</category>
    </item>
  </channel>
</rss>