A bord de Salamanca

Aller au contenu | Aller au menu | Aller à la recherche

Alpha 2 : les énumérations

La sortie de la version alpha 2 de Salamanca nous a donné l'occasion de sortir notre équipement pour révision en cale sèche...

Spécification du cycle de vie d'un projet

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 :

Projet_LifeCycle 

Chaque changement de statut est de la responsabilité d'un des interlocuteurs que nous avons déjà spécifié lors de la modélisation de nos entités :

  • Un client soumet un projet
  • Un commercial prend en charge ou annule un projet soumis
  • Le client détaille le besoin de son projet pris en charge
  • Un consultant prototype un périmètre délimité du besoin
  • Le client clôture le projet après livraison du prototype

Modélisation avec énumération

Pour modéliser le cycle de vie d'un projet, nous avons ajouté l'énumération StatutProjet 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 Statut à l'entité Projet et défini son type comme StatutProjet.

VS_Model_StatutProjet

Pour chaque valeur d'énumération, nous associons à travers le champ Description de ses propriétés la chaîne de caractères "en français" : Soumis, Pris en charge, Détaillée, Prototypé, Clôturé, Annulé.

On retrouve alors dans le code SQL généré l'insertion de ces valeurs en base :

INSERT INTO StatutProjet VALUES('SOUMI', 'Soumis');
INSERT INTO StatutProjet VALUES('ENCHA', 'Pris en charge');
INSERT INTO StatutProjet VALUES('DETAI', 'Détaillé');
INSERT INTO StatutProjet VALUES('PROTO', 'Prototypé');
INSERT INTO StatutProjet VALUES('CLOTR', 'Clôturé');
INSERT INTO StatutProjet VALUES('ANNUL', 'Annulé');

Implémentation de l'écran liste des projets

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.

Nous ajoutons donc dans le projet Eproject.Web :

  • un répertoire Espace qui regroupe les écrans accessibles après ouverture de session
  • une page d'accueil Default.aspx qui affiche une vue d'ensemble selon le rôle utilisateur

Dans la page d'accueil, nous implémentons la liste des projets à travers :

  • un contrôle ASP.NET GridViewaffichant les projets sous forme de tableau
  • un contrôle ASP.NET SqlDataSource récupérant les informations directement avec une requête SQL vers la base de données

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 notre projet de tests unitaires. Le résultat placé dans le fichier web.config du projet web est le suivant :

<dataConfiguration defaultDatabase="eProject_ABord" />
<connectionStrings>
  <add name="eProject_ABord" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=eProject_ABord;Integrated Security=True" providerName="System.Data.SqlClient" />
</connectionStrings>

Pour alimenter la liste, nous ajoutons des données de test dans la base eProject_ABord avec le script SQL :

Declare @client_id uniqueidentifier=newid();

INSERT INTO Interlocuteurs (Id, Nom, Email) VALUES (@client_id, 'Client test', 'client@test.com');
INSERT INTO Clients (Id, Societe) VALUES (@client_id, 'Société test');

INSERT INTO Projets (Client_Id, Nom, Statut_Code) VALUES (@client_id, 'Application DA VINCI', 'SOUMI');
INSERT INTO Projets (Client_Id, Nom, Statut_Code) VALUES (@client_id, 'Gestion de stocks', 'SOUMI');
INSERT INTO Projets (Client_Id, Nom, Statut_Code) VALUES (@client_id, 'Projet SIGMAT', 'ENCHA');
INSERT INTO Projets (Client_Id, Nom, Statut_Code) VALUES (@client_id, 'Plateforme YaKa', 'DETAI');
INSERT INTO Projets (Client_Id, Nom, Statut_Code) VALUES (@client_id, 'Fiche PATROL', 'PROTO');
INSERT INTO Projets (Client_Id, Nom, Statut_Code) VALUES (@client_id, 'MOBILAT', 'CLOTR');
INSERT INTO Projets (Client_Id, Nom, Statut_Code) VALUES (@client_id, 'Projet SPAMMER', 'ANNUL');

Dans un fichier de ressource nommé Sql.resx ajouté au dossier ASP.NET App_GlobalResources, nous définissons la requête SQL ProjectSelectList :

SELECT p.Id, p.Client_Id, p.Nom, c.Societe, sp.Description
FROM Projets p, Clients c, StatutProjet sp
WHERE  p.Client_Id=c.Id AND p.Statut_Code=sp.Code

Dans la page web, nous ajoutons le code ASP.NET ci-dessous pour afficher la liste issue de la requête :

<asp:SqlDataSource ID="ProjetSqlDataSource" runat="server" 
ConnectionString="<%$ ConnectionStrings:eProject_ABord %>" ProviderName="<%$ConnectionStrings:eProject_ABord.ProviderName %>"
SelectCommand="<%$ Resources:Sql, ProjetSelectList %>">
</asp:SqlDataSource>
<asp:GridView ID="ProjetGridView" runat="server" DataSourceID="ProjetSqlDataSource" DataKeyNames="ID" Width="400px">
    <Columns>
        <asp:BoundField DataField="Id" HeaderText="Id" ReadOnly="True" SortExpression="ID" Visible="False" />
        <asp:BoundField DataField="Nom" HeaderText="<%$ Resources:SR, ProjetNomLabel %>" />
        <asp:BoundField DataField="Societe" HeaderText="<%$ Resources:SR, ClientSocieteLabel %>" />
        <asp:BoundField DataField="Description" HeaderText="<%$ Resources:SR, ProjetStatutLabel %>" />
    </Columns>
