5

SzenarioEnterprise Library Validation Application Block und Internationalisierung

Eine .NET/WPF Desktop-Anwendung sollte auf eine andere Sprache als Englisch lokalisiert (globalisierten oder in MS Begriffe) werden. Das heißt, die Benutzeroberfläche muss vollständig übernommen werden (Etiketten, Symbole, ...).

Protokolldateieinträge, Audit-Trail-Einträge und andere Ausgaben der Anwendung sollten jedoch in Englisch bleiben, damit der englischsprachige Service/das Support-Personal sie überprüfen kann. Sie sprechen kein Französisch oder Chinesisch.

Die Anwendung stützt sich auf RESX-Dateien für die Durchführung der Lokalisierung.

Der Enterprise Library Validation Block wird für die Validierung von Geschäftsregeln für das Objektmodell verwendet.

Angenommen, es gibt einen Dienst, der die angegebenen Argumente des Objektmodells validiert, bevor die echte Geschäftslogik ausgeführt wird. Unter bestimmten Umständen erhält es ungültige Objektmodellargumente, setzt die Ausführung jedoch mit bestem Aufwand fort. Die Bereitstellung ungültiger Objektmodelldaten sollte jedoch im Prüfprotokoll und in der Protokolldatei protokolliert werden.

Beispiel für einen Dienst, der den Validierungsblock verwendet.

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); 
     } 
    } 
} 

Wie im Code Kommentar angegeben, wenn Sie Validate() auf dem EnterpriseLibrary Validator aufgerufen haben, werden die Validierungsmeldungen bereits auf Französisch lokalisiert und Sie haben keine Chance, sie ein Beispiel zu schreiben Englische Protokolldatei

In anderen Bereichen unserer Anwendung verwenden wir eine Nachrichtenklasse, die die Ressourcen-ID und die Parameter kapselt, bis wir sicher sind, welche Kultur wir verwenden wollen, um den tatsächlichen Zeichenfolgenwert aufzulösen. Sie könnten es eine verzögerte Ressourcenauflösung nennen.

Haben Sie Ideen, wie Sie einen ähnlichen Mechanismus in den Enterprise Library Validation Block einführen können? Ideen so weit:

  • Umschalten der Current vorübergehend (ich mag das nicht und es löst nur die Hälfte des Problems)
  • Patch der Enterprise Library Validation-Block (ich weiß nicht, wie das auch)

Vielen Dank für Ihre Hilfe und Ihre Ideen!

Antwort

4

Als wir eine Anforderung für eine verzögerte Ressourcenauflösung hatten, haben wir die Verwendung der MessageTemplateResourceName aufgegeben und stattdessen unsere Ressourcen-ID als MessageTemplate Eigenschaft angegeben. Wir verwenden diese ID später, um den Ressourcenzeichenfolgenwert unter Verwendung der aktuellen Kultur nachzuschlagen.

Wir standardisierten die Namenskonvention für die ID etwa so: RULESET_RULESETQUALIFIER_OPERATION_OBJECT_PROPERTY_VALIDATIONTYPE. z.B. RULESET_BMW_INSERT_CAR_YEAR_RANGE oder RULESET_BMW_UPDATE_CAR_COLOR_LENGTH usw.

In der VAB Konfiguration dies etwas aussehen würde:

<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> 

Der größte Nachteil ist, dass Sie verlieren die Fähigkeit, auf einfache Weise verwenden, um die Nachrichtenvorlage Token die Nachricht leicht dynamisch zu machen. Dies könnte erreicht werden, aber die Token-Werte müssten irgendwo gespeichert werden (z.B.Sie Nachrichtenklasse), damit sie später bei der Auswertung der Nachrichtenzeichenfolge ersetzt werden können.

Sie sollten auch in Erwägung ziehen, mehrere Ressourcendateien für jede der Zielgruppen zu erstellen, auf die die Nachrichten ausgerichtet sind. Das heißt, eine Ressource für Benutzernachrichten und eine für technische Nachrichten. So könnten Sie UserMessages.resources, UserMessages.fr-BE.resources für die Benutzermeldungen haben. Dann duplizieren Sie in einer anderen Ressourcendatei die IDs mit verschiedenen Meldungen für die Protokollierung (LogMessages.resources). Auf diese Weise können Sie zusätzliche technische Informationen für die Protokollnachricht erhalten. Dies könnte jedoch zu viel werden.

Wir greifen dann die String-Werte der ResourceManager mit:

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")); 


Sie könnten abstrakt diese weg in eine Hilfsklasse oder fügen Sie es Ihrer Nachrichtenklasse. Möglicherweise müssen Sie auch Code erstellen, um die ValidationResults zu extrahieren und Nachrichtenklassen mit den benötigten Informationen zu erstellen.

+0

Vielen Dank für Ihre Eingabe Tuzo! Der erwähnte Nachteil ist ein großer Nachteil für uns - wir brauchen definitiv dynamisch komponierte Nachrichten. Wir ändern derzeit die Implementierung des EntLib-Validierungsblocks so, dass sie vollständig mit unserer Nachrichtenklasse statt mit strikt aufgelösten Strings arbeitet. Eine ziemlich umständliche Aufgabe, aber am Ende haben wir einen einzigen Ansatz in unserer Anwendung. Ein großer Nachteil ist die Wartung, aber der Validierungsblock ist in den neuesten Versionen ziemlich stabil geblieben. –

Verwandte Themen