5

ScénarioEnterprise Library Validation bloc d'application et Internationalisation

Une application de bureau .NET/WPF doit être localisée (ou en termes MS globalisée) à une autre langue que l'anglais. Autrement dit, l'interface utilisateur doit être complètement adoptée (étiquettes, icônes, ...).

Les entrées de fichier journal, les entrées de piste d'audit et les autres sorties de l'application doivent cependant rester en anglais pour permettre au personnel de service/d'assistance anglophone de l'examiner. Ils ne parlent ni français ni chinois.

L'application s'appuie sur des fichiers RESX pour effectuer la localisation.

Le bloc de validation de la bibliothèque d'entreprise est utilisé pour la validation des règles métier sur le modèle d'objet. Supposons maintenant qu'il existe un service qui valide ses arguments de modèle objet donnés avant d'exécuter la logique métier réelle. Dans certaines circonstances, il reçoit des arguments de modèle d'objet incorrects mais continue l'exécution avec le meilleur effort. La fourniture de données de modèle d'objet non valide, cependant, doit être enregistrée dans la piste d'audit et dans le fichier journal.

Exemple de service utilisant le bloc de validation.

public class Service : IService 
{ 
    public void MyMethod(MyObjectModelObject obj) 
    { 
     Validator validator = ValidationFactory.CreateValidator(typeof(MyObjectModelObject)); 
     ValidationResults results = validator.Validate(this); 

     // !!! The messages in the validation results are now already localized to CurrentCulture. 

     // ... build a log message: msg 
     if (results.Count > 0) 
     { 
      Logger.Log(msg); 
     } 
    } 
} 

Comme indiqué dans le commentaire de code, lorsque vous avez appelé Valider() sur le validateur EnterpriseLibrary, les messages de validation sont déjà localisés en français et vous avez aucune chance de les écrire à un exemple Fichier journal anglais.

Dans d'autres domaines de notre application, nous utilisons une classe de message qui encapsule l'ID de ressource et les paramètres jusqu'à ce que nous soyons certains de la culture que nous voulons utiliser pour résoudre la valeur de chaîne réelle. Vous pourriez l'appeler une résolution de ressource différée.

Des idées pour introduire un mécanisme similaire au bloc Enterprise Library Validation? Idées à ce jour:

  • Commutation du CurrentCulture temporairement (je ne sais pas comme ça et il ne résout que la moitié du problème)
  • Patch du bloc de validation Enterprise Library (je ne sais pas comme ça aussi)

Merci pour votre aide et vos idées partagées!

Répondre

4

Lorsque nous avions besoin d'une résolution de ressource différée, nous avons abandonné en utilisant le MessageTemplateResourceName et avons plutôt mis notre identifiant de ressource en tant que propriété MessageTemplate. Nous utilisons ensuite cet identifiant pour rechercher la valeur de la chaîne de ressources en utilisant la culture actuelle.

Nous avons standardisé la convention de dénomination pour l'ID quelque chose comme ceci: RULESET_RULESETQUALIFIER_OPERATION_OBJECT_PROPERTY_VALIDATIONTYPE. par exemple. RULESET_BMW_INSERT_CAR_YEAR_RANGE ou RULESET_BMW_UPDATE_CAR_COLOR_LENGTH etc.

Dans la configuration VAB cela ressemblerait à quelque chose comme:

<property name="Color"> 
    <validator lowerBound="0" lowerBoundType="Ignore" upperBound="50" 
    upperBoundType="Inclusive" negated="false" messageTemplate="RULESET_BMW_INSERT_CAR_COLOR_LENGTH" 
    messageTemplateResourceName="" messageTemplateResourceType="" 
    tag="" type="Microsoft.Practices.EnterpriseLibrary.Validation.Validators.StringLengthValidator, Microsoft.Practices.EnterpriseLibrary.Validation, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
    name="String Length Validator" /> 
        </property> 

L'inconvénient majeur est que vous perdez la possibilité d'utiliser facilement les jetons de modèle de message pour rendre le message un peu dynamique. Ceci pourrait être accompli mais les valeurs de jeton devraient être stockées quelque part (par ex.vous classe de message) de sorte qu'ils pourraient être substitués plus tard quand la chaîne de message est évaluée.

Vous pouvez également envisager de créer plusieurs fichiers de ressources pour chacun des publics ciblés par les messages. C'est-à-dire, une ressource pour les messages utilisateur et une pour les messages techniques. Vous pouvez donc avoir UserMessages.resources, UserMessages.fr-BE.resources pour les messages utilisateur. Ensuite, dans un autre fichier de ressources, dupliquez les identifiants avec différents messages pour la consignation (LogMessages.resources). De cette façon, vous pourriez avoir des informations techniques supplémentaires pour le message de journal. Cela pourrait être exagéré cependant.

Nous accédons ensuite les valeurs de chaîne en utilisant la ResourceManager:

ResourceManager userResourceManager = 
    new ResourceManager("UserMessages", Assembly.GetExecutingAssembly()); 

string userMessage = userResourceManager.GetString(resourceId); 

ResourceManager logResourceManager = 
    new ResourceManager("LogMessages", Assembly.GetExecutingAssembly()); 

// Can also try to use InvariantCulture instead of "en" 
string messageToLog = logResourceManager.GetString(resourceId, new CultureInfo("en")); 
//alternative to ensure you get the english user message value: 
// string messageToLog = userResourceManager.GetString(resourceId, new CultureInfo("en")); 


Vous pouvez abstrait cette distance dans une classe d'aide ou l'ajouter à votre classe de message. Vous devrez peut-être également créer du code pour extraire le ValidationResults et créer des classes de message avec les informations dont vous avez besoin.

+0

Merci beaucoup pour votre contribution Tuzo! L'inconvénient mentionné est un gros inconvénient pour nous - nous avons absolument besoin de messages composés dynamiquement. Nous sommes en train de modifier l'implémentation du bloc de validation EntLib pour qu'il fonctionne complètement avec notre classe de message au lieu de chaînes résolues avec impatience. Une tâche plutôt lourde mais à la fin nous avons une approche unique tout au long de notre application. Le gros inconvénient est la maintenance, mais le bloc de validation a été assez stable à ses concepts de base dans les dernières versions. –

Questions connexes