</asp:GridView>

Pour obtenir un "look & feel" homogène dans notre application, nous avons ajouté :

  • la page maître Site.Master liée à une feuille de style CSS placée dans le thème Default du répertoire ASP.NET App_Themes
  • 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
  • l'option styleSheetTheme="Default" à la directive pages du fichier web.config

La page Default.aspx est transformée en formulaire de contenu web en ajoutant :

  • la directive MasterPageFile="~/Site.master"
  • le code ASP.NET dans un contrôle Content associé à la région pour le contenu (ContentPlaceHolder) définie dans la page maître

Nous obtenons ainsi la liste des projets avec leur client et leur statut associés sous la forme suivante :

 Ecran Liste des projets client

Mise à jour des références Salamanca

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.

Par exemple, dans le projet Eproject.Model, nous avions les 4 références suivantes :

  • Salamanca.Common
  • Salamanca.DataAccess
  • Salamanca.DataAccess.EnterpriseLibrary
  • Salamanca.DataRules

Nous n'avons maintenant plus que 2 références :

  • Salamanca
  • Salamanca.EnterpriseLibrary.4

Ce passage en "révision" de notre équipée 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.

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...

Bye bye World!

Fidèle à la politesse légendaire des outils de développement, nous commençons donc par une sorte de "Bonjour Monde !" (ça sonne bizarre en français...) transformé dans notre cas en "Au revoir Monde !" car c'est un nouvel univers que nous prenons en main avec Salamanca.

Voici venue l'heure de faire un tour de chauffe et de voir comment se comporte notre embarcation à travers un prototype de notre application web développée suivant 2 approches :

  • un formulaire ASP.NET
  • une question dans une activité Salamanca
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 :

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.

Formulaire ASP.NET

ASP.NET FormView 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 FormView, SqlDataSource.

CREATE TABLE Projets(
Id int IDENTITY(1,1) NOT NULL,
Titre nvarchar(255) NOT NULL,
Description ntext NOT NULL,
...
)
<asp:FormView ID="_FormView" runat="server" DataKeyNames="Id" DataSourceID="_SqlDataSource"> ...
</asp:FormView>
<asp:SqlDataSource ID="_SqlDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:Proto %>" > ...
</asp:Sqldatasource>

Grâce à l'environnement et aux outils mis à notre disposition par Microsoft, nous pouvons donc aller très vite pour "assembler" un écran qui pourrait satisfaire l'exigence métier. Par contre, pour satisfaire nos attentes 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.

Question Salamanca

Ce que nous avons retenu de l'usine à logiciels Salamanca, c'est l'introduction du concept d'activité métier pour répondre à la problématique de séparation entre les 3 couches : Présentation - Métier - Accès aux données. Une activité s'exécute à partir de données définies dans un modéle objet et interagit avec l'utilisateur à travers des questions auxquelles sont associées des écrans.

Nous avons ainsi conçu le modèle d'activité suivant pour satisfaire l'exigence spécifiée :

Activité Soumettre un Projet

Dans le diagramme de notre activité ci-dessus, nous avons :

  • un état qui pose une question à l'utilisateur : AskProjetInfos
  • deux états de traitement : CreateProjet, SaveProjet
  • un conteneur des données manipulées : Data

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.

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.

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.

Plutôt que d'étendre le contrôle FormView pour y inclure la référence à l'entité, nous préférons implémenter un contrôle utilisateur nommé ProjetEditor qui pourrait être généré à l'avenir par notre usine à partir du modèle objet.

<uc1:ProjetEditor ID="_ProjetEditor" runat="server" />
public partial class ProjetEditor : UserControl, IProjetContainer

Dans l'écran associé à la question, nous déclarons comme éléments visuels :

  • le contrôle utilisateur : ProjetEditor
  • deux boutons pour valider ou annuler la saisie : NextButton, CancelButton

La page ASP.NET implémente également l'interface contenant l'entité à manipuler :

public partial class ProjetAskInfos : Page, IProjetContainer

Et le lien avec le contrôle utilisateur "coule de source" :

public Projet Projet
{
get { return _ProjetEditor.Projet; }
set { _ProjetEditor.Projet = value; }
}

Il nous reste à brancher le contrôleur qui gère l'exécution de l'activité :

private IActivityController ActivityController
{
get { return ActivityControllersSessionStack.Instance.Peek(); }
}

Ce qui est fait à chaque chargement de la page :

protected void Page_Load(object sender, EventArgs e)
{
ActivityController.Execute();
}

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é :

protected void NextButton_Click(object sender, EventArgs e)
{
if (Page.IsValid)
ActivityController.Execute(ActivityStateResult.Next);
}

protected void CancelButton_Click(object sender, EventArgs e)
{
ActivityController.Execute(ActivityStateResult.Cancel);
}

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 ?

Si oui, vous avez gagné... toute notre estime !

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.

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.