Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Abonnements

Comment WAQS vous propose d’exprimer vos règles métier ? 5/13

Posts précédents sur WAQS :

WAQS : Introduction

Comment utiliser WAQS?

Comment WAQS vous propose d’exprimer vos règles métier ? 1/13

Comment WAQS vous propose d’exprimer vos règles métier ? 2/13

Comment WAQS vous propose d’exprimer vos règles métier ? 3/13

Comment WAQS vous propose d’exprimer vos règles métier ? 4/13

 

Définition de metadata

Les metadata de l’edmx sont souvent insuffisantes : pas de MinValue, pas de MaxValue, pas de MinLength, pas de Pattern, encore moins de gestion dynamique des metadata.

Dans les spécifications, il est possible d’y remédier en définissant des méthodes pour définir ces metadata.

Pour cela, il suffit d’utiliser des méthodes statiques commençant par Define, sans paramètre et sans type de retour.

public static void DefineOrderDetailMetadata()
{
    Metadata<OrderDetail>.DefineMinValue(od => od.Discount, 0);
    Metadata<OrderDetail>.DefineMaxValue(od => od.Discount, 1);
}

Il est possible de définir des metadata statiques comme précédemment mais également dynamiques comme ceci :

public static void DefineCustomerMetadata()
{
    Metadata<Customer>.DefinePattern(c => c.PostalCode, c => c.Country != null && 
      c.Country.ToUpper() == "FRANCE" ? @"^(\d{2}|(2(A|B)))\d{3}$" : null);
    Metadata<Customer>.IsNullable(c => c.City, c => c.PostalCode == null);
}

WAQS génèrera du code pour la validation des données basées sur ces metadata et sur celles de l’edmx.

La méthode SaveChanges (générée par WAQS) vérifiera les règles métiers avant de persister les modifications dans la base (je vous expliquerai comment ça marche dans un futur post).

Côté client, la validation des metadata est également mise en place par WAQS. Il y a deux façons de les utiliser avec WPF et une avec un projet PCL.

WPF

La première façon consiste à utiliser les DataErrorInfo. WAQS génère la logique des DataErrorInfo. Dès lors, dans votre binding, vous pouvez simplement affecter ValidatesOnDataErrors à true.

<TextBox Text="{Binding OrderDetail.Discount, ValidatesOnDataErrors=true}" />

Si ce que vous tapez dans la TextBox ne correspond pas, le bord du contrôle apparaitra en rouge (par défaut).

Cependant, je ne trouve pas ni le principe du DataErrorInfo ni celui du NotifyDataErrorInfo (pour WPF 4.5 seulement mais non généré par WAQS aujourd’hui) suffisant. En effet, il n’est pas prévu pour avoir plusieurs erreurs et encore moins pour merger des erreurs de criticité différente.

Pour cela WAQS propose son propre fonctionnement à savoir utiliser une collection d’erreurs pour chaque propriété scalaire de l’entité.

WAQS pour WPF définit cette collection en tant que PropertyDescriptor sur le type d’entité (ce qui est mieux pour l’expérience développeur IMO) et WAQS génère également un behavior pour afficher les erreurs.

Dans notre exemple, vous pouvez utiliser le XAML suivant :

<TextBox Text="{Binding OrderDetail.Discount}"
         controls:ErrorsBehaviors.Errors="{Binding OrderDetail.DiscountErrors}" />

De cette façon, la bordure du TextBox prendra la couleur de l’erreur la plus importante (rouge en cas d’erreur, orange pour un warning) avec un tooltip permettant d’afficher les différentes erreurs :

image

A noter que, comme très souvent avec WAQS, une méthode partielle dans la classe ErrorsBehaviors permet de changer le style du contrôle.

static partial void SetControlStyle(Control control, ObservableCollection<Error> errors, Criticity maxCriticity, 
ref bool done);

Il est également possible d’utiliser les metadatas dans le binding (comme MaxLength pour empêcher toute saisie trop longue) :

<TextBox Text="{Binding Customer.CompanyName}" MaxLength="{Binding Customer.CompanyNameMaxLength}" />

PCL

Avec les PCL, on n’a pas de PropertyDescriptors. Donc WAQS génère simplement des propriétés (DiscountErrors sur OrderDetail et CompanyNameMaxLength sur Customer dans notre exemple).

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Publié vendredi 20 décembre 2013 14:03 par Matthieu MEZIL

Commentaires

Pas de commentaires

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01