Exposer les POCO Entity Framework via un service WCF#

Vous avez peut être choisi, comme moi, d’utiliser des entités POCO avec Entity Framework 4 et vous vous êtes certainement rendu compte qu’Entity Framework génère des Proxys qui héritent de ces types POCO pour nous les renvoyer par la suite, donc si notre type POCO s’appelle “Person” Entity Framework va nous renvoyer une instance de type “PersonProxy…”.  Jusqu’ici tout roule, mais là ou ça coince c’est lorsque vous essayez d’exposer vos POCO à travers un service WCF. WCF peut renvoyer les types dits “Known types”, ou plus précisément le DataContractSerializer utilisé par WCF ne peut sérialiser que les “Known types” qui sont les types connus par le service, or notre service ne connait pas les proxys et connait uniquement nos types POCO que nous avons déclaré à notre service, de ce fait l’appel de notre service plante au niveau de la sérialisation du résultat à renvoyer au client.

A ce stade nous pouvons avoir deux approches :

La première c’est de dire que de toutes les façons c’est mal d’exposer ces objets métier à travers un service et nous allons contourner le problème en créant des DTO (Data Transfers Object). Nous allons par la suite transformer nos POCO en DTO et exposer ces derniers. Pour que ces transformations de POCO en DTO ne soient pas lourdes et ennuyantes pour les développeurs nous pouvons utiliser un outil de mapping Objet – Objet comme l’auto mapper par exemple.

La deuxième approche consiste tout simplement à dire “Je veux pouvoir exposer mes objets métiers via WCF”. Dans ce cas nous allons nous aider de la classe DataContractResolver qui va nous permettre d’interagir avec les phases de sérialisation / dé sérialisation, nous allons donc en profiter pour mapper le type proxy généré à notre type POCO lors de ces deux phases. Je vous laisse donc lire le post de l’équipe ADO.NET pour voir le code de la solution complète et les explications qui vont avec.

Conclusion

Je déplore vraiment tous ces petits manques dans EF4 (le manque décrit ci-dessus mais aussi celui décrit dans le dernier post) mais ce qui est rassurant c’est que l’équipe ADO.NET semble à l’écoute et est très réactive puisqu’elle propose toujours des “Work around”

Sunday, February 28, 2010 11:31:40 PM (Romance Standard Time, UTC+01:00) #    Comments [0]  | 

 

Entity framework 4 et le support des POCOs#

Parmi les nouveautés les plus attendues de la version 4 d’Entity Framework il y a le support des POCOs. Dans ce post nous n’allons pas faire un nième HowTo pour expliquer comment utiliser Entity Framework pour mapper des entités POCO (vous pourrez trouver ce genre d’articles ici ou la) mais nous allons plutôt avoir un œil critique sur l’implémentation de cette fonctionnalité au sein d’EF4.

Qu’est ce qu’un POCO (Plain Old CLR Object) ?

Un POCO est une entité autonome, qui n’utilise aucun framework et aucune librairie externe au framework .NET. Ces entités ont donc l’avantage d’être Découplés et donc réutilisables sans aucun problème.

Pourquoi voulons nous qu’ Entity Framework supporte les POCOs?

C’est plus une question d’architecture, qui pourrait faire l’objet d’un article à elle même mais en résumé c’est essentiellement pour ne pas rendre toute notre application dépendante d’ Entity Framework. Si vous avez envie d’aller plus en détail sur cette question je vous conseille ce post.

L’implémentation du support des POCOs dans EF4

Pour explorer cette fonctionnalité j’ai créé un projet vide et dedans un modèle Entity framework vide. J’ai créé ensuite deux entités à travers le designer et regardé le code généré, je m’attendais bien évidemment à trouver des POCOs et à ma grande surprise ce n’est pas du tout le cas. Je me retourne donc vers la doc et c’est là que je vois qu’il faut non seulement avoir le designer mais il faut aussi créer les POCOs à la main à côté. Mais pourquoi le Designer ne génère pas directement des POCOs? je ne pourrais pas vous répondre à cette question mais je pense que l’équipe ADO.NET est entrain d’aller dans ce sens, enfin j’espère parce que c’est vraiment dommage.

Pour palier à ce manque : un Template T4

