<?xml version="1.0"?>
<rss version="2.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:yt="http://gdata.youtube.com/schemas/2007" xmlns:atom="http://www.w3.org/2005/Atom">
   <channel>
      <title>A bord de Salamanca</title>
      <description>Pipes Output</description>
      <link>http://pipes.yahoo.com/pipes/pipe.info?_id=Vo8GO7xV3hG5N6xPP27D0g</link>
      <atom:link rel="next" href="http://pipes.yahoo.com/pipes/pipe.run?_id=Vo8GO7xV3hG5N6xPP27D0g&amp;_render=rss&amp;page=2"/>
      <pubDate>Thu, 01 Oct 2015 22:29:02 +0000</pubDate>
      <generator>http://pipes.yahoo.com/pipes/</generator>
      <item>
         <title>Alpha 2 : les énumérations</title>
         <link>http://salamanca.nourysolutions.com/bord/index.php?post/2009/08/31/Alpha-2-%3A-les-eacute%3Bnumeacute%3Brations</link>
         <description>&lt;p&gt;La &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/road/index.php?post/2009/07/16/Salamanca-1.0.1-%28alpha-2%29-is-released&quot;&gt;sortie de la version alpha 2 de Salamanca&lt;/a&gt; nous a donné l'occasion de sortir notre équipement pour révision en cale sèche...&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; title=&quot;Flickr Commons, USS Ohio Submarine on maintenance, By Mateus&quot; target=&quot;_blank&quot; href=&quot;http://www.flickr.com/photos/mateus27_24-25/2246125390/&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2180/2246125390_19b4a1449e.jpg&quot; border=&quot;0&quot; height=&quot;228&quot; width=&quot;350&quot;/&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h2&gt;Spécification du cycle de vie d'un projet&lt;/h2&gt;
&lt;p&gt;La principale amélioration apportée par Salamanca alpha 2 étant le support des énumérations dans le modèle entité, nous en avons profité pour revoir et implémenter le cycle de vie d'un projet suivant :&lt;/p&gt;
&lt;p&gt;&lt;img style=&quot;border-width:0;&quot; alt=&quot;Projet_LifeCycle&quot; src=&quot;http://salamanca.nourysolutions.com/bord/public/WindowsLiveWriter/Misejouralpha2_A257/Projet_LifeCycle.png&quot; border=&quot;0&quot; height=&quot;476&quot; width=&quot;200&quot;/&gt;&amp;nbsp; &lt;/p&gt;
&lt;p&gt;Chaque changement de statut est de la responsabilité d'un des interlocuteurs que nous avons déjà spécifié lors de la &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/bord/index.php?post/2009/07/10/Escale-1-%3A-Entiteacute%3Bs-meacute%3Btier&quot;&gt;modélisation de nos entités&lt;/a&gt; :&lt;/p&gt;
&lt;ul&gt;   &lt;li&gt;Un client soumet un projet &lt;/li&gt;
&lt;li&gt;Un commercial prend en charge ou annule un projet soumis &lt;/li&gt;
&lt;li&gt;Le client détaille le besoin de son projet pris en charge &lt;/li&gt;
&lt;li&gt;Un consultant prototype un périmètre délimité du besoin &lt;/li&gt;
&lt;li&gt;Le client clôture le projet après livraison du prototype &lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Modélisation avec énumération&lt;/h2&gt;
&lt;p&gt;Pour modéliser le cycle de vie d'un projet, nous avons ajouté l'énumération &lt;code&gt;StatutProjet&lt;/code&gt; dans notre modèle entité et défini chaque statut du cycle en tant que valeur, avec comme type sous-jacent une chaîne de 5 caractères. Nous avons alors ajouté l'attribut &lt;code&gt;Statut&lt;/code&gt; à l'entité &lt;code&gt;Projet&lt;/code&gt; et défini son type comme &lt;code&gt;StatutProjet&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img style=&quot;border-width:0;&quot; alt=&quot;VS_Model_StatutProjet&quot; src=&quot;http://salamanca.nourysolutions.com/bord/public/WindowsLiveWriter/Misejouralpha2_A257/VS_Model_StatutProjet.png&quot; border=&quot;0&quot; height=&quot;231&quot; width=&quot;330&quot;/&gt; &lt;/p&gt;
&lt;p&gt;Pour chaque valeur d'énumération, nous associons à travers le champ Description de ses propriétés la chaîne de caractères &quot;en français&quot; : Soumis, Pris en charge, Détaillée, Prototypé, Clôturé, Annulé.&lt;/p&gt;
&lt;p&gt;On retrouve alors dans le code SQL généré l'insertion de ces valeurs en base :&lt;/p&gt;
&lt;pre class=&quot;SQL&quot;&gt;INSERT INTO StatutProjet VALUES('SOUMI', 'Soumis');&lt;br /&gt;INSERT INTO StatutProjet VALUES('ENCHA', 'Pris en charge');  &lt;br /&gt;INSERT INTO StatutProjet VALUES('DETAI', 'Détaillé');&lt;br /&gt;INSERT INTO StatutProjet VALUES('PROTO', 'Prototypé');  &lt;br /&gt;INSERT INTO StatutProjet VALUES('CLOTR', 'Clôturé');&lt;br /&gt;INSERT INTO StatutProjet VALUES('ANNUL', 'Annulé');&lt;/pre&gt;
&lt;h2&gt;Implémentation de l'écran liste des projets&lt;/h2&gt;
&lt;p&gt;Afin d'avoir une vue d'ensemble des projets client, un commercial doit pouvoir visualiser la liste des projets et leur statut dés la page d'accueil de son espace.&lt;/p&gt;
&lt;p&gt;Nous ajoutons donc dans le projet &lt;code&gt;Eproject.Web&lt;/code&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;un répertoire &lt;code&gt;Espace&lt;/code&gt; qui regroupe les écrans accessibles après ouverture de session &lt;/li&gt;
&lt;li&gt;une page d'accueil &lt;code&gt;Default.aspx&lt;/code&gt; qui affiche une vue d'ensemble selon le rôle utilisateur &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dans la page d'accueil, nous implémentons la liste des projets à travers :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;un contrôle ASP.NET &lt;code&gt;GridView&lt;/code&gt;affichant les projets sous forme de tableau &lt;/li&gt;
&lt;li&gt;un contrôle ASP.NET &lt;code&gt;SqlDataSource&lt;/code&gt; récupérant les informations directement avec une requête SQL vers la base de données &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour accéder à la base de données, nous configurons une chaîne de connexion avec l'utilitaire Enterprise Library Configuration de la même façon que pour &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/bord/index.php?post/2009/08/06/Escale-3-%3A-Tests-unitaires&quot;&gt;notre projet de tests unitaires&lt;/a&gt;. Le résultat placé dans le fichier web.config du projet web est le suivant :&lt;/p&gt;
&lt;pre class=&quot;XML&quot;&gt;&amp;lt;dataConfiguration defaultDatabase=&quot;eProject_ABord&quot; /&amp;gt;&lt;br /&gt;&amp;lt;connectionStrings&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;add name=&quot;eProject_ABord&quot; connectionString=&quot;Data Source=.&amp;#92;SQLEXPRESS;Initial Catalog=eProject_ABord;Integrated Security=True&quot; providerName=&quot;System.Data.SqlClient&quot; /&amp;gt;&lt;br /&gt;&amp;lt;/connectionStrings&amp;gt; &lt;/pre&gt;
&lt;p&gt;Pour alimenter la liste, nous ajoutons des données de test dans la base eProject_ABord avec le script SQL :&lt;/p&gt;
&lt;pre class=&quot;SQL&quot;&gt;Declare @client_id uniqueidentifier=newid();&lt;br /&gt;&lt;br /&gt;INSERT INTO Interlocuteurs (Id, Nom, Email) VALUES (@client_id, 'Client test', 'client@test.com');  &lt;br /&gt;INSERT INTO Clients (Id, Societe) VALUES (@client_id, 'Société test');&lt;br /&gt;&lt;br /&gt;INSERT INTO Projets (Client_Id, Nom, Statut_Code) VALUES (@client_id, 'Application DA VINCI', 'SOUMI');  &lt;br /&gt;INSERT INTO Projets (Client_Id, Nom, Statut_Code) VALUES (@client_id, 'Gestion de stocks', 'SOUMI');&lt;br /&gt;INSERT INTO Projets (Client_Id, Nom, Statut_Code) VALUES (@client_id, 'Projet SIGMAT', 'ENCHA');  &lt;br /&gt;INSERT INTO Projets (Client_Id, Nom, Statut_Code) VALUES (@client_id, 'Plateforme YaKa', 'DETAI');&lt;br /&gt;INSERT INTO Projets (Client_Id, Nom, Statut_Code) VALUES (@client_id, 'Fiche PATROL', 'PROTO');  &lt;br /&gt;INSERT INTO Projets (Client_Id, Nom, Statut_Code) VALUES (@client_id, 'MOBILAT', 'CLOTR');&lt;br /&gt;INSERT INTO Projets (Client_Id, Nom, Statut_Code) VALUES (@client_id, 'Projet SPAMMER', 'ANNUL');&lt;/pre&gt;
&lt;p&gt;Dans un fichier de ressource nommé &lt;code&gt;Sql.resx&lt;/code&gt; ajouté au dossier ASP.NET &lt;code&gt;App_GlobalResources&lt;/code&gt;, nous définissons la requête SQL &lt;code&gt;ProjectSelectList&lt;/code&gt; :&lt;/p&gt;
&lt;pre class=&quot;SQL&quot;&gt;SELECT p.Id, p.Client_Id, p.Nom, c.Societe, sp.Description&lt;br /&gt;FROM Projets p, Clients c, StatutProjet sp  &lt;br /&gt;WHERE&amp;nbsp; p.Client_Id=c.Id AND p.Statut_Code=sp.Code&lt;/pre&gt;
&lt;p&gt;Dans la page web, nous ajoutons le code ASP.NET ci-dessous pour afficher la liste issue de la requête :&lt;/p&gt;
&lt;pre class=&quot;XML&quot;&gt;&amp;lt;asp:SqlDataSource ID=&quot;ProjetSqlDataSource&quot; runat=&quot;server&quot; &lt;br /&gt;ConnectionString=&quot;&amp;lt;%$ ConnectionStrings:eProject_ABord %&amp;gt;&quot; ProviderName=&quot;&amp;lt;%$ConnectionStrings:eProject_ABord.ProviderName %&amp;gt;&quot; &lt;br /&gt;SelectCommand=&quot;&amp;lt;%$ Resources:Sql, ProjetSelectList %&amp;gt;&quot;&amp;gt;&lt;br /&gt;&amp;lt;/asp:SqlDataSource&amp;gt;  &lt;br /&gt;&amp;lt;asp:GridView ID=&quot;ProjetGridView&quot; runat=&quot;server&quot; DataSourceID=&quot;ProjetSqlDataSource&quot; DataKeyNames=&quot;ID&quot; Width=&quot;400px&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Columns&amp;gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:BoundField DataField=&quot;Id&quot; HeaderText=&quot;Id&quot; ReadOnly=&quot;True&quot; SortExpression=&quot;ID&quot; Visible=&quot;False&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:BoundField DataField=&quot;Nom&quot; HeaderText=&quot;&amp;lt;%$ Resources:SR, ProjetNomLabel %&amp;gt;&quot; /&amp;gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:BoundField DataField=&quot;Societe&quot; HeaderText=&quot;&amp;lt;%$ Resources:SR, ClientSocieteLabel %&amp;gt;&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:BoundField DataField=&quot;Description&quot; HeaderText=&quot;&amp;lt;%$ Resources:SR, ProjetStatutLabel %&amp;gt;&quot; /&amp;gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Columns&amp;gt;&lt;br /&gt;&amp;lt;/asp:GridView&amp;gt; &lt;/pre&gt;
&lt;p&gt;Pour obtenir un &quot;look &amp;amp; feel&quot; homogène dans notre application, nous avons ajouté :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;la page maître &lt;code&gt;Site.Master&lt;/code&gt; liée à une feuille de style CSS placée dans le thème Default du répertoire ASP.NET &lt;code&gt;App_Themes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;un fichier d'apparence grid.skin également placé dans le thème Default définissant le style par défaut d'un contrôle GridView&lt;/li&gt;
&lt;li&gt;l'option styleSheetTheme=&quot;Default&quot; à la directive pages du fichier &lt;code&gt;web.config&lt;/code&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La page &lt;code&gt;Default.aspx&lt;/code&gt; est transformée en formulaire de contenu web en ajoutant :&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;la directive &lt;code&gt;MasterPageFile=&quot;~/Site.master&quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;le code ASP.NET dans un contrôle &lt;code&gt;Content&lt;/code&gt; associé à la région pour le contenu (&lt;code&gt;ContentPlaceHolder&lt;/code&gt;) définie dans la page maître&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt; Nous obtenons ainsi la liste des projets avec leur client et leur statut associés sous la forme suivante :&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img style=&quot;border-width:0;&quot; alt=&quot;Ecran Liste des projets client&quot; src=&quot;http://salamanca.nourysolutions.com/bord/public/WindowsLiveWriter/Misejouralpha2_A257/ASPNET_ProjetSelectList.png&quot; border=&quot;0&quot; height=&quot;245&quot; width=&quot;415&quot;/&gt; &lt;/p&gt;
&lt;h2&gt;Mise à jour des références Salamanca&lt;/h2&gt;
&lt;p&gt;Le refactoring des bibliothèques réalisé dans la mise à jour alpha 2 de Salamanca nous a permis lors de cette révision de réduire le nombre de références dans notre projet.&lt;/p&gt;
&lt;p&gt;Par exemple, dans le projet &lt;code&gt;Eproject.Model&lt;/code&gt;, nous avions les 4 références suivantes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Salamanca.Common&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;&lt;code&gt;Salamanca.DataAccess&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;&lt;code&gt;Salamanca.DataAccess.EnterpriseLibrary&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;&lt;code&gt;Salamanca.DataRules&lt;/code&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nous n'avons maintenant plus que 2 références :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Salamanca&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;&lt;code&gt;Salamanca.EnterpriseLibrary.4&lt;/code&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ce passage en &quot;révision&quot; de notre &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/bord/index.php?post/2009/06/22/Pr%C3%A9paration&quot;&gt;équipée&lt;/a&gt; nous a donc permis d'enrichir notre modèle graphique des entités avec la description du cycle de vie d'un projet ainsi que que de l'illustrer simplement à travers l'implémentation d'un écran web accédant directement à la base de données.&lt;/p&gt;
&lt;p&gt;Il est bientôt temps de repartir à l'aventure pour mettre en oeuvre des interactions entre l'application et l'utilisateur à travers des activités métier...&lt;/p&gt;</description>
         <author>Pierre Mavraganis</author>
         <guid isPermaLink="false">urn:md5:1f8c06af628b364adca106a54dee5bec</guid>
         <pubDate>Mon, 31 Aug 2009 14:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Contrôle des papiers...</title>
         <link>http://salamanca.nourysolutions.com/bord/index.php?post/2009/08/19/Controcirc%3Ble-des-papiers...</link>
         <description>&lt;p&gt;En quittant notre &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/bord/index.php?post/2009/08/06/Escale-3-%3A-Tests-unitaires&quot;&gt;dernière escale&lt;/a&gt;, nos hôtes nous ont demander de présenter des informations validées sur notre &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/bord/index.php?post/2009/06/22/Pr%C3%A9paration&quot;&gt;équipée&lt;/a&gt;. Heureusement, nous avons dans Salamanca une bibliothèque qui permet de vérifier aisément la saisie de données : &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/road/index.php?post/2008/08/26/Inside-the-libraries-I-%3A-Data-Rules&quot;&gt;Data Rules&lt;/a&gt; !&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.flickr.com/photos/septuagesima/364638765/&quot; title=&quot;London Port Authority, Septuagesima, Flickr&quot;&gt;&lt;img src=&quot;http://farm1.static.flickr.com/177/364638765_29e8fa4081_m.jpg&quot; border=&quot;0&quot;/&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Pour rendre un système d'information utile et efficace, il ne suffit pas de l'alimenter en données, il faut aussi en assurer la cohérence.&lt;/p&gt;
