5

シナリオ

.NET/WPF デスクトップ アプリケーションは、英語とは異なる言語にローカライズ (MS 用語ではglobalized ) する必要があります。つまり、UI を完全に採用する必要があります (ラベル、アイコンなど)。

ただし、ログ ファイル エントリ、監査証跡エントリ、およびアプリケーションのその他の出力は、英語を話すサービス/サポート担当者がレビューできるように、英語のままにしておく必要があります。彼らはフランス語も中国語も話せません。

アプリケーションは、ローカリゼーションを実行するために RESX ファイルに依存しています。

Enterprise Library Validation Block は、オブジェクト モデルのビジネス ルールの検証に使用されます。

ここで、実際のビジネス ロジックを実行する前に、指定されたオブジェクト モデルの引数を検証するサービスがあるとします。状況によっては、無効なオブジェクト モデル引数を受け取りますが、ベスト エフォートで実行を続行します。ただし、無効なオブジェクト モデル データの提供は、監査証跡とログ ファイルに記録する必要があります。

検証ブロックを使用したサービスの例。

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

コードのコメントで述べたように、EnterpriseLibrary バリデーターで Validate() を呼び出した場合、検証メッセージは既にフランス語にローカライズされており、英語のログ ファイルなどに書き込む機会がありません。

アプリケーションの他の領域では、実際の文字列値を解決するために使用するカルチャが特定されるまで、リソース ID とパラメーターをカプセル化するメッセージ クラスを使用します。延期されたリソース解決と呼ぶことができます。

Enterprise Library Validation ブロックに同様のメカニズムを導入する方法はありますか? これまでのアイデア:

  • CurrentCulture を一時的に切り替える (私はそれが気に入らず、問題の半分しか解決しません)
  • Enterprise Library Validation Block にパッチを適用します (これも好きではありません)。

ご協力いただき、アイデアを共有していただきありがとうございます。

4

1 に答える 1

4

遅延リソース解決の要件があった場合、を使用することをやめMessageTemplateResourceName、代わりにリソースIDをMessageTemplateプロパティとして配置しました。次に、後でそのIDを使用して、現在のカルチャを使用してリソース文字列値を検索します。

idの命名規則を次のように標準化しましたRULESET_RULESETQUALIFIER_OPERATION_OBJECT_PROPERTY_VALIDATIONTYPE。例RULESET_BMW_INSERT_CAR_YEAR_RANGEまたはRULESET_BMW_UPDATE_CAR_COLOR_LENGTHなど。

VAB構成では、これは次のようになります。

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

主な欠点は、メッセージテンプレートトークンを簡単に使用してメッセージをわずかに動的にする機能が失われることです。これは実現できますが、後でメッセージ文字列が評価されるときにトークン値を置き換えることができるように、トークン値をどこかに格納する必要があります(メッセージクラスなど)。

また、メッセージの対象となるオーディエンスごとに複数のリソースファイルを作成することを検討することもできます。つまり、1つのリソースはユーザーメッセージ用で、もう1つは技術メッセージ用です。したがって、ユーザーメッセージ用にUserMessages.resources、UserMessages.fr-BE.resourcesを使用できます。次に、別のリソースファイルで、ロギング用の異なるメッセージ(LogMessages.resources)を使用してIDを複製します。そうすれば、ログメッセージの追加の技術情報を入手できます。しかし、これはやり過ぎかもしれません。

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


これを抽象化してヘルパークラスにするか、メッセージクラスに追加することができます。また、ValidationResultsを抽出し、必要な情報を使用してメッセージクラスを作成するために、いくつかのコードを作成する必要がある場合があります。

于 2010-08-08T06:25:39.483 に答える