Microsoft propose un Template T4 permettant de générer les POCOs à partir de l’edmx. De cette manière, nous pourrons utiliser le designer pour concevoir nos classes puis, à partir du modèle, générer la base de données et les entités POCOs. La dernière version de ce template appelée “ADO.NET POCO Entity Generator” est disponible ici. Il faudra juste choisir le bon template (perso j’ai pris le “ADO.NET C# POCO Entity Generator”)

Pour aller plus loin …

Pour ceux qui veulent générer aussi les interfaces pour les POCOs générés par le Template, Matthieu MEZIL propose le Template modifié dans ce sens dans cet article.

Saturday, February 20, 2010 10:31:18 PM (Romance Standard Time, UTC+01:00) #    Comments [0]  | 

 

Microsoft dévoile Windows Phone 7 Series#

Après de longs mois d’attente, Steve Ballmer a enfin dévoilé aujourd’hui (lundi 15 février 2010) au Mobile World Congress le Windows Phone 7 Series et d’après les premières images nous pouvons penser que cette version de l’OS a été faite pour nous réconcilier avec les Windows phone !!! Une interface complètement repensée, fluide et fonctionnelle qui semble être tirée du baladeur ZuneHD, je n’attends qu’une chose c’est qu’un Windows phone traverse l’atlantique pour que je puisse le tester en live.

EN attendant, voici quelques vidéos pour vous mettre un peu l’eau à la bouche :)

 

 

Monday, February 15, 2010 10:27:16 PM (Romance Standard Time, UTC+01:00) #    Comments [0]  | 

 

Personnaliser les colonnes d'un DataGrid en Silverlight : 2ère partie#

Dans la première partie de cette série de posts nous avons vu comment définir nous même les colonnes d’un DataGrid en utilisant le DataGridTextColumn pour définir une colonne de type texte et le DataGridCheckBoxColumn pour définir une colonne de type CheckBox. Dans ce post nous allons voir comment utiliser DataGridTemplateColumn pour créer des colonnes complètement personnalisés.

Reprenons l’exemple que nous avons initié dans ce post et que nous avons enrichi dans celui-ci. Voici pour rappel le xaml du DataGrid

<Data:DataGrid x:Name="TasksGrid" AutoGenerateColumns="False" Style="{StaticResource MyGridStyle}" ItemsSource="{Binding Tasks}">
       <Data:DataGrid.Columns>
           <Data:DataGridTextColumn Binding="{Binding Name}" Header="Nom"></Data:DataGridTextColumn>
           <Data:DataGridCheckBoxColumn Binding="{Binding Realized}" Header="Réalisé"></Data:DataGridCheckBoxColumn>
       </Data:DataGrid.Columns>
</Data:DataGrid>

Et voici le résultat :

image

Nous allons maintenant rajouter deux colonnes à notre grille :

- La première contenant un voyant qui sera rouge si la tâche n’est pas encore réalisée et qui sera vert si la tâche est réalisée.

- La deuxième colonne va contenir un bouton qui permettra par la suite d’ouvrir une popup (Child window) pour visualiser la tâche

Pour ces deux colonnes nous allons utiliser DataGridTemplateColumn. C’est un type de colonne complètement personnalisable et qui, par défaut, possède un modèle vide. Nous pouvons alors y placer tous les contrôles que nous voulons, ces contrôles vont alors constituer notre colonne et se répéter pour chaque ligne liée à partir de la source de données.

Côté xaml nous allons utiliser la balise DataGridTemplateColumn dans la quelle nous pouvons définir entre autre le CellTemplate qui va contenir le modèle de cellule pour cette colonne en mode lecture. L’EditTemplate quand à lui peut être définit au même niveau que le CellTemplate et va contenir le modèle de cellule pour cette colonne lorsqu'elle sera en mode édition. Voici la définition d’une DataGridTemplateColumn avec un Cell Template et un EditTemplate vides.

<Data:DataGridTemplateColumn Header=""  IsReadOnly="True">
    <Data:DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            
        </DataTemplate>
    </Data:DataGridTemplateColumn.CellEditingTemplate>
    <Data:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
        
        </DataTemplate>
    </Data:DataGridTemplateColumn.CellTemplate>
</Data:DataGridTemplateColumn>

Les templates vides comme définis ci-dessous lèvent une exception à l’exécution, il faut placer au moins un contrôle dans chaque DataTemplate.

La colonne voyant de réalisation

