5

ScenarioEnterprise Library Validation Application Block e Internazionalizzazione

un'applicazione desktop .NET/WPF dovrebbe essere localizzato (o in termini MS globalizzato) ad una lingua diversa da quella inglese. Cioè, l'interfaccia utente deve essere completamente adottata (etichette, icone, ...).

Le voci del file di registro, le voci della traccia di controllo e altri output dell'applicazione, tuttavia, devono rimanere in inglese per consentire al personale di assistenza/supporto di lingua inglese di esaminarlo. Non parlano francese o cinese.

L'applicazione si basa su file RESX per realizzare la localizzazione.

Il blocco di convalida della libreria aziendale viene utilizzato per la convalida delle regole aziendali sul modello a oggetti.

Supponiamo ora che esista un servizio che convalida gli argomenti del modello oggetto specificato prima dell'esecuzione della reale logica aziendale. In alcune circostanze riceve argomenti modello oggetto non validi, ma continua l'esecuzione con il massimo sforzo. La fornitura di dati del modello di oggetto non valido, tuttavia, deve essere registrata nella traccia di controllo e nel file di registro.

Esempio di un servizio che utilizza il blocco di convalida.

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

Come indicato nel codice commento, quando hai chiamato validate() sul validatore EnterpriseLibrary, i messaggi di validazione sono già localizzato a Francese e non hai la possibilità di scriverli ad un esempio File di registro inglese.

In altre aree della nostra applicazione usiamo una classe di messaggio che incapsula l'id della risorsa e i parametri fino a quando non siamo certi di quale cultura vogliamo utilizzare la risoluzione del valore di stringa effettivo. Potresti chiamarlo una risoluzione di risorsa differita.

Qualche idea su come introdurre un meccanismo simile al blocco di convalida della libreria aziendale? Idee finora:

  • commutazione della CurrentCulture temporaneamente (non mi piace quello e si risolve solo metà del problema)
  • Patch l'Enterprise Library Validation Block (non mi piace anche quello)

Grazie per il vostro aiuto e idee condivise!

risposta

4

Quando avevamo un requisito per la risoluzione delle risorse posticipata, abbiamo abbandonato utilizzando lo MessageTemplateResourceName e invece abbiamo inserito il nostro ID risorsa come proprietà MessageTemplate. Successivamente, utilizzeremo quell'id in seguito per cercare il valore della stringa di risorse utilizzando la cultura corrente.

Abbiamo standardizzato la convenzione di denominazione per l'id qualcosa del genere: RULESET_RULESETQUALIFIER_OPERATION_OBJECT_PROPERTY_VALIDATIONTYPE. per esempio. RULESET_BMW_INSERT_CAR_YEAR_RANGE o RULESET_BMW_UPDATE_CAR_COLOR_LENGTH ecc

Nella configurazione VAB questo sarebbe un aspetto simile:

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

Il principale svantaggio è che si perde la capacità di utilizzare facilmente i gettoni modello di messaggio per rendere il messaggio un po 'dinamica. Questo potrebbe essere ottenuto ma i valori dei token dovrebbero essere memorizzati da qualche parte (ad es.classe del messaggio) in modo che possano essere sostituiti successivamente quando viene valutata la stringa del messaggio.

Si consiglia inoltre di prendere in considerazione la creazione di più file di risorse per ciascuno dei segmenti di pubblico a cui sono destinati i messaggi. Cioè, una risorsa per i messaggi degli utenti e una per i messaggi tecnici. Quindi potresti avere UserMessages.resources, UserMessages.fr-BE.resources per i messaggi dell'utente. Quindi in un altro file di risorse duplicare gli ID con messaggi diversi per la registrazione (LogMessages.resources). In questo modo potresti avere informazioni tecniche aggiuntive per il messaggio di log. Questo potrebbe essere eccessivo però.

Abbiamo poi accedere ai valori di stringa utilizzando il 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")); 


Si potrebbe abstract questa via in una classe di supporto o aggiungerlo alla classe messaggio. Potrebbe anche essere necessario creare del codice per estrarre i ValidationResults e creare classi di messaggi con le informazioni richieste.

+0

Grazie mille per il tuo contributo Tuzo! Lo svantaggio menzionato è un grosso svantaggio per noi: abbiamo sicuramente bisogno di messaggi composti dinamicamente. Al momento stiamo modificando l'implementazione del blocco di convalida EntLib per funzionare completamente con la nostra classe di messaggi anziché con stringhe risolte in modo avido. Un compito piuttosto ingombrante ma alla fine abbiamo un unico approccio in tutta la nostra applicazione. Il lato negativo è la manutenzione, ma il blocco di validazione è rimasto piuttosto stabile nei suoi concetti chiave nelle ultime versioni. –

Problemi correlati