# Saturday, October 25, 2008

Entity Framework – Génération du mapping et du sql

Ayant pas mal joué avec NHibernate, je voulais tester l’ORM de Microsoft : ADO.Net Entity Framework. Une bonne partie des exemples qui existent sur internet partent d’un model de base de données existant et génère le fichier de mapping. C’est très pratique pour partir d’un existant, mais ne sert pas lorsqu’on veut créer un nouveau projet.

J’ai apprécié le designer de classes, mais ne s’avère pas très pratique pour modeler un projet entier. Il ne permet pas par exemple d’avoir plusieurs diagrammes de classes. Ayant déjà créé mon propre outil de génération pour NHibernate (NHib.Wizard), je suis reparti de ce projet pour faire de même avec Entity Framework.

Je peux donc maintenant partir d’un modeleur UML (ArgoUML, j’ai pas trouvé mieux en gratuit pour l’instant) et générer mon fichier model.edmx ainsi que le script de base de données correspondant.

L’application en ClickOnce : http://labs.ucaya.com/EF.Wizard/publish.htm

Une video de démonstration : http://silverlight.services.live.com/49123/c3ca3d75-b05f-49d2-8522-b22131f2ee8d/Generation.wmv

#    Comments [0] |

Partager des DataContracts entre WebServices avec Silverlight

Les différents webservices d’une même application ont parfois besoin de partager les mêmes structures de données. Par défaut, lors de l’ajout de ces webservices à la solution, Silverlight duplique les classes de données générées.

Imaginons un DataContract User retourné par un webservice Users.svc qui gère les utilisateurs et utilisé dans webservice Rights.svc qui gère les droits de l’application.

    [DataContract]

    public class User

    {

        [DataMember]

        public string FirstName { get; set; }

 

        [DataMember]

        public string LastName { get; set; }

 

    }

 

    [ServiceContract(Namespace = "")]

    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

    public class Users

    {

        [OperationContract]

        public User GetUsers()

        {

            return new User { FirstName = "Thierry", LastName = "Bouquain" };

        }

    }

 

    [ServiceContract(Namespace = "")]

    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

    public class Rights

    {

        [OperationContract]

        public User AssignUserRights(User user)

        {

            return user;

        }

    }

solution Pour partager le datacontract User dans les classes générées, il suffit de créer la même classe User avec le même namespace dans un project silverlight et de le référencer dans l’application silverlight.
Une fois les références des webservices mise à jours, la classe User ne sera plus générée.

Pour éviter de dupliquer les datacontracts, il est possible de créer un projet silverlight qui utilise les mêmes fichiers côté client et côté serveur.
Evidement, dans ce cas, le code du DataContract ne peux référencer des objets serveurs qui n’existent pas côté silverlight.

Je vous invite à regarder le projet attaché à ce post.

 

 

 

 

 

 

 

#    Comments [0] |
# Tuesday, October 07, 2008

Captcha en Silverlight

Encore un nouveau venu dans SLExtensions. Voici un contrôle de captcha qui se branche sur le service gratuit www.recaptcha.net.

Le principe

recaptcha-api-diagram 

  1. 1 L’utilisateur télécharge l’application silverlight qui contient le contrôle de captcha.
  2. 2 Le contrôle de captcha récupère une image plus une clé de cryptage du serveur d’image de www.recaptcha.net.
  3. 3 Le contrôle de captcha renvoie au serveur web (par POST, Get, Webservice, comme vous voulez), la clé de cryptage optenue auprès de www.recaptcha.net ainsi que les mots saisis par l’utilisateur.
  4. 4 Le serveur web fait un appel au serveur www.recaptcha.net en passant les données venues de l’utilisateur (mots + clé) plus une clé privée. Le serveur reCaptcha valide ou non le captcha. Le serveur fait ensuite (ou non) son traitement.
  5. 5 Retour vers l’utilisateur pour l’informer du résultat.

Le contrôle

<UserControl x:Class="SLExtensions.Showcase.PageRecaptcha"

   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

   xmlns:slec="clr-namespace:SLExtensions.Controls;assembly=SLExtensions.Controls"

   Width="400" Height="300">

    <StackPanel x:Name="LayoutRoot" Background="White">

        <slec:ReCaptcha x:Name="captcha" PublicKey="6LesLAMAAAAAACjPBtyjD80bwTowvEQrslT8bJvT" HorizontalAlignment="Center" VerticalAlignment="Center" >

            <slec:ReCaptcha.Verifier>

                <slec:ReCaptchaHttpPostVerifier Url="/VerifyCaptcha.aspx" Success="ReCaptchaHttpPostVerifier_Success" Failed="ReCaptchaHttpPostVerifier_Failed"/>

            </slec:ReCaptcha.Verifier>

        </slec:ReCaptcha>

    </StackPanel>

</UserControl>