Nous allons tout d’abord enrichir notre classe Task en ajoutant une propriété que nous allons appeler RealizedColor, cette propriété va nous retourner la couleur verte si la valeur de la propriété Realized est à true et la couleur rouge le cas échéant.

public SolidColorBrush RealizedColor 
{
       get 
       {
           if (Realized)
               return new SolidColorBrush(Colors.Green);
           else
               return new SolidColorBrush(Colors.Red);
       }
}

Il suffit maintenant de rajouter une ellipse à notre template et de binder sa propriété Fill avec la propriété RealizedColor de notre classe task.

Positionnez vous en dessous de ces lignes et avant la fermeture de la balise DataGrid.Columns

<Data:DataGrid.Columns>
    <Data:DataGridTextColumn Binding="{Binding Name}" Header="Nom"></Data:DataGridTextColumn>
    <Data:DataGridCheckBoxColumn Binding="{Binding Realized}" Header="Réalisé"></Data:DataGridCheckBoxColumn>

et insérez le xaml suivant

<Data:DataGridTemplateColumn Header=""  IsReadOnly="True">
     <Data:DataGridTemplateColumn.CellTemplate>
         <DataTemplate x:Name="TemplateRealized">
             <Ellipse Fill="{Binding RealizedColor}" Width="15" Height="15"></Ellipse>
         </DataTemplate>
     </Data:DataGridTemplateColumn.CellTemplate>
</Data:DataGridTemplateColumn>

La colonne bouton de visualisation

Même principe pour cette colonne, sauf que nous allons juste rajouter un bouton, nous n’allons pas définir son fonctionnement pour un souci de simplification. Voici le xaml à insérer juste après celui que nous nous venons d’insérer :

<Data:DataGridTemplateColumn Header=""  IsReadOnly="True">
    <Data:DataGridTemplateColumn.CellTemplate>
        <DataTemplate x:Name="TemplateVisualiser">
            <Button x:Name="btnVisualiser" Content="Visualiser"></Button>
        </DataTemplate>
    </Data:DataGridTemplateColumn.CellTemplate>
</Data:DataGridTemplateColumn>

En exécutant, nous devrions avoir quelque chose qui ressemble à ça

image

Il reste encore le bouton visualiser qui ne fonctionne pas encore et pour cause nous n’avons pas défini l’EventHandler correspondant à l’évènement click du bouton. Pour cela, placez vous dans la balise bouton et commencez à taper le mot “click” l’IntelliSense va vous proposer l’évènement click, appuyez alors sur “=” et visual studio va vous proposer de créer pour vous l’EventHandler pour cet évènement, appuyez sur Entrée.

image

Si vous allez dans votre code behind vous allez trouver la méthode créée qui s’appelle btnVisualiser_Click (si vous avez nommé votre Bouton comme moi). Dans cette méthode nous allons instancier une ChildWindow, affecter l’objet Task à son DataContext et ouvrir la ChildWindow qui va afficher le contenu de l’objet Task contenu dans le DataContext.

Nous allons maintenant créer la ChildWindow qui va contenir le détail de la ligne. Positionnez vous au niveau du répertoire Views, click droit sur Views –> Add –> New Item –> Silverlight Child Window et nommez la Detail.xaml.

image

Pour afficher les données nous allons utiliser un DataForm (Composant du Silverlight Toolkit), voici tout le code xaml de la ChildWindow

<controls:ChildWindow xmlns:dataFormToolkit="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.DataForm.Toolkit"  x:Class="TasksManager.View.Views.Detail"
           xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
           xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
           xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"
           Width="400" Height="300" 
           Title="Detail">
    <Grid x:Name="LayoutRoot" Margin="2">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        
        <dataFormToolkit:DataForm Grid.Row="0" AutoGenerateFields="True" AutoCommit="False" AutoEdit="False" x:Name="dataForm">
        </dataFormToolkit:DataForm>
    </Grid>
</controls:ChildWindow>

Dans le code behind de Detail.xaml, nous allons nous abonner à l’évènement “Loaded” et dans la méthode “Detail_Loaded” qui va être déclenchée après le chargement de la ChildWindow, nous allons remplir l’ItemSource de notre DataForm à l’aide du DataContext. Voici le code Behind de la Child Window :

    public partial class Detail : ChildWindow
    {
        public Detail()
        {
            InitializeComponent();
            this.Loaded += new RoutedEventHandler(Detail_Loaded);
        }

        void Detail_Loaded(object sender, RoutedEventArgs e)
        {
            List<Task> tasks = new List<Task>();
            tasks.Add(this.DataContext as Task);
            dataForm.ItemsSource = tasks;
        }

    }