&lt;p&gt;La première exigence qui en découle est de valider les informations fournies si possible dés leur saisie et avant leur sauvegarde dans la base de données.&lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;Salamanca Entity Properties&quot; alt=&quot;&quot; src=&quot;http://salamanca.nourysolutions.com/bord/public/WindowsLiveWriter/ControleDesPapiers/VS_Entity_Properties.png&quot; align=&quot;right&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Dans le &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/bord/index.php?post/2009/07/10/Escale-1-%3A-Entiteacute%3Bs-meacute%3Btier&quot;&gt;modèle entité&lt;/a&gt; dessiné avec Salamanca, on peut associer à chaque attribut des règles de validation prédéfinies en fonction de spécifications métier telles que :&lt;/p&gt;
&lt;ul&gt;   &lt;li&gt;valeur par défaut ; par exemple, le statut du projet est &quot;Nouveau&quot; par défaut &lt;/li&gt;
&lt;li&gt;autorisation de la valeur null ; par exemple, un projet doit avoir un nom &lt;/li&gt;
&lt;li&gt;longueur maximum ; par exemple, le nom du projet ne dépasse pas 32 caractères &lt;/li&gt;
&lt;/ul&gt;
Ces propriétés sur les attributs d'une entité constituent le premier niveau de règles métier. Elles sont implémentées non seulement dans la base de données sous forme de contraintes, mais aussi dans la couche objet sous forme d'attributs (au sens .NET) liés aux propriétés de l'objet. Par exemple :   &lt;pre&gt;[NotNullRule]&lt;br /&gt;[StringLengthRule(32)]&lt;br /&gt;public string Nom&lt;br /&gt;{&lt;br /&gt;...&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;Profitons d'avoir &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/bord/index.php?post/2009/08/06/Escale-3-%3A-Tests-unitaires&quot;&gt;configuré notre projet de tests&lt;/a&gt; pour valider que ces règles métier sont vérifiées lors de la sauvegarde d'un projet.&lt;/p&gt;
&lt;p&gt;Pour faciliter l'exécution de notre série de tests, nous initialisons chacun avec des données valides pour une instance de Projet défini pour la classe de test :&lt;/p&gt;
&lt;pre&gt;[TestInitialize()]&lt;br /&gt;public void MyTestInitialize()&lt;br /&gt;{&lt;br /&gt; Client c = new Client(DataMappers); &lt;br /&gt; c.Nom = &quot;Jean Dupond&quot;;&lt;br /&gt; Projet = new Projet(c, DataMappers);&lt;br /&gt; Projet.Nom = &quot;Mon projet&quot;;&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;Pour tester que le nom saisi dépasse la longueur maximale, nous ajoutons un test avec &quot;un nom de projet vraiment trop long&quot; et nous vérifions que&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;la méthode &lt;code&gt;Validate(string propertyName)&lt;/code&gt; d'un objet &lt;code&gt;DomainEntity&lt;/code&gt; renvoit FAUX &lt;/li&gt;
&lt;li&gt;qu'une &lt;code&gt;BrokenRulesException&lt;/code&gt; est levée lorsqu'on sauvegarde une instance non valide &lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;[TestMethod]&lt;br /&gt;[ExpectedException(typeof(BrokenRulesException))]&lt;br /&gt;public void CannotValidateNomNull()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Assert.IsTrue(Projet.Validate());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Projet.Nom = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Assert.IsFalse(Projet.Validate(&quot;Nom&quot;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Projet.Save();&lt;br /&gt;} &lt;/pre&gt;
&lt;p&gt;Le code complet de notre classe se résume à la validation d'une série de 3 tests :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On doit pouvoir sauvegardé une instance de Projet avec un nom valide &lt;/li&gt;
&lt;li&gt;On ne doit pas pouvoir sauvegardé une instance de Projet avec un nom vide (NULL) &lt;/li&gt;
&lt;li&gt;On ne doit pas pouvoir sauvegardé une instance de Projet avec un nom trop long (&amp;gt; 32 caractères) &lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;using Microsoft.VisualStudio.TestTools.UnitTesting;&lt;br /&gt;using Salamanca.DataRules;&lt;br /&gt;using NourY.Eproject.Model;&lt;br /&gt;&lt;br /&gt;namespace NourY.Eproject.Tests.Model&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [TestClass]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class ProjetTest : UnitTestBase, IProjetContainer&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [TestMethod]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DeploymentItem(&quot;..&amp;#92;&amp;#92;eProject_ABord_Tests.mdf&quot;)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void CanSaveAndValidateProjet()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Assert.IsTrue(Projet.Validate());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Projet.Save();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [TestMethod]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ExpectedException(typeof(BrokenRulesException))]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void CannotValidateNomNull()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Assert.IsTrue(Projet.Validate());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Projet.Nom = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Assert.IsFalse(Projet.Validate(&quot;Nom&quot;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Projet.Save();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [TestMethod]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ExpectedException(typeof(BrokenRulesException))]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void CannotValidateNomTooLong()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Assert.IsTrue(Projet.Validate());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Projet.Nom = &quot;Un nom de projet vraiment trop long&quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Assert.IsFalse(Projet.Validate(&quot;Nom&quot;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Projet.Save();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [TestInitialize()]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void MyTestInitialize()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Client c = new Client(DataMappers);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c.Nom = &quot;Jean Dupond&quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Projet = new Projet(c, DataMappers);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Projet.Nom = &quot;Mon projet&quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Projet Projet&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _Projet; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set { _Projet = value; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private Projet _Projet;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;Les règles de validation sur les attributs des entités s'avère donc non seulement aisées à mettre en place mais également implémentées de manière concise dans la couche objet. Pour valider des champs avec des règles avancées tels qu'une adresse email, un numéro de téléphone ou un code postal, nous pouvons exploité la puissance des &lt;a rel=&quot;nofollow&quot; hreflang=&quot;en&quot; target=&quot;_blank&quot; href=&quot;http://en.wikipedia.org/wiki/Regular_expression&quot;&gt;expressions régulières&lt;/a&gt; à travers des règles de type &lt;code&gt;RegexRule&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Cette exploration &quot;forcée&quot; de la bibliothèque DataRule entre deux escales nous ouvre déjà un horizon bien dégagé du côté de la consolidation des données de nos applications métier. A suivre avec leur utilisation dans le cadre d'activités métier...&lt;/p&gt;</description>
         <author>Pierre Mavraganis</author>
         <guid isPermaLink="false">urn:md5:d9258bfab5b8056fc9a9a466a6665444</guid>
         <pubDate>Wed, 19 Aug 2009 14:01:00 +0000</pubDate>
      </item>
      <item>
         <title>Escale #3 : Tests unitaires</title>
         <link>http://salamanca.nourysolutions.com/bord/index.php?post/2009/08/06/Escale-3-%3A-Tests-unitaires</link>
         <description>&lt;p&gt;Nous avons maintenant une &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/bord/index.php?post/2009/07/31/Escale-2-%3A-Base-de-donneacute%3Bes&quot;&gt;base de données à notre disposition&lt;/a&gt;. Mais ne perdons pas de vue le but de notre &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/bord/index.php?post/2009/06/22/Pr%C3%A9paration&quot;&gt;expédition&lt;/a&gt;, ou plutôt l'enchainement de buts : apprendre à utiliser Salamanca afin, &lt;em&gt;in fine&lt;/em&gt;, de mettre en place un processus métier qui produit de la valeur.&lt;/p&gt;
&lt;p&gt;&lt;img style=&quot;margin:0 15px 0 0;&quot; src=&quot;http://farm1.static.flickr.com/38/76983561_36a94daf8d_m.jpg&quot; align=&quot;left&quot;/&gt; &lt;/p&gt;
&lt;p&gt;Mais comme dans la fable du lièvre et de la tortue, nous prenons le temps de mettre en place des bonnes pratiques de développement en cours de route afin d'assurer à la fois la qualité de notre produit et la facilité de sa maintenance. &lt;/p&gt;
&lt;p&gt;L'escale d'aujourd'hui s'attarde sur la mise en place des outils de contrôle de la qualité : les Tests.&lt;/p&gt;
&lt;h2&gt;Contexte&lt;/h2&gt;
&lt;p&gt;Même si nous parlons de tests unitaires, notre intention est plutôt de s'assurer que le code produit est conforme au résultat attendu, par exemple que les règles métier définies sont bien respectées. Dans la terminologie du &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://fr.wikipedia.org/wiki/Test_%28informatique%29#Classification_des_tests&quot;&gt;test informatique&lt;/a&gt;, on parle alors de tests fonctionnels (de recette ou encore d'acceptation) par opposition aux tests techniques (unitaires, d'intégration, système, performance, ...).&lt;/p&gt;
&lt;p&gt;Mais dans notre cas, nous nous appuyons sur le &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://msdn.microsoft.com/fr-fr/library/ms243147.aspx&quot;&gt;framework de test de Visual Studio&lt;/a&gt;. C'est pourquoi nous avons créé le projet &lt;em&gt;Eproject.Tests&lt;/em&gt; lors de la mise en place de la solution (cf &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/bord/index.php?post/2009/06/29/Larguez-les-amarres-%21&quot;&gt;L'application Salamanca&lt;/a&gt;).&lt;/p&gt;
&lt;h2&gt;Configuration&lt;/h2&gt;
&lt;p&gt;Comme l'objet de notre application est de manipuler des données, nous avons besoin d'une base de données dédiée pour les tests qui puisse être recréée à chaque exécution d'un jeu de tests. Pour cela, nous procédons de la même manière que pour la &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/bord/index.php?post/2009/07/31/Escale-2-%3A-Base-de-donneacute%3Bes&quot;&gt;base de données de développement&lt;/a&gt;, avec une étape supplémentaire :&lt;/p&gt;
&lt;ul&gt;   &lt;li&gt;création d'une base de données SQL Server 2008 Express &lt;/li&gt;
&lt;li&gt;copie du fichier de base de données dans le projet de tests &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cette procédure peut se traduire sous forme de la commande batch &lt;em&gt;CreateTests.cmd&lt;/em&gt;, placée dans le répertoire &lt;em&gt;Create Scripts&lt;/em&gt; du projet &lt;em&gt;Eproject.Sql&lt;/em&gt; :&lt;/p&gt;
&lt;pre&gt;SET CONNECT_STRING=.&amp;#92;SQLEXPRESS &lt;br /&gt;SET BASE_NAME=eProject_ABord_Tests &lt;br /&gt;SET TestsDir=%CD%&amp;#92;..&amp;#92;..&amp;#92;Eproject.Tests&lt;br /&gt;&lt;br /&gt;sqlcmd.exe -E -X -S %CONNECT_STRING% -v DatabaseName=%BASE_NAME% -i Create.sql&lt;br /&gt;&lt;br /&gt;xcopy &quot;C:&amp;#92;Program Files&amp;#92;Microsoft SQL Server&amp;#92;MSSQL10.SQLEXPRESS&amp;#92;MSSQL&amp;#92;DATA&amp;#92;%BASE_NAME%.mdf&quot; %TestsDir% /y &lt;br /&gt;xcopy &quot;C:&amp;#92;Program Files&amp;#92;Microsoft SQL Server&amp;#92;MSSQL10.SQLEXPRESS&amp;#92;MSSQL&amp;#92;DATA&amp;#92;%BASE_NAME%_log.ldf&quot; %TestsDir% /y&lt;/pre&gt;
&lt;p&gt;Une fois le fichier de base de données copié, nous l'ajoutons dans notre projet (&quot;Afficher tous les fichiers&quot;, clic droit sur le fichier, puis &quot;Inclure dans le projet&quot;). &lt;/p&gt;
&lt;p&gt;La configuration de sa chaîne de connexion est facilité par l'utilisation du &lt;em&gt;Data Application Block&lt;/em&gt; du framework &lt;em&gt;Microsoft Enterprise Library&lt;/em&gt; (cf &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/bord/index.php?post/2009/06/29/Larguez-les-amarres-%21&quot;&gt;Pré-requis&lt;/a&gt;). Pour cela, nous utilisons :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;un fichier de configuration &lt;em&gt;app.config&lt;/em&gt; ajouté dans notre projet &lt;/li&gt;
&lt;li&gt;l'utilitaire &lt;em&gt;Enterprise Library Configuration &lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/bord/public/WindowsLiveWriter/Escale3Testsunitaires_9289/VS_Tests_ConnectionString.png&quot;&gt;&lt;img style=&quot;border-width:0;&quot; alt=&quot;Enterprise Library Configuration&quot; src=&quot;http://salamanca.nourysolutions.com/bord/public/WindowsLiveWriter/Escale3Testsunitaires_9289/VS_Tests_ConnectionString_thumbnail.png&quot; border=&quot;0&quot; width=&quot;500&quot; height=&quot;238&quot;/&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;On obtient ainsi le code de configuration suivant :&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&amp;lt;configuration&amp;gt; &lt;br /&gt;&amp;nbsp; &amp;lt;configSections&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;section name=&quot;dataConfiguration&quot; type=&quot;Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35&quot; /&amp;gt; &lt;br /&gt;&amp;nbsp; &amp;lt;/configSections&amp;gt; &lt;br /&gt;&amp;nbsp; &amp;lt;dataConfiguration defaultDatabase=&quot;eProject_ABord_Tests&quot; /&amp;gt; &lt;br /&gt;&amp;nbsp; &amp;lt;connectionStrings&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add name=&quot;eProject_ABord_Tests&quot; connectionString=&quot;data source=.&amp;#92;SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|eProject_ABord_Tests.mdf;User Instance=true&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; providerName=&quot;System.Data.SqlClient&quot; /&amp;gt; &lt;br /&gt;&amp;nbsp; &amp;lt;/connectionStrings&amp;gt; &lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;/pre&gt;
&lt;h2&gt;Codage&lt;/h2&gt;
&lt;p&gt;Pour pouvoir coder des tests qui manipulent des instances des entités métier que nous avons modélisé, nous aurons besoin d'une collection de &lt;code&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://martinfowler.com/eaaCatalog/dataMapper.html&quot;&gt;DataMapper&lt;/a&gt;&lt;/code&gt;, dont le rôle (tel que je l'ai assimilé) est de servir de point d'ancrage de la couche de persistence, à savoir la gestion du cache et des échanges entre les instances d'objets en mémoire et leur structure de stockage en base de données (cf &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/road/index.php?post/2008/09/23/QuickStart-%3A-the-Domain-Model&quot;&gt;QuickStart : the Domain Model&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;L'implémentation choisie est d'avoir une classe de base dont tous les tests hériterons. C'est une classe publique contenant une propriété de type &lt;code&gt;DataMapperCollection&lt;/code&gt; avec un getter sous forme de singleton tirant parti des facilités offertes par les bibliothèques &lt;em&gt;Enterprise Library&lt;/em&gt; et &lt;em&gt;DataAccess&lt;/em&gt; pour créer une connexion avec la base de données (configurée par défaut dans app.config) ainsi qu'un mode de cache des données (dans notre cas, elles ne seront pas conservées en mémoire).&lt;/p&gt;
&lt;pre&gt;using System;&lt;br /&gt;using Microsoft.VisualStudio.TestTools.UnitTesting;&lt;br /&gt;using Microsoft.Practices.EnterpriseLibrary.Data;&lt;br /&gt;using Salamanca.DataAccess;&lt;br /&gt;using Salamanca.DataAccess.Collections;&lt;br /&gt;using NourY.Eproject.Model.Mappers.EnterpriseLibrary;&lt;br /&gt;&lt;br /&gt;namespace NourY.Eproject.Tests&lt;br /&gt;{&lt;br /&gt;    public class UnitTestBase&lt;br /&gt;    {&lt;br /&gt;        public UnitTestBase()&lt;br /&gt;        {&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        protected DataMapperCollection DataMappers&lt;br /&gt;        {&lt;br /&gt;            get&lt;br /&gt;            {&lt;br /&gt;                if (_DataMappers == null)&lt;br /&gt;                    _DataMappers = Mappers.CreateDataMapperCollection(&lt;br /&gt;                        DatabaseFactory.CreateDatabase(), &lt;br /&gt;                        new NoCacheManager());&lt;br /&gt;                return _DataMappers;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private DataMapperCollection _DataMappers;&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;&lt;img style=&quot;border-width:0;&quot; alt=&quot;References&quot; src=&quot;http://salamanca.nourysolutions.com/bord/public/WindowsLiveWriter/Escale3Testsunitaires_9289/VS_Tests_References.png&quot; align=&quot;right&quot; border=&quot;0&quot; width=&quot;286&quot; height=&quot;222&quot;/&gt; &lt;/p&gt;
&lt;p&gt;Pour pouvoir compiler notre projet, nous avons ajouté les références aux bibliothèques contenant les types utilisés dans notre classe de base :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DatabaseFactory&lt;/code&gt; dans &lt;code&gt;EnterpriseLibrary.Data&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;&lt;code&gt;NoCacheManager&lt;/code&gt; et &lt;code&gt;DataMapperCollection&lt;/code&gt; dans &lt;code&gt;DataAccess&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;&lt;code&gt;Mappers&lt;/code&gt; dans &lt;code&gt;Eproject.Model&lt;/code&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Voici venu le temps de tester notre configuration à travers un exemple simple : je veux pouvoir sauvegarder le projet nommé &quot;Projet Test&quot; du client nommé &quot;Client Test&quot;.&lt;/p&gt;
&lt;p&gt;Nous ajoutons le test unitaire &lt;code&gt;CrudProjetTest&lt;/code&gt; qui hérite de la classe &lt;code&gt;UnitTestBase&lt;/code&gt;. Afin d'avoir une base de données &quot;propre&quot; à chaque exécution, nous l'associons à notre classe de test à travers l'attribut &lt;code&gt;DeploymentItem&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;    [TestClass]&lt;br /&gt;    [DeploymentItem(&quot;..&amp;#92;&amp;#92;eProject_ABord_Tests.mdf&quot;)]&lt;br /&gt;    public class CrudProjetTest : UnitTestBase&lt;br /&gt;    {&lt;br /&gt;        [TestMethod]&lt;br /&gt;        public void CanSaveProjet()&lt;br /&gt;        {&lt;br /&gt;            Client c = new Client(DataMappers);&lt;br /&gt;            c.Nom = &quot;Projet Test&quot;;&lt;br /&gt;            Projet p = new Projet(c, DataMappers);&lt;br /&gt;            p.Nom = &quot;Client Test&quot;;&lt;br /&gt;&lt;br /&gt;            Assert.IsTrue(p.IsModified);&lt;br /&gt;            p.Save();&lt;br /&gt;            Assert.IsFalse(p.IsModified);&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;
&lt;p&gt;Nous vous invitons à tester cette configuration dont le réel intérêt est à terme de pouvoir valider que l'implémentation des activités métier de notre application s'exécute avec succès et respectent les règles métier définis. Mais avant cela, nous verrons évidemment comment concevoir et coder les activités métier, concept essentiel de Salamanca...&lt;/p&gt;</description>
         <author>Pierre Mavraganis</author>
         <guid isPermaLink="false">urn:md5:16d84ccf58284205719ce80ea185fc4d</guid>
         <pubDate>Mon, 10 Aug 2009 07:47:00 +0000</pubDate>
      </item>
      <item>
         <title>Escale #2 : Base de données</title>
         <link>http://salamanca.nourysolutions.com/bord/index.php?post/2009/07/31/Escale-2-%3A-Base-de-donneacute%3Bes</link>
         <description>&lt;p&gt;Pourquoi avoir &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/bord/index.php?post/2009/07/10/Escale-1-%3A-Entiteacute%3Bs-meacute%3Btier&quot;&gt;spécifié, modélisé et généré des entités métier&lt;/a&gt; ?&lt;/p&gt;
&lt;p&gt;Si nous sommes &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/bord/index.php?post/2009/06/15/Embarquement-prochain&quot;&gt;à bord de Salamanca&lt;/a&gt;, c'est car nous voulons informatiser (et améliorer) l'un de nos &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.commentcamarche.net/contents/qualite/processus.php3&quot;&gt;processus&lt;/a&gt; de travail. L'objectif est de permettre aux acteurs de ce processus de consulter, saisir, évaluer, récupérer ou exploiter les ressources et informations alimentant ce processus dans le cadre d'un enchaînement d'activités. &lt;/p&gt;
&lt;p&gt;C'est d'ailleurs la base de la &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/road/index.php?post/2008/08/04/6-getting-on-the-tracks&quot;&gt;définition d'une application métier&lt;/a&gt; :&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&quot;manipuler des données spécifiques à une organisation ou un secteur d'activité&quot;.&lt;/p&gt;
&lt;/blockquote&gt;  &lt;p&gt;Nous sommes donc en accord avec la ligne de produits ciblée par l'usine Salamanca (ça tombe bien !). Pour cela, un moyen de stocker l'ensemble de ces informations nous est nécessaire. &lt;/p&gt;
&lt;p&gt;Comme Salamanca comprend une &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/road/index.php?post/2008/08/20/Visiting-Salamanca&quot;&gt;bibliothèque ORM&lt;/a&gt; (mais pas seulement !), l'implémentation du mapping entre notre modèle d'entités métier et le modèle physique des données est pour nous, humble développeur &quot;métier&quot;, transparent (même s'il est toujours conseillé d'avoir une compréhension haut niveau des concepts associés).&lt;/p&gt;
&lt;p&gt;Nous nous attarderons donc lors de cette escale uniquement sur l'organisation que nous avons mis en place pour créer (et re-créer) rapidement notre base de données.&lt;/p&gt;
&lt;h2&gt;Organisation&lt;/h2&gt;
&lt;p&gt;Puisque nous disposons du code SQL généré pour la création des tables et des procédures stockées CRUD, autant en profiter. Néanmoins, leur emplacement dans le projet Model et leur liaison au fichier modèle (.tt) assurant leur génération ne permettent pas de les dinstinguer facilement dans notre solution Visual Studio. C'est pourquoi nous avons ajouté le projet &lt;em&gt;Eproject.Sql&lt;/em&gt; de type &lt;em&gt;Projet de base de données&lt;/em&gt; lors de la création de notre solution (tout s'explique !).&lt;/p&gt;
&lt;p&gt;Ainsi, chaque développeur dispose de sa propre base de données de développement à partir d'un schéma placé dans le gestionnaire de versions (conformément aux &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://odetocode.com/Blogs/scott/archive/2008/01/30/11702.aspx&quot;&gt;bonnes pratiques&lt;/a&gt;) et &quot;bien rangé&quot; dans l'environnement de travail :&lt;/p&gt;
&lt;ul&gt;   &lt;li&gt;&lt;img style=&quot;border-width:0;&quot; alt=&quot;VS_SolutionExplorer_Sql&quot; src=&quot;http://salamanca.nourysolutions.com/bord/public/WindowsLiveWriter/Escale2Basededonnes_F3DB/VS_SolutionExplorer_Sql.png&quot; align=&quot;right&quot; border=&quot;0&quot; height=&quot;64&quot; width=&quot;174&quot;/&gt;les scripts de création : dans &lt;em&gt;Create Scripts&lt;/em&gt; &lt;/li&gt;
&lt;li&gt;les scripts de mise à jour : dans &lt;em&gt;Change Scripts&lt;/em&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour cela, nous ajoutons dans les propriétés du projet &lt;em&gt;Eproject.Model&lt;/em&gt; un évènement après génération (Post-build) afin de copier les fichiers SQL générés dans leur répertoire cible.&lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;Ligne de commande apr&amp;#xe8;s g&amp;#xe9;n&amp;#xe9;ration&quot; alt=&quot;&quot; src=&quot;http://salamanca.nourysolutions.com/bord/public/WindowsLiveWriter/Escale2Basededonnes_F3DB/VS_PostBuildModel_CopySQLFiles.png&quot; border=&quot;0&quot; height=&quot;86&quot; width=&quot;369&quot;/&gt;&lt;/p&gt;
&lt;p&gt;De cette façon, les scripts servant à la création de la base restent synchronisés après chaque mise à jour du modèle, puis compilation du code généré.&lt;/p&gt;
&lt;p&gt;Remarque : la première fois, pensez à ajouter manuellement les fichiers copiés (clic droit sur le répertoire, puis &quot;Ajouter un élément existant...&quot;).&lt;/p&gt;
&lt;h2&gt;Automatisation&lt;/h2&gt;
&lt;p&gt;Pour automatiser la création de notre base de données, nous avons besoin :&lt;/p&gt;
&lt;ul&gt;   &lt;li&gt;d'un script TRANSACT-SQL pour effacer (si nécessaire) et créer la base &lt;/li&gt;
&lt;li&gt;d'exécuter &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://msdn.microsoft.com/fr-fr/library/ms162773%28SQL.90%29.aspx&quot;&gt;l'utilitaire sqlcmd&lt;/a&gt; en ligne de commande ou dans un batch (.cmd) &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nous pourrions pousser l'automatisation de la même façon que pour la copie des fichiers SQL en ajoutant un évènement après génération du projet &lt;em&gt;Eproject.Model&lt;/em&gt;. Mais cela efface les données saisies en cours de développement à chaque génération, donc nous préférons nous placer dans le répertoire &lt;em&gt;Create Scripts&lt;/em&gt; et exécuter la commande ci-dessous (dans un batch) uniquement lors d'un changement dans notre schéma :&lt;/p&gt;
&lt;pre&gt;C:&amp;#92;eProject&amp;#92;src&amp;#92;ABordDeSalamanca&amp;#92;Eproject.Sql&amp;#92;Create Scripts&amp;gt;sqlcmd.exe -E -X -S .&amp;#92;SQLEXPRESS -v DatabaseName=eProject_ABord -i Create.sql&lt;/pre&gt;
&lt;p&gt;Comme nous utilisons une base de données SQL Server 2008 Express, notre exemple de script TRANSACT-SQL contient le code suivant :&lt;/p&gt;
&lt;pre class=&quot;SQL&quot;&gt;USE master&lt;br /&gt;GO&lt;br /&gt;&lt;br /&gt;IF EXISTS (SELECT * FROM sys.databases WHERE name=N'$(DatabaseName)')&lt;br /&gt;BEGIN&lt;br /&gt;    ALTER DATABASE $(DatabaseName)&lt;br /&gt;        SET SINGLE_USER&lt;br /&gt;        WITH ROLLBACK IMMEDIATE&lt;br /&gt;    DROP DATABASE $(DatabaseName)&lt;br /&gt;END&lt;br /&gt;GO&lt;br /&gt;&lt;br /&gt;CREATE DATABASE $(DatabaseName)&lt;br /&gt;GO&lt;br /&gt;&lt;br /&gt;USE $(DatabaseName)&lt;br /&gt;GO&lt;br /&gt;&lt;br /&gt;:reset &lt;br /&gt;:r Tables.sql &lt;br /&gt;:r StoredProcedures.sql &lt;br /&gt;GO&lt;/pre&gt;
&lt;p&gt;Voilà une façon rapide de disposer à tout moment d'une base de données synchronisée avec notre modèle d'entités métier. Et nous verrons lors de notre prochaine escale comment la mise en place de notre projet de tests unitaires en bénéficie...&lt;/p&gt;</description>
         <author>Pierre Mavraganis</author>
         <guid isPermaLink="false">urn:md5:bc86b652aa0b0685d9f28db505a9963c</guid>
         <pubDate>Fri, 31 Jul 2009 08:42:00 +0000</pubDate>
      </item>
      <item>
         <title>Escale #1 : Entités métier</title>
         <link>http://salamanca.nourysolutions.com/bord/index.php?post/2009/07/10/Escale-1-%3A-Entiteacute%3Bs-meacute%3Btier</link>
         <description>&lt;p&gt;&lt;img style=&quot;margin-left:15px;&quot; alt=&quot;Entit&amp;#xe9;s&quot; src=&quot;http://www.decoloopio.com/image_base/Img_179.png&quot; align=&quot;right&quot; border=&quot;0&quot; width=&quot;102&quot; height=&quot;139&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Nous voilà arrivés au pays des &quot;entités&quot;. Mais qui sont-elles ?&lt;/p&gt;
&lt;p&gt;Pour mieux intégrer cette notion d'entité, nous nous référons à sa définition dans le cadre du &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://en.wikipedia.org/wiki/Entity-Relationship_Model#cite_note-0&quot;&gt;modéle entité-relation développé par Dr Peter Chen&lt;/a&gt; : &lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&quot;une chose qui peut être identifiée distinctement ayant une signification pour une organisation&quot;.&lt;/p&gt;
&lt;/blockquote&gt;  &lt;h2&gt;Spécification&lt;/h2&gt;
&lt;p&gt;Dans le cadre du service que nous développons, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://eproject.nourysolutions.com&quot;&gt;eProject&lt;/a&gt;, nous voulons mettre en relation les entités suivantes :&lt;/p&gt;
&lt;ul&gt;   &lt;li&gt;un projet métier : vue d'ensemble, besoin détaillé et périmètre d'un prototype &lt;/li&gt;
&lt;li&gt;3 interlocuteurs : client, commercial et consultant &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Lors de la définition de notre besoin, nous avons également précisé les règles d'association à travers les spécifications suivantes :&lt;/p&gt;
&lt;ul&gt;   &lt;li&gt;Pour consulter NourY Solutions sur mes besoins métier, je veux pouvoir soumettre mon projet ainsi que mes projets ultérieurs en tant qu'interlocuteur client &lt;/li&gt;
&lt;li&gt;Pour piloter la relation clientèle, je prend en charge le suivi de l'avancement des projets de chacun de mes clients en tant qu'interlocuteur commercial &lt;/li&gt;
&lt;li&gt;Pour produire un prototype à partir de l'analyse d'un besoin, je veux pouvoir estimer la charge de travail sur la base de chaque projet en tant qu'interlocuteur consultant &lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Modélisation&lt;/h2&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/bord/public/WindowsLiveWriter/Escale1Entitsmtier_1031D/VS_Model_eProject.png&quot;&gt;&lt;img style=&quot;border-width:0;&quot; alt=&quot;Mod&amp;#xe8;le eProject&quot; src=&quot;http://salamanca.nourysolutions.com/bord/public/WindowsLiveWriter/Escale1Entitsmtier_1031D/VS_Model_eProject-small.png&quot; border=&quot;0&quot; width=&quot;420&quot; height=&quot;210&quot;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Une fois les concepts digérés et notre besoin spécifié, Salamanca nous permet de rapidement modéliser le socle de notre métier représenté dans le diagramme ci-dessus.&lt;/p&gt;
&lt;p&gt;Pour cela, nous ouvrons le &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/road/index.php?post/2008/08/20/Visiting-Salamanca&quot;&gt;modèle SDML&lt;/a&gt; du projet &lt;em&gt;Eproject.Model&lt;/em&gt; de la solution Visual Studio créée lors de &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/bord/index.php?post/2009/06/29/Larguez-les-amarres-%21&quot;&gt;notre départ&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img style=&quot;margin-left:15px;&quot; alt=&quot;VS_Model_Toolbox&quot; src=&quot;http://salamanca.nourysolutions.com/bord/public/WindowsLiveWriter/Escale1Entitsmtier_1031D/VS_Model_Toolbox.png&quot; align=&quot;right&quot; border=&quot;0&quot; width=&quot;165&quot; height=&quot;175&quot;/&gt;&lt;/p&gt;
&lt;p&gt;La palette d'éléments mise à disposition dans la boite à outils est d'une aide précieuse pour implémenter notre modèle de 5 entités simplement par glisser-déposer et définition des propriétés des associations : &lt;/p&gt;
&lt;ul&gt;   &lt;li&gt;1 &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://fr.wikipedia.org/wiki/Composition_%28programmation%29&quot;&gt;composition&lt;/a&gt; entre Client et Projet &lt;/li&gt;
&lt;li&gt;2 associations bidirectionnelles entre Commercial et Client, entre Consultant et Projet&amp;nbsp; &lt;/li&gt;
&lt;li&gt;3 &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://fr.wikipedia.org/wiki/H%C3%A9ritage_%28informatique%29&quot;&gt;héritages&lt;/a&gt; : Client, Commercial et Consultant sont tous des Interlocuteurs du Projet &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nous pouvons maintenant définir les attributs soit par glisser-déposer de l'élément &quot;Attribute&quot;&amp;nbsp;à partir de la boîte à outils, soit par clic droit sur l'entité, puis&amp;nbsp;&quot;Ajouter un nouveau Entity Attribute&quot; à partir du menu contextuel.&lt;/p&gt;
&lt;p&gt;Le nom et le type (string par défaut) de l'attribut&amp;nbsp;peuvent être définis directement de manière graphique alors que la fenêtre de &quot;Propriétés&quot; permet également de spécifier des règles validées automatiquement grâce à l'utilisation de l'une des 4 bibliothèques de Salamanca : &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/road/index.php?post/2008/08/26/Inside-the-libraries-I-%3A-Data-Rules&quot;&gt;Data Rules&lt;/a&gt;.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;La facilité d'intégration de règles métier est l'une des grandes forces de Salamanca, aussi nous lui dédierons bientôt une escapade de découverte avant la prochaine escale !&lt;/p&gt;
&lt;h2&gt;Génération&lt;/h2&gt;
&lt;p&gt;Une fois les attributs et les règles associées définis pour chaque entité, il nous reste qu'à générer le code correspondant par un simple clic sur l'icône &quot;Transformer tous les modèles&quot; présente dans la barre d'outils de la fenêtre &quot;Explorateur de solutions&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img style=&quot;border-width:0;margin-left:15px;&quot; alt=&quot;Code g&amp;#xe9;n&amp;#xe9;r&amp;#xe9;&quot; src=&quot;http://salamanca.nourysolutions.com/bord/public/WindowsLiveWriter/Escale1Entitsmtier_1031D/VS_Model_GeneratedCode.png&quot; align=&quot;right&quot; border=&quot;0&quot; width=&quot;253&quot; height=&quot;290&quot;/&gt;&lt;/p&gt;
&lt;p&gt;A la fin de la génération, nous obtenons l'ensemble du code de la couche d'accès aux données basé sur la bibliothèque générique de Salamanca dédié à cet usage : &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/road/index.php?post/2008/09/01/Inside-the-libraries-II-%3A-Data-Access&quot;&gt;Data Access&lt;/a&gt;. Cette couche est constituée :&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;du code SQL de création des tables associées aux entités&lt;/li&gt;
&lt;li&gt;des procédures stockées pour les opérations CRUD sur chaque entité&lt;/li&gt;
&lt;li&gt;des interfaces et classes de mapping entre entités et tables (Data Mappers)&lt;/li&gt;
&lt;li&gt;des ressources liant procédures stockées et méthodes CRUD implémentées dans les Data Mappers&lt;/li&gt;
&lt;li&gt;des interfaces et classes des entités du domaine métier&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L'avantage évident de cette formule &quot;Modélisation + Génération&quot; est de ne plus avoir à taper du code redondant. Pour preuve, je vous invite à satisfaire votre curiosité et éditer les fichiers générés : on retrouve le même air dans chaque classe avec quelques variations autour du thème...&lt;/p&gt;
&lt;p&gt;Mais le réel instant de bonheur du point de vue du développeur se savoure lors de l'implémentation de demandes d'évolutions telles que l'ajout d'attributs, ou mieux, lors de la modification de relations. Personnellement, j'ai par le passé consommé beaucoup de temps dans la maintenance du code SQL et objet suite aux évolutions inhérentes à tout projet métier.&lt;/p&gt;
&lt;p&gt;Je vous invite donc dés maintenant à faire l'expérience avec le modèle métier de votre projet en cours avant notre prochaine escale : l'automatisation de la mise en place de la base de données.&lt;/p&gt;</description>
         <author>Pierre Mavraganis</author>
         <guid isPermaLink="false">urn:md5:6e525cd5f0bac16116c165d255fe65a2</guid>
         <pubDate>Mon, 27 Jul 2009 15:37:00 +0000</pubDate>
      </item>
      <item>
         <title>Larguez les amarres !</title>
         <link>http://salamanca.nourysolutions.com/bord/index.php?post/2009/06/29/Larguez-les-amarres-%21</link>
         <description>&lt;p&gt;Au moment de larguer les amarres, il y a toujours sur le quai un ami ou un passant pour nous demander si rien n'a été oublié et que tout a été chargé...&lt;/p&gt;
&lt;h2&gt;Pré-requis&lt;/h2&gt;
&lt;p&gt;Pour démarrer, nous avons bien sûr téléchargé la dernière &lt;strong&gt;version 1.0 (alpha) de Salamanca&lt;/strong&gt; à l'adresse :&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; title=&quot;http://salamanca.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24562&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24562&quot;&gt;http://salamanca.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24562&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Suivant le &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.codeplex.com/Wiki/View.aspx?title=Install&quot;&gt;manuel d'installation&lt;/a&gt;, nous avons d'abord vérifié que notre équipement contient déjà &lt;strong&gt;Visual Studio 2008 SP1&lt;/strong&gt; dont la version d'évaluation de l'édition Professionnal est téléchargeable à l'adresse :&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; title=&quot;http://www.microsoft.com/downloads/details.aspx?familyid=83C3A1EC-ED72-4A79-8961-25635DB0192B&amp;amp;displaylang=fr&quot; target=&quot;_blank&quot; href=&quot;http://www.microsoft.com/downloads/details.aspx?familyid=83C3A1EC-ED72-4A79-8961-25635DB0192B&amp;amp;displaylang=fr&quot;&gt;http://www.microsoft.com/downloads/details.aspx?familyid=83C3A1EC-ED72-4A79-8961-25635DB0192B&amp;amp;displaylang=fr&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Nous avons ensuite téléchargé et installé les &lt;strong&gt;Guidance Automation Extensions (GAX)&lt;/strong&gt; à l'adresse :&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; title=&quot;http://www.microsoft.com/downloads/details.aspx?familyid=DF79C099-4753-4A59-91E3-5020D9714E4E&amp;amp;displaylang=en&quot; target=&quot;_blank&quot; href=&quot;http://www.microsoft.com/downloads/details.aspx?familyid=DF79C099-4753-4A59-91E3-5020D9714E4E&quot;&gt;http://www.microsoft.com/downloads/details.aspx?familyid=DF79C099-4753-4A59-91E3-5020D9714E4E&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Comme nous souhaitons utiliser les facilités offertes par le Data Access Application Block, nous avons aussi téléchargé &lt;strong&gt;Enterprise Library 4.1&lt;/strong&gt; à l'adresse :&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; title=&quot;http://www.microsoft.com/Downloads/details.aspx?familyid=1643758B-2986-47F7-B529-3E41584B6CE5&quot; target=&quot;_blank&quot; href=&quot;http://www.microsoft.com/Downloads/details.aspx?familyid=1643758B-2986-47F7-B529-3E41584B6CE5&quot;&gt;http://www.microsoft.com/Downloads/details.aspx?familyid=1643758B-2986-47F7-B529-3E41584B6CE5&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Nous utiliserons également une base de données &lt;strong&gt;SQL Server 2008 Express&lt;/strong&gt; disponible avec l'outil SQL Server 2008 Management Studio Express à l'adresse :&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; title=&quot;http://www.microsoft.com/downloads/details.aspx?displaylang=fr&amp;amp;FamilyID=7522a683-4cb2-454e-b908-e805e9bd4e28&quot; target=&quot;_blank&quot; href=&quot;http://www.microsoft.com/downloads/details.aspx?displaylang=fr&amp;amp;FamilyID=7522a683-4cb2-454e-b908-e805e9bd4e28&quot;&gt;http://www.microsoft.com/downloads/details.aspx?displaylang=fr&amp;amp;FamilyID=7522a683-4cb2-454e-b908-e805e9bd4e28&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;L'application Salamanca&lt;/h2&gt;
&lt;p&gt;Nous voilà parés pour monter &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/bord/index.php?post/2009/06/15/Embarquement-prochain&quot;&gt;à bord de Salamanca&lt;/a&gt;. Notre périple commence par la création de notre application &lt;em&gt;eProject&lt;/em&gt; dans notre environnement de développement Visual Studio.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/bord/public/WindowsLiveWriter/Larguezlesamarres_94B3/VS_SalamancaApplication_4.png&quot;&gt;&lt;img style=&quot;border-width:0;&quot; alt=&quot;Salamanca Application&quot; src=&quot;http://salamanca.nourysolutions.com/bord/public/WindowsLiveWriter/Larguezlesamarres_94B3/VS_SalamancaApplication_thumb_1.png&quot; border=&quot;0&quot; width=&quot;460&quot; height=&quot;313&quot;/&gt;&lt;/a&gt;&amp;nbsp; &lt;/p&gt;
&lt;p&gt;Nous respectons ensuite (presque) les &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://msdn.microsoft.com/fr-fr/library/ms229043.aspx&quot;&gt;conventions de nommage de mise en majuscule&lt;/a&gt; de notre langage préféré C# dans la définition du nom de domaine de l'application.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/bord/public/WindowsLiveWriter/Larguezlesamarres_94B3/VS_SalamancaApplicationInformation_4.png&quot;&gt;&lt;img style=&quot;border-width:0;&quot; alt=&quot;Salamanca Application Information&quot; src=&quot;http://salamanca.nourysolutions.com/bord/public/WindowsLiveWriter/Larguezlesamarres_94B3/VS_SalamancaApplicationInformation_thumb_1.png&quot; border=&quot;0&quot; width=&quot;460&quot; height=&quot;312&quot;/&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp; &lt;/p&gt;
&lt;p&gt;&lt;img style=&quot;border-width:0;&quot; alt=&quot;Explorateur de solutions&quot; src=&quot;http://salamanca.nourysolutions.com/bord/public/WindowsLiveWriter/Larguezlesamarres_94B3/VS_SolutionExplorer_9.png&quot; align=&quot;right&quot; border=&quot;0&quot; width=&quot;210&quot; height=&quot;489&quot;/&gt; &lt;/p&gt;
&lt;p&gt;Nous obtenons ainsi une solution Visual Studio constituée du projet &lt;em&gt;Eproject.Model&lt;/em&gt; de type &lt;em&gt;Bibliothèque de classes&lt;/em&gt; qui nous permettra de modéliser les concepts métier de notre application et de générer l'ensemble du code associé : &lt;/p&gt;
&lt;ul&gt;   &lt;li&gt;classes des entités métier &lt;/li&gt;
&lt;li&gt;classes de mapping objet-relationnel (DataMappers) &lt;/li&gt;
&lt;li&gt;scripts SQL de création des tables et procédures stockées de la base de données &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Afin d'avoir les provisions nécessaires à notre voyage, nous ajoutons dés maintenant à la solution Visual Studio les projets pour chaque composant à fabriquer. Notre application Salamanca est alors composée de :&lt;/p&gt;
&lt;ol&gt;   &lt;li&gt;&lt;em&gt;Eproject.Model&lt;/em&gt; de type&lt;em&gt; Bibliothèque de classes&lt;/em&gt; pour la modélisation et la génération des entités métier &lt;/li&gt;
&lt;li&gt;&lt;em&gt;Eproject.Sql&lt;/em&gt; de type &lt;em&gt;Projet de base de données &lt;/em&gt;pour la création et maintenance des scripts SQL &lt;/li&gt;
&lt;li&gt;&lt;em&gt;Eproject.Tests&lt;/em&gt; de type &lt;em&gt;Projet de test &lt;/em&gt;pour la création et l'exécution des tests unitaires &lt;/li&gt;
&lt;li&gt;&lt;em&gt;Eproject.Activities &lt;/em&gt;de type &lt;em&gt;Bibliothèque de classes&lt;/em&gt; pour le codage des activités métier &lt;/li&gt;
&lt;li&gt;&lt;em&gt;Eproject.Web &lt;/em&gt;de type &lt;em&gt;Application Web ASP.NET&lt;/em&gt; contenant l'implémentation web des activités ainsi que la définition de la présentation à travers :       &lt;ul&gt;       &lt;li&gt;une page maître &lt;/li&gt;
&lt;li&gt;un thème ASP.NET &lt;/li&gt;
&lt;li&gt;les ressources de localisation &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Eproject.Setup&lt;/em&gt; de type &lt;em&gt;Projet d'installation Web&lt;/em&gt; pour le déploiement de l'application &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img style=&quot;border:0 none;&quot; alt=&quot;Structure de base Subversion&quot; src=&quot;http://salamanca.nourysolutions.com/bord/public/WindowsLiveWriter/Larguezlesamarres_94B3/SVN_Structure.png&quot; align=&quot;right&quot; border=&quot;0&quot; width=&quot;179&quot; height=&quot;209&quot;/&gt; &lt;/p&gt;
&lt;p&gt;Nous ajoutons l'arborescence des fichiers créés à partir de cette structure de base dans notre &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://fr.wikipedia.org/wiki/Syst%C3%A8me_de_gestion_de_versions&quot;&gt;gestionnaire de versions&lt;/a&gt; (Subversion) qui sert de référentiel pour l'ensemble de nos codes sources.&lt;/p&gt;
&lt;p&gt;Nous voilà munis d'un équipement bien outillé et d'un bel horizon devant nous.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; title=&quot;Sun behind cloud, by householdriot on flickr&quot; target=&quot;_blank&quot; href=&quot;http://www.flickr.com/photos/34077396@N00/15072480/&quot;&gt;&lt;img style=&quot;margin-right:15px;&quot; alt=&quot;Sun behind cloud&quot; src=&quot;http://farm1.static.flickr.com/10/15072480_1bb658ef65_m_d.jpg&quot; border=&quot;0&quot; width=&quot;240&quot; height=&quot;180&quot;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Lors de notre prochaine escale, vous verrez comment nous tirons profit du bon vent que nous amène la modélisation des entités et la génération du code associé.&lt;/p&gt;
&lt;p&gt;Tâchons de garder le cap !&lt;/p&gt;</description>
         <author>Pierre Mavraganis</author>
         <guid isPermaLink="false">urn:md5:c423898a41508cfa61a89cdbfed7e2b4</guid>
         <pubDate>Wed, 01 Jul 2009 15:16:00 +0000</pubDate>
      </item>
      <item>
         <title>Bye bye World!</title>
         <link>http://salamanca.nourysolutions.com/bord/index.php?post/2009/06/29/Bye-bye-World%21</link>
         <description>&lt;p&gt;Fidèle à la politesse légendaire des outils de développement, nous
commençons donc par une sorte de &quot;Bonjour Monde !&quot; (ça sonne bizarre en
français...) transformé dans notre cas en &quot;Au revoir Monde !&quot; car c'est
un nouvel univers que nous prenons en main avec Salamanca.&lt;/p&gt;
&lt;p&gt;Voici venue l'heure de faire un tour de chauffe et de voir comment se comporte notre embarcation à travers un prototype de &lt;a rel=&quot;nofollow&quot; hreflang=&quot;fr&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/bord/index.php?post/2009/06/15/Embarquement-prochain&quot;&gt;notre application web&lt;/a&gt; développée suivant 2 approches :&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;un formulaire ASP.NET&lt;/li&gt;
&lt;li&gt;une question dans une activité Salamanca&lt;/li&gt;
&lt;/ul&gt;
Dans l'application web métier qui sert de fil conducteur à ce carnet de bord, l'utilisateur va principalement manipuler des projets. L'activité initiale à l'origine de l'ensemble du processus a été spécifiée sous la forme suivante :
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;En tant que donneur d'ordre, je veux pouvoir soumettre un projet en ligne afin de décrire un besoin métier en un minimum de temps. &lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;  &lt;h2&gt;Formulaire ASP.NET&lt;/h2&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/bord/public/WindowsLiveWriter/ByebyeWorld_99BF/ASPNETFormView.png&quot;&gt;&lt;img style=&quot;border-width:0;&quot; alt=&quot;ASP.NET FormView&quot; src=&quot;http://salamanca.nourysolutions.com/bord/public/WindowsLiveWriter/ByebyeWorld_99BF/ASPNETFormView_thumb.png&quot; align=&quot;right&quot; border=&quot;0&quot; width=&quot;204&quot; height=&quot;244&quot;/&gt;&lt;/a&gt; Un formulaire web peut être rapidement assemblé dans Visual Studio à partir d'une table dans une base de données SQL Express et des contrôles ASP.NET &lt;span style=&quot;font-size:1em;color:rgb(163, 21, 21);font-family:courier new;&quot;&gt;FormView, SqlDataSource&lt;/span&gt;. &lt;/p&gt;
&lt;pre class=&quot;sql&quot; style=&quot;font-size:9pt;&quot;&gt;CREATE TABLE Projets(&lt;br /&gt;	Id int IDENTITY(1,1) NOT NULL,&lt;br /&gt;	Titre nvarchar(255) NOT NULL,&lt;br /&gt;	Description ntext NOT NULL,&lt;br /&gt;	...&lt;br /&gt;)&lt;/pre&gt;
&lt;pre class=&quot;xml&quot; style=&quot;font-size:9pt;&quot;&gt;&amp;lt;asp:FormView ID=&quot;_FormView&quot; runat=&quot;server&quot; DataKeyNames=&quot;Id&quot; DataSourceID=&quot;_SqlDataSource&quot;&amp;gt; ...&lt;br /&gt;&amp;lt;/asp:FormView&amp;gt;&lt;br /&gt;&amp;lt;asp:SqlDataSource ID=&quot;_SqlDataSource&quot; runat=&quot;server&quot;  ConnectionString=&quot;&amp;lt;%$ ConnectionStrings:Proto %&amp;gt;&quot; &amp;gt; ... &lt;br /&gt;&amp;lt;/asp:Sqldatasource&amp;gt;&lt;/pre&gt;
&lt;p&gt;Grâce à l'environnement et aux outils mis à notre disposition par Microsoft, nous pouvons donc aller très vite pour &quot;assembler&quot; un écran qui pourrait satisfaire l'exigence métier. Par contre, pour satisfaire &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/bord/index.php?post/2009/06/15/Embarquement-prochain&quot;&gt;nos attentes&lt;/a&gt; et disposer d'une application robuste, modulaire et maintenable, c'est moins certain... Par exemple, maintenir toutes les requêtes SQL inclues directement dans la page web s'avère rapidement consommateur d'énergie lorsqu'on fera évoluer le modèle de données.&lt;/p&gt;
&lt;h2&gt;Question Salamanca&lt;/h2&gt;
&lt;p&gt;Ce que nous avons retenu de l'usine à logiciels Salamanca, c'est l'introduction du &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/road/index.php?post/2008/10/09/QuickStart-%3A-the-Activity&quot;&gt;concept d'activité métier&lt;/a&gt; pour répondre à la problématique de séparation entre &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://fr.wikipedia.org/wiki/Architecture_3-Tier#Les_trois_couches&quot;&gt;les 3 couches&lt;/a&gt; : Présentation - Métier - Accès aux données. Une activité s'exécute à partir de données définies dans un &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://fr.wikipedia.org/wiki/Programmation_orient%C3%A9e_objet#Mod.C3.A9lisation_objet&quot;&gt;modéle objet&lt;/a&gt; et interagit avec l'utilisateur à travers des questions auxquelles sont associées des écrans.&lt;/p&gt;
&lt;p&gt;Nous avons ainsi conçu le modèle d'activité suivant pour satisfaire l'exigence spécifiée :&lt;/p&gt;
&lt;p&gt;&lt;img style=&quot;border-width:0;&quot; alt=&quot;Activit&amp;#xe9; Soumettre un Projet&quot; src=&quot;http://salamanca.nourysolutions.com/bord/public/WindowsLiveWriter/ByebyeWorld_99BF/SubmitProjetActivity.png&quot; border=&quot;0&quot; width=&quot;477&quot; height=&quot;164&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Dans le diagramme de notre activité ci-dessus, nous avons :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;un état qui pose une question à l'utilisateur : &lt;span style=&quot;font-family:courier new;&quot;&gt;AskProjetInfos&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;deux états de traitement : &lt;span style=&quot;font-family:courier new;&quot;&gt;CreateProjet, SaveProjet&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;un conteneur des données manipulées : &lt;span style=&quot;font-family:courier new;&quot;&gt;Data&lt;/span&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nous verrons lors d'une prochaine escale comment les entités métier constituant les données de l'activité sont modélisées et le code des classes comme des tables associées sont générées.&lt;/p&gt;
&lt;p&gt;Notre but ici est de faire le parallèle avec le prototype de formulaire ASP.NET, donc d'introduire comment est implémentée la présentation du même écran.&lt;/p&gt;
&lt;p&gt;Lors son exécution, l'activité fournit la référence au projet créé dans la question invitant l'utilisateur à saisir les informations de description de son nouveau projet. On peut alors directement lier l'interface homme-machine avec l'instance de l'entité métier chargée de la persistence des informations.&lt;/p&gt;
&lt;p&gt;Plutôt que d'étendre le contrôle &lt;span style=&quot;font-size:1em;color:rgb(163, 21, 21);font-family:courier new;&quot;&gt;FormView&lt;/span&gt; pour y inclure la référence à l'entité, nous préférons implémenter un contrôle utilisateur nommé &lt;span style=&quot;font-size:1em;color:rgb(163, 21, 21);font-family:courier new;&quot;&gt;ProjetEditor&lt;/span&gt; qui pourrait être généré à l'avenir par notre usine à partir du modèle objet.&lt;/p&gt;
&lt;pre class=&quot;xml&quot; style=&quot;font-size:9pt;&quot;&gt;&amp;lt;uc1:ProjetEditor ID=&quot;_ProjetEditor&quot; runat=&quot;server&quot; /&amp;gt;&lt;/pre&gt;
&lt;pre style=&quot;font-size:9pt;&quot;&gt;public partial class ProjetEditor : UserControl, IProjetContainer&lt;/pre&gt;
&lt;p&gt;Dans l'écran associé à la question, nous déclarons comme éléments visuels :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le contrôle utilisateur : &lt;span style=&quot;font-size:1em;color:rgb(163, 21, 21);font-family:courier new;&quot;&gt;ProjetEditor&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;deux boutons pour valider ou annuler la saisie : &lt;span style=&quot;font-size:1em;color:rgb(163, 21, 21);font-family:courier new;&quot;&gt;NextButton, CancelButton&lt;/span&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La page ASP.NET implémente également l'interface contenant l'entité à manipuler :&lt;/p&gt;
&lt;pre style=&quot;font-size:9pt;&quot;&gt;public partial class ProjetAskInfos : Page, IProjetContainer&lt;/pre&gt;
&lt;p&gt;Et le lien avec le contrôle utilisateur &quot;coule de source&quot; :&lt;/p&gt;
&lt;pre style=&quot;font-size:9pt;&quot;&gt;public Projet Projet&lt;br /&gt;{&lt;br /&gt;    get { return _ProjetEditor.Projet; }&lt;br /&gt;    set { _ProjetEditor.Projet = value; }&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;Il nous reste à brancher le contrôleur qui gère l'exécution de l'activité :&lt;/p&gt;
&lt;pre style=&quot;font-size:9pt;&quot;&gt;private IActivityController ActivityController&lt;br /&gt;{&lt;br /&gt;    get { return ActivityControllersSessionStack.Instance.Peek(); }&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;Ce qui est fait à chaque chargement de la page :&lt;/p&gt;
&lt;pre style=&quot;font-size:9pt;&quot;&gt;protected void Page_Load(object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;    ActivityController.Execute(); &lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;Enfin, à travers les évènements déclenchés par un clic sur les boutons, le contrôleur assure le passage à l'état suivant ou l'annulation de l'activité :&lt;/p&gt;
&lt;pre style=&quot;font-size:9pt;&quot;&gt;protected void NextButton_Click(object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;    if (Page.IsValid)&lt;br /&gt;        ActivityController.Execute(ActivityStateResult.Next);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;protected void CancelButton_Click(object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;    ActivityController.Execute(ActivityStateResult.Cancel);&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;Nous voilà donc avec une implémentation pour une IHM web de la question qui contient uniquement de la connectique avec les autres couches. Il nous manque encore un branchement, est-ce que vous voyez lequel ?&lt;/p&gt;
&lt;p&gt;Si oui, vous avez gagné... toute notre estime !&lt;/p&gt;
&lt;p&gt;Nous aurons l'occasion d'y revenir mais l'essentiel est d'avoir pu pratiquer à travers ce prototype d'écran la mise en oeuvre du principe de séparation entre la logique métier et la présentation, approche qui nous permet avec le temps de satisfaire notre préoccupation de développer une application modulaire et évolutive.&lt;/p&gt;
&lt;p&gt;Nous sommes maintenant prêts à nous jeter véritablement à l'eau et nous lancer dans l'équipée du développement d'une application métier avec Salamanca. En bon capitaine, nous rendrons bientôt compte des conditions de notre départ dans ce carnet de bord.&lt;/p&gt;</description>
         <author>Pierre Mavraganis</author>
         <guid isPermaLink="false">urn:md5:a15a8a2c42b42e2be2b645b9228ab3e1</guid>
         <pubDate>Mon, 29 Jun 2009 09:30:00 +0000</pubDate>
      </item>
      <item>
         <title>Préparation</title>
         <link>http://salamanca.nourysolutions.com/bord/index.php?post/2009/06/22/Pr%C3%A9paration</link>
         <description>&lt;p&gt;&lt;a rel=&quot;nofollow&quot; title=&quot;Bacino del Mediterraneo, Antonio Millo, Wikimedia Commons&quot; target=&quot;_blank&quot; href=&quot;http://commons.wikimedia.org/wiki/File:Millobacinomed.JPG&quot;&gt;&lt;img style=&quot;border-width:0;width:249px;height:179px;&quot; alt=&quot;Mediteranean map&quot; src=&quot;http://upload.wikimedia.org/wikipedia/commons/9/9b/Millobacinomed.JPG&quot; align=&quot;right&quot;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Maintenant que nous avons fait connaissance avec l'équipement (Salamanca), l'équipage (votre dévoué capitaine) et l'équipée (mon projet), nous allons préparer notre itinéraire, histoire de ne pas partir pour l'inconnu.&lt;/p&gt;
&lt;p&gt;Plutôt que fixer une destination, nous préfèrons vous embarquer pour une croisière (à vous de voir si elle s'amuse). &lt;/p&gt;
&lt;p&gt;Elle aura pour escales :&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/bord/index.php?post/2009/06/29/Larguez-les-amarres-%21&quot;&gt;Organisation de la solution Salamanca dans Visual Studio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/bord/index.php?post/2009/07/10/Escale-1-%3A-Entiteacute%3Bs-meacute%3Btier&quot;&gt;Génération du code pour le modèle des entités métier&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/bord/index.php?post/2009/07/31/Escale-2-%3A-Base-de-donneacute%3Bes&quot;&gt;Création de la base de données&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/bord/index.php?post/2009/08/06/Escale-3-%3A-Tests-unitaires&quot;&gt;Configuration du projet de tests unitaires&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Conception du modèle et codage d'une activité métier&lt;/li&gt;
&lt;li&gt;Implémentation web d'une activité métier&lt;/li&gt;
&lt;li&gt;Mise en place du déploiement de l'application web&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Une fois cet itinéraire bouclé, nous prévoyons déjà de le réitérer afin d'améliorer notre connaissance du parcours grâce à l'expérience acquise et d'exploiter les évolutions futures de l'équipement.&lt;/p&gt;
&lt;p&gt;Nous serons peut-être aussi amené à dériver vers d'autres rivages au gré des vents rencontrés entre chaque escale.&lt;/p&gt;
&lt;p&gt;N'hésitez pas également à faire part d'autres voies à explorer.&lt;/p&gt;
&lt;p&gt;Mais avant de partir avec ce plan de route, nous allons nous mettre en situation et tester notre &quot;bateau&quot; avec un essai en &quot;eaux calmes&quot; à travers :&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a rel=&quot;nofollow&quot; hreflang=&quot;fr&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/bord/index.php?post/2009/06/29/Bye-bye-World%21&quot;&gt;Prototypage d'un formulaire ASP.NET avec et sans Salamanca&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; title=&quot;Paquebot La Pallice, Pep.per, Wikimedia Commons&quot; target=&quot;_blank&quot; href=&quot;http://fr.wikipedia.org/wiki/Fichier:Paquebot_La_Pallice.jpg&quot;&gt;&lt;img style=&quot;border-width:0;width:300px;height:137px;margin-right:20px;&quot; alt=&quot;Paquebot La Pallice&quot; src=&quot;http://upload.wikimedia.org/wikipedia/commons/8/8e/Paquebot_La_Pallice.jpg&quot;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Et pour se mettre en condition, rien de tel qu'un air d'heureux présage.&lt;/p&gt;
 
 
 
 
&lt;p&gt;Georges Brassens - Heureux qui comme Ulysse&lt;/p&gt;
 
&lt;br /&gt;
&lt;a rel=&quot;nofollow&quot; style=&quot;border-style:none;&quot; target=&quot;_blank&quot; href=&quot;http://www.deezer.com/track/2420859&quot;&gt;
&lt;img src=&quot;http://www.deezer.com/embedded/footer.jpg&quot; alt=&quot;free music&quot; title=&quot;free music&quot;/&gt;&lt;/a&gt;</description>
         <author>Pierre Mavraganis</author>
         <guid isPermaLink="false">urn:md5:8ae05c4915b8d507c745a587b2843abf</guid>
         <pubDate>Mon, 22 Jun 2009 15:30:00 +0000</pubDate>
      </item>
      <item>
         <title>Embarquement prochain</title>
         <link>http://salamanca.nourysolutions.com/bord/index.php?post/2009/06/15/Embarquement-prochain</link>
         <description>&lt;p&gt;La &lt;a rel=&quot;nofollow&quot; hreflang=&quot;en&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24562&quot;&gt;version 1.0 (alpha 1)&lt;/a&gt; de l'&lt;a rel=&quot;nofollow&quot; hreflang=&quot;en&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.codeplex.com/&quot;&gt;usine à logiciels Salamanca &lt;/a&gt;est sortie il y a maintenant &lt;a rel=&quot;nofollow&quot; hreflang=&quot;en&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/road/index.php?post/2009/03/12/Salamanca-1.0-%28alpha-1%29-is-released&quot;&gt;3 mois&lt;/a&gt; et en tant qu'adopteur de la première heure (&quot;Early adopter&quot;), je compte faire partager à travers ce journal de bord les moments de plénitude comme les mauvais grains que je vis grâce à l'utilisation de cet outil.&lt;/p&gt;
&lt;p&gt;Si je fais l'analogie avec une expédition en bateau, c'est que je préfère partir avec une carte et un cap dans ma façon d'aborder mes projets de développement. Je me sens en effet plus comme un poisson dans l'eau dans le rôle d'analyste que dans le rôle de programmeur même si mon CV revendique plusieurs années d'expérience en développement web et mobile sous .NET.&lt;/p&gt;
&lt;p&gt;C'est pourquoi je vais aborder la navigation dans le monde de Salamanca à travers l'un des projets sur lequel je travaille depuis maintenant 6 mois : &lt;a rel=&quot;nofollow&quot; hreflang=&quot;fr&quot; target=&quot;_blank&quot; href=&quot;https://eproject.nourysolutions.com&quot;&gt;eProject&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ce service vise à accélérer la prise de décision lors du lancement d'un projet de développement métier. Il s'appuie sur
un processus défini de production d'un prototype à partir d'une
expression structurée du besoin. L'idée est de mettre entre les mains
du porteur de projet une ébauche de solution pour faciliter le soutien et l'implication des différents intervenants.&lt;/p&gt;
&lt;p&gt;La mise en oeuvre d'un processus répondant à une problématique métier (dans ce cas le lancement d'un projet) entre directement dans la &lt;a rel=&quot;nofollow&quot; hreflang=&quot;en&quot; target=&quot;_blank&quot; href=&quot;http://salamanca.nourysolutions.com/road/index.php?post/2008/08/04/6-getting-on-the-tracks&quot;&gt;ligne de produits&lt;/a&gt; définie pour l'usine à logiciels Salamanca : les applications métier.&lt;/p&gt;
&lt;p&gt;J'attends ainsi de Salamanca qu'elle m'aide à
:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;développer, faire évoluer et maintenir sur la
durée (plusieurs années) un service en ligne dédié aux entreprises&lt;/li&gt;
&lt;li&gt;réaliser rapidement (en
1 ou 2 semaines) des prototypes d'application métier&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C'est dans ce cadre que je souhaite partager publiquement mon
expérience de l'utilisation de &lt;strong&gt;Salamanca&lt;/strong&gt;.&lt;/p&gt;
&lt;strong&gt;Bienvenue à bord !&lt;/strong&gt;</description>
         <author>Pierre Mavraganis</author>
         <guid isPermaLink="false">urn:md5:75e4128333b2c703a65e53c0503218ad</guid>
         <pubDate>Mon, 15 Jun 2009 13:34:00 +0000</pubDate>
      </item>
   </channel>
</rss>
<!-- fe4.yql.bf1.yahoo.com compressed/chunked Thu Oct  1 22:29:02 UTC 2015 -->
