Traduction

Le nouveau projet librairie de classes

Ceci a été une des plus longues séries d'articles sur mon blog que j'ai faite mais il y a tellement de quoi se mettre sous la dent ! Peut-être que quelqu'un écrira un livre ou deux ? Peu importe, dans cet article, je voudrais passer un peu de temps à regarder la structure de projet que nous avons construite et voir si il y a façon de l'améliorer un petit peu avec une séparation plus claire des préoccupations.

Pour ceux qui viennent juste nous rejoindre, voici encore des nouvelles de ma session Mix09 "building business applications with Silverlight 3". Vous pouvez regarder la vidéo originale de la session complete.

  1. VS2008 SP1
  2. Silverlight 3 RTM
  3. .NET RIA Services July '09 Preview <--- N'est en réalité pas nécessaire pour cette démo ! Mais c'est néanmoins bien de le savoir ;-)

La structure du projet wue nous avons utilisé depuis le début est une simple solution avec deux projets dedans :

  • MyApp - L'application Silverlight
  • MyApp.Web - L'application Web

Le projet MyApp.Web a actuellement deux intérêts distincts.. Le premier est de maintenir la logique applicative de l'entièreté de l'application, le second sont les interfaces web et des services (plus précisément le rendu final de default.aspx, sitemap.aspx et SuperEmployeeService.svc). Deux buts dans le même projet a tendance à m'embêter à un certain niveau car je préfère une séparation plus propre pour une meilleure maintenance et un travail inter équipe. Heureusement, un nouveau projet librairie de classes pour RIA Services est disponible dans la mise à jour de juillet de RIA Services. Nous regarderons de plus prêt à la refactoriation du projet MyApp.Web pour sortir la partie logique applicative dans un projet séparé.

Faites un clic droit sur la solution et sélectionnez "Ajouter un nouveau projet..."

Image non disponible

Cela va créer une paire de projets librairie de classes, une pour le client, une pour le serveur.

Image non disponible

Tout d'abord, nous avons besoin d'ajouter une référence du projet MyApp.Web au projet SuperEmployeeRIAServicesLibrary.Web.. Nous allons vouloir accéder au DomainService défini dans la librairie à de nombreux endroits dans WebApp.

Maintenant, ajoutez simplement un modèle Entity Framework et SuperEmployeeDomainService au projet SuperEmployeeRIAServicesLibrary.Web exactement comme nous l'avions fait précédemment à l'article 2. Une fois que vous avez la classe SuperEmployeeDomainService créé, vous pouvez recopier les implémentations que nous avons donc faites précédemment...

Vous pouvez ensuite supprimer les classes des services Domain du projet MyApp.Web. Cela vous donne un très grand soucis de propreté..

Image non disponible

Notez que SuperEmployeesRIAServicesLibrary.Web contient les classes du modèle de données et du Domain et le projet MyApp.Web a les pages asp.net et le service. Tout cela accède au DomainModel à partir du projet librairie de classes.

Notez que si vous utilisez "Business Application Template" comme moi, vous remarquerez un répertoire Services qui inclus quelques DomainServices pour fonctionner avec la gestion utilisateur. D'une certaine façon, je pense à ça comme un souci d'application à grande échelle, cela devrait donc avoir du sens de laisser cela dans le projet web, mais si vous voudriez les déplacer, pas de problème. Faites simplement les étapes suivantes :

  1. Déplacez l'entièreté directement dans le projet SuperEmployeeRIAServicesLibrary.Web. C'est surement un petit peu plus propre de mettre à jour les espaces de noms dans ces types, si vous faites ainsi, vous aurez besoin de mettre à jour les espaces de noms au niveau du client également.
  2. Retirez le "RIA Services Link" du client Silverlight au projet MyApp.Web dans les propriétés de MyApp.
  3. Ajoutez une référence de projet de MyApp à SuperEmployeesRIAServicesLibrary.
  4. Ajoutez une simple classe RIAContext à votre application.
  5. Reliez explicitement le AuthDomainContext dans App.xaml.cs avec les lignes 5 et 6.
Image non disponible
 
Sélectionnez
public sealed partial class RiaContext : System.Windows.Ria.RiaContextBase
{
    partial void OnCreated();
 
    public RiaContext()
    {
        this.OnCreated();
    }
    public new static RiaContext Current
    {
        get
        {
            return ((RiaContext)(System.Windows.Ria.RiaContextBase.Current));
        }
    }
    
    public new User User
    {
        get
        {
            return ((User)(base.User));
        }
    }
}
 
Sélectionnez
1: private void Application_Startup(object sender, StartupEventArgs e)
2: {
3:     this.Resources.Add("RiaContext", RiaContext.Current);
4:  
5:     var auth = RiaContext.Current.Authentication as FormsAuthentication;
6:     auth.DomainContext = new AuthenticationContext();
7:     
8:     this.RootVisual = new MainPage();
9: }

Une fois encore, les étapes ci-dessus sont optionnelles - seulement si vous voulez exclure complètement le DomainService de votre application web.

Maintenant, nous avons juste besoin de mettre à jour les références d'espaces de noms au travers des clients Silverlight et web car notre classe DomainService est dans un nouvel espace de nom. Et "presto"! L'application fonctionne très bien, mais maintenant le projet est mieux factorisé pour une maintenance à long terme.

Remarquez que chaque élément de l'application reste fonctionnel...

L'application cliente..

Image non disponible

La vue ASP.NET (pour SEO)..

Image non disponible

Le service...

Image non disponible

Et évidemment, le client WinForms pour ce service..

Image non disponible

Conclusion

Cet article conclut la partie sur les sources de données basées sur WCF. La quatorzième partie de cette série d'articles sera consacrée au support de Visual Basic (VB) et de WPF.

Remerciements

Je tiens ici à remercier Brad Abrams pour nous avoir autorisé à traduire son article.