3. 3
L’expert de référence !
Société d’expertise sur les technologies Microsoft
Partenaire historique et stratégique de Microsoft
Plus de 90 collaborateurs certifiés interviennent sur des missions à forte valeur
ajoutée :
Missions d’expertise
Conseil & Audit
Réalisation de projets à engagement de résultats
Une offre couvrant l’ensemble du cycle de vie des applications :
Travail collaboratif, portail d’entreprise et Workflow
Business Intelligence & Data Management
Interfaces utilisateurs, Rich Internet Application & desktop application
Architecture d’entreprise et Architecture Life cycle Management
Infrastructure, Sécurité et Réseaux
Centre de formation et de Certification Microsoft
WINWISE est le pôle d’expertise MICROSOFT du Groupe ALTEN et bénéficie de
la puissance financière d’un leader incontesté
WINWISE 130/136 Rue de Silly 92100 Boulogne-Billancourt www.winwise.com
4. 4
Access It IdF en quelques mots…
• Société de services, conseil / expertise, et formation,
exclusivement sur les technologies Microsoft
• 20+ collaborateurs spécialisés sur les techno MS, dont 11 MVP
• Interventions en mode :
Conseil, expertise, coaching et formation
Réalisation, au forfait ou en Assistance Technique
.NET Plateforme Applicative
Framework et langages
.Net, AZURE, Silverlight,
WPF/Surface, VS/TFS,
Windows Phone 7,…
SQL Server (SSIS, SQL,
SSAS, SSRS), PowerPivot,
SharePoint & on-line,
Office 365,…
.NET Collab.
BI
6. 6
Problématiques RIA
Couche de
présentation
Couche métier
Application cliente Service
Couche métier
Couche
d’accès aux
données
Base de
données
Coût de mise en place important
Autorisations
Accès concurrentiels
Duplication de la logique métier
7. 7
Couche de
présentation
RIA
Couche métier
Couche d’accès
aux données
Base de
données
Simplifier la communication afin que le métier devienne le centre d’intérêt.
WCF RIA Services
Côté client
Contrôles spécifiques
Contexte de donnée
« Tracking » d’objets
Côté serveur
WCF
Validations
Accès aux données
Sécurité
Notion de domaine : opérations + entités + validations
9. 9
Serveur Création du
modèle d’entité
Création du
Domain Service
Création des
requêtes
Ajout des
métadonnées
Client Utilisation du
DomainContext
Utilisation des
requêtes
générées
DataBinding SubmitChanges
Développement rapide
d’applications
Dépendance à la technologie de persistance des données
Rigidité de la structure
10. 10
Séparer les responsabilités
« Déployer des pratiques pour améliorer la productivité et la
robustesse des applications tout en restant dans des délais et
des coûts maîtrisés »
Industrialisation
12. 12
Industrialiser la persistance
Principes
Isoler la persistance dans un repository pour la découpler du service de
domaine
Accès au repository via une interface IRepository
Générique, supportant les opérations CRUD standards pour
accélérer le développement
Extensible, pour définir des opérations spécifiques supplémentaires
Un repository : LinqToEntitiesRepository<TContext> pour supporter
EntityFramework (TContext correspond au modèle)
Implémentation
de la persistance
(LinqToEntities…)
IRepositoryDomaine
Entité
Métier
Data
Source
15. 15
Industrialiser le domaine
Principes
Définir une classe de base : RepositoryDomainService pour
Accéder au IRepository depuis le domaine
Bénéficier des opérations standard (CRUD)
Valider les lots de modifications (Transaction)
Redéfinir si nécessaire les opérations dans le domaine
RepositoryDomaine
Entité
Métier
Présentation
Entité
Métier
18. 18
Industrialiser le domaine
Instanciation du service de domaine
Par défaut, le service est instanciée par RIA Services
C’est insuffisant : il faut configurer le repository à utiliser
Solution :
Extensibilité du DomainServiceFactory
Unity pour injecter le service de domaine dans RIA Services
19. Industrialiser le domaine
DomainServiceFactory
public class DomainServiceFactory : IDomainServiceFactory
{
public DomainService CreateDomainService(
Type domainServiceType, DomainServiceContext context)
{
DomainService domainService = UnityHelper.UnityContainer
.Resolve(domainServiceType) as DomainService;
domainService.Initialize(context);
return domainService;
}
Application Web Northwind (Global.asax.cs)
protected void Application_Start(object sender, EventArgs e)
{
UnityHelper.UnityContainer.RegisterType<NorthwindService>(
new InjectionProperty("Repository",
typeof(LinqToEntitiesRepository<NorthwindEntities>)));
DomainService.Factory = new DomainServiceFactory();
}
24. 24
Du service vers le client
Génération du contexte client
…
public sealed partial class
NorthwindContext : DomainContext
{
…
}
…
DomainService
DescriptionProvider
GetDescription
…
Invocation des opérations
DomaineContext.Load(EntityQuery)
DomaineContext.SubmitChanges
DomainService
Description
GetInvokeOperation
…
29. 29
Sécurité - Serveur
Classe AuthenticationBase et attribut
RequireAuthentication
Attribut RequireRole
Infrastructure ASP.NET
Intégration au processus « Query / Submit »
30. Sécurité - Serveur
RIA Services fournit un service remplissant toutes les
fonctionnalités d’authentification
Le paramétrage de la sécurité s’effectue de manière
classique dans le fichier Web.config
<roleManager enabled="true" />
<authentication mode="Forms" >
<forms name=".SimpleRIA_ASPXAUTH" />
</authentication>
...
[EnableClientAccess]
public class AuthenticationService : AuthenticationBase<User>
{ }
31. Sécurité - Serveur
Pour les opérations implémentées dans le domaine par
codage, utiliser les attributs RIA Services :
Pour les opérations CRUD standards, utiliser l’attribut
EntityDomainAttribute :
[EntityDomain(typeof(Customers),
Operations = EntityDomainOperations.All,
RequiresAuthentication = EntityDomainOperations.All,
QueryRequiresRole = new []{"StdUser"},
InsertRequiresRole = new []{"Admin"},
UpdateRequiresRole = new []{"Admin"},
DeleteRequiresRole = new []{"Admin"})
]
[RequiresAuthentication]
[RequiresRole("Admin")]
32. 32
Sécurité - Client
Classe WebAuthenticationService
Point d’entrée du processus d’authentification.
Classe FormsAuthentication et WindowsAuthentication
Processus d’authentification spécialisés.
Classe AuthenticationDomainContextBase
Accès client au service d’authentification.
Interfaces IIdentity et IPrincipal
Visibility, pattern ICommand
33. Sécurité - Client
Propriété
public bool CanDeleteCustomer
{
get
{
return this.DomainAuthService
.CanDeleteCustomer;
}
}
Command (CanExecute)
ICommand deleteCustomerCommand =
new RelayCommand<Customer>(
this.DeleteCustomer,
c => this.CanDeleteCustomer
));
Utilisation dans un ViewModel
Service dédié
public class DomainAuthService
{
public bool CanDeleteCustomer
{
get
{
return WebContext.Current.User.IsInRole("Admin");
}
}
}
34. Sécurité - Client
Gestion déclarative (pour les cas particuliers)
AuthorizationSamples (http://code.msdn.microsoft.com/RiaServices)
<Button s:Authorization.RequiresRole="Admin,CustomerManager"/>
Inclure au contexte les règles définies côté service
CodeGeneratorTextTemplate (toolkit sp1)
[DomainServiceClientCodeGenerator(typeof(CodeGenerator), "C#")]
public class CodeGenerator : CSharpClientCodeGenerator
{
protected override DomainContextGenerator DomainContextGenerator
{
get
{
return new AuthorizationCodeGenerator();
}
}
}
Génération personnalisée
du DomainContext client
42. 42
MSDN et TechNet : l’essentiel
des ressources techniques à portée de clic
http://technet.com http://msdn.com
Portail administration et
infrastructure pour
informaticiens
Portail de ressources
technique pour
développeurs
Notes de l'éditeur
Rappeler les fonctionnalités de RIA Services
Découvrir le potentiel d’extensibilité
Industrialiser une solution RIA Services
Démo lecture / édition, 0 code.
Pattern Repository
But : agir comme intermédiaire entre le domaine et la couche de persistance
Mise en œuvre : un repository par domaine, générique et extensible
Pattern Unit Of Work
But : gérer une liste d’objets affectés par une transaction métier, leur persistance et les problèmes de concurrence
Mise en œuvre : exploiter l’extensibilité du DomainService
protected virtual bool PersistChangeSet();
Pattern Dependency Injection
But : Mécanisme d’injection d’objet permettant de séparer la création de l’objet du lieu de son utilisation. Il existe trois types d’injection : via le constructeur, via un champ/propriété, via une interface
Mise en œuvre : Framework Unity
Injecter le service de domaine dans RIA Services
Côté client
Injecté le contexte RIA dans les services applicatifs
Pattern : Unit Testing
But : améliorer la qualité du code en écrivant un test par fonctionnalité
Mise en œuvre :
Microsoft Visual Studio Unit Testing
Unit Test for Silverlight (Silverlight toolkit)
Pattern MVVM
But : Séparer l’interface, la logique métier et les données
Mise en œuvre :
La view définit le layout, elle consomme les données et opérations exposées par le ViewModel. Le ViewModel référence les données (Model).
Pattern : Unit Testing
But : améliorer la qualité du code en écrivant un test par fonctionnalité
Mise en œuvre :
Microsoft Visual Studio Unit Testing
Unit Test for Silverlight (Silverlight toolkit…?)
AOP (Aspect-Oriented Programming)
Déjà utilisé par RIA Services pour :
La sécurité, la validation, …
Mise en œuvre :
Les opérations du service de domaine, …
Comparatif avec RAD et Repository
Evoquer POCO
A l’initialisation, RIA Services :
Identifie les services de domaine en inspectant les types possédant l’attribut DomainServiceDescriptionProviderAttribute
Appelle la méthode CreateProvider() sur l’attribut pour obtenir un fournisseur de description du service, de type : DomainServiceDescriptionProvider
Appelle la méthode CreateDescription() sur le fournisseur pour obtenir la description du service, de type DomainServiceDescription
Récupère les informations de la description :
Les entités du modèle, de type Type
Les opérations, de type DomainOperationEntry
Rend accessible en WCF les opérations et entités
RIA Services possède un très bon niveau d’extensibilité, les classes :
DomainServiceDescriptionProviderAttribute
DomainServiceDescriptionProvider
DomainOperationEntry
… sont destinées à être héritées !
RIA Services possède sa propre représentation du modèle et des opérations du domaine, cette indépendance permet tout type d’implémentation
Nous avons exploité cette extensibilité pour adapter l’implémentation EntityFramework de Microsoft en ajoutant le support du repository
WebContextBase : contexte de l’application
WebAuthenticationService : contient une référence vers le DomainContext d’authentification
AuthenticationDomainContextBase : classe de base des fournisseurs d’authenfication
Forte dépendance aux règles définies côté serveur
Les restrictions clientes sont souvent dirigées par les règles définies sur les opérations côté service.