Pour utiliser le contrôle, vous devez fournir un objet qui implémente l’interface IReCaptchaVerifier. C’est lui qui va se charger de faire l’appel au webservice vers votre serveur. Dans SLExtensions, j’ai ajouté une classe d’exemple qui fait un POST http des informations ainsi que la page aspx qui valide les informations auprès de recaptcha.

#    Comments [0] |
# Friday, October 03, 2008

DeepZoom facile

J’ai rajouté dans le projet SLExtensions une librairie permattant de gérer facilement vos galleries DeepZoom. Il rajoute grâce aux méthodes d’extensions des fonctions utiles comme le positionnement automatique de votre collection, la gestion de la roulette de la souris, le glisser du deepzoom, le zoom sur une image de la collection, etc…

<UserControl x:Class="SLExtensions.Showcase.PageDeepZoom"

   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

   xmlns:sledz="clr-namespace:SLExtensions.DeepZoom;assembly=SLExtensions.DeepZoom"

   >

    <Grid x:Name="LayoutRoot" Background="White">

        <Grid.RowDefinitions>

            <RowDefinition Height="Auto"/>

            <RowDefinition/>

        </Grid.RowDefinitions>

 

        <StackPanel Orientation="Horizontal">

            <Button Content="Next" Click="Next_Click"/>

            <Button Content="Previous" Click="Previous_Click"/>

            <Button Content="All" Click="All_Click"/>

        </StackPanel>

 

        <MultiScaleImage x:Name="msi" Source="http://labs.ucaya.com/dznantes/dzc_output.xml"

                        Grid.Row="1"

                        sledz:DZExtensions.ArrangeOnFirstMotionFinished="True"

                        sledz:DZExtensions.IsMousePanEnabled="True"

                        sledz:DZExtensions.IsMouseWheelEnabled="True"/>

    </Grid>

</UserControl>

L’activation de la gestion de la souris ainsi que le positionnement automatique des images se fait par des AttachedProperty à déclarer sur le contrôle MultiScaleImage.
Dans cet exemple, j’ai rajouté 3 bouttons permettant de faire un simple slideshow des images deepzoom. Ils exécutent des fontions d’extensions disponibles dans le namespace SLExtensions.DeepZoom.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Net;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Animation;

using System.Windows.Shapes;

using SLExtensions.DeepZoom;

 

namespace SLExtensions.Showcase

{

    public partial class PageDeepZoom : UserControl

    {

        public PageDeepZoom()

        {

            InitializeComponent();

        }

 

        private int collectionIndex = -1;

 

        private void Next_Click(object sender, RoutedEventArgs e)

        {

            DZContext context = msi.EnsureContext();

            collectionIndex = (collectionIndex + 1) % context.ImagesToShow.Count;

            msi.ZoomFullAndCenterImage(collectionIndex);

        }

 

        private void Previous_Click(object sender, RoutedEventArgs e)

        {

            DZContext context = msi.EnsureContext();

            collectionIndex = (collectionIndex + context.ImagesToShow.Count - 1) % context.ImagesToShow.Count;

            msi.ZoomFullAndCenterImage(collectionIndex);

        }

 

        private void All_Click(object sender, RoutedEventArgs e)

        {

            msi.ZoomCenter();

        }

    }

}

#    Comments [1] |
# Thursday, October 02, 2008

Second post venu d’ailleurs…

Ca y est je l’ai reçu ! Mon nouveau laptop, un alienware :-)

Je vous le recommande c’est un truc de fou !

Voici les specs et quelques photos :

Processor Intel(R) Core(TM)2 Duo CPU T8100 @ 2.10GHz

Memory (RAM) 4,00 GB

Intel Memory Turbo Cache 1,00 GB

Graphics NVIDIA GeForce 8600M GT

Primary hard disk 120 GB 7200

Windows Vista (TM) Ultimate

Manufacturer Alienware

Model m15x

PIC-0002 

PIC-0004 PIC-0005 PIC-0003 PIC-0006

#    Comments [2] |
# Saturday, September 27, 2008

Internet Explorer 8

La toute dernière version d’Internet Explorer (actuellement en bêta 2) propose quelques fonctionnalités assez intéressantes.

Un dossier a été créé à ce sujet sur msdn http://msdn.microsoft.com/fr-fr/ie/msdn.dossier-ie8.aspx.

Vous y retrouverez également les articles de Thierry et moi :

  - WebSlices : http://msdn.microsoft.com/fr-fr/ie/cc963660.aspx

  - Accelerators : http://msdn.microsoft.com/fr-fr/ie/cc963658.aspx

#    Comments [0] |
# Wednesday, August 20, 2008

UCAYA Tour Next 5

::Ile de la Réunion::

8 Les 3 roches.

#    Comments [0] |

UCAYA Tour Next 4

::Ile de la Réunion::

6 7

La nouvelle (gueule de bois).

#    Comments [0] |

UCAYA Tour Next 3

::Ile de la Réunion::

5  au Col du Taibit.

#    Comments [0] |

UCAYA Tour Next 2

::Ile de la Réunion::

4 au Cirque de Mafate.

#    Comments [0] |