Maintenant si vous exécutez votre code vous devriez voir les deux colonnes que nous avons rajouté

image

et si vous cliquez sur visualiser vous allez voir apparaître votre ChildWindow avec le détail de la ligne en cours.

image

L’utilisation du DataForm n’est pas vraiment appropriée ici puisque ce composant est fait pour gérer des collections d’objets mais pour les besoins de la démo cela suffit. Bien entendu, nous pouvons toujours aller plus loin en définissant des TemplateField pour le DataForm.

Voila voila, les TemplateColumn ne devraient plus avoir de secret pour vous au même titre que les ChildWindow dont l’utilisation se révèle très utile et surtout très simple. Dans le prochain post nous allons voir comment utiliser les Converter pour encore plus loin dans la personnalisation de votre DataGrid.

Wednesday, February 10, 2010 9:25:47 PM (Romance Standard Time, UTC+01:00) #    Comments [0]  | 

 

SQL Server 2008/R2 pour les développeurs#

DSC_0142

J’ai assisté à la session “SQL Server 2008/R2 pour les développeurs” animée par nos 2 excellents experts Winwise Rui CARVALHO et Michel PERFETTI le lundi 8 février de 14h30 à 15h30 aux Techdays 2010. Rui a commencé par présenter les nouveautés du point de vue développeur base de données / DBA avec les nouveaux types introduits dans SQL Server 2008 comme le type Date, Time ou encore les types appartenant à la cartouche spatiale de SQL Server tel que Geography, Polygon, Point, … Il a présenté aussi plein d’autres nouveautés et à chaque fois il appuyait avec des exemples très parlants. Ensuite Michel a pris la parole en se plaçant du côté développeur applicatif et il a présenté un outil “bleuffant” dont j’ignorais complètement l’existence qui s’appelle “DB PRO” et qui va permettre au développeur de se comporter avec son code TSQL comme avec son code C#. En résumé cet outil installé va nous permettre, à partir de visual studio, de compiler vos procédures stockées, de faire du Refactoring, de faire de l’analyse de code, de comparer 2 bases de données ou une base de données et la version de la base de données gérée par l'outil et beaucoup d’autres fonctionnalités indispensables.

La session était très dynamique et on ne s’est pas ennuyé une seconde. Donc si vous n’avez pas assisté à cette session je vous conseille vivement le web cast dès qu’il sera dispo sur le site des Techdays.

DSC_0146 Michel à gauche de la photo et Rui est sur la droite

Wednesday, February 10, 2010 10:33:07 AM (Romance Standard Time, UTC+01:00) #    Comments [0]  | 

 

Retour sur la session que j’ai co-animé avec Arnaud AUROUX aux Techdays 2010#

Comme prévu, j’ai animé hier (le lundi 08/02/2010) en compagnie d’Arnaud la session “Silverlight 4 : Cas pratique du mode déconnecté” aux Techdays. La session c’est très bien passée et nous remercions toutes les personnes qui se sont déplacés pour y assister. Malheureusement il y a des personnes qui n’ont pas pu accéder à la salle pour assister à la présentation faute de place, je m’excuse auprès d’eux et pour me racheter je publierais très prochainement la présentation ainsi que les sources de la démo. Bien évidemment, vous aurez aussi le web cast sur le site des Techdays bientôt, pour l’instant il n’y a pas encore de date précise mais je ne manquerais pas de vous informer dès que j’aurais l’info.

Pour ceux qui étaient parmi nous hier, j’aimerais avoir vos retours pour savoir si tout était clair? est ce que ça vous a permis d’acquérir de nouvelles connaissances? Est ce que ça correspondait à vos attentes? Ce qui vous a plu, ce qui était dommage, …

merci et peut être à très bientôt ;)

Une petite photo de l’équipe après la session …

DSC_0127 Arnaud sur la gauche de la photo et moi-même à droite

Wednesday, February 10, 2010 1:18:58 AM (Romance Standard Time, UTC+01:00) #    Comments [0]  | 

 

All content © 2012, Zied Nemili