0

ドメイン モデルで、Validate メソッドを実装するモデル クラスがあり、このメソッドで BrokenRules を BusinessRule オブジェクトとして追加し、それらすべてにプロパティとルール メッセージがある場合、これらのメッセージをローカライズする最善の方法は何ですか?

4

4 に答える 4

2

私の意見では、ローカリゼーションは UI に属します。この質問があるという事実は、モデルを過度に一般化し、Validate や BusinessRule などの概念を導入したことを示している可能性があります。そして今、プレゼンテーションはあなたのドメインコードに「ブリード」します。ユビキタス言語を使用した場合、コードは次のようになります

bool isDelinquent = order.IsDelinquent();

ユーザーフレンドリーでローカライズされたメッセージなどのUIの問題について、ドメインが明らかに責任を負わない場合。代わりに、おそらく次のようなものがあります。

List<BusinessRule> brokenRules = order.Validate(){ 
    ...
    brokenRule = new BusinessRule("Sorry this is order is delinquent");
    // what if I want this message in Italian?
    // would this even fit into error text box?
    // should delinquency unit test rely on 'magic string' error message?
    ...
}
于 2013-05-28T20:17:10.703 に答える
2

ルール違反/エンティティの検証

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        var validationResults = new List<ValidationResult>();

        //-->Check first name property
        if (String.IsNullOrWhiteSpace(this.FirstName))
        {
            validationResults.Add(new ValidationResult(Messages.validation_CustomerFirstNameCannotBeNull, 
                                                       new string[] { "FirstName" }));
        }

        //-->Check last name property
        if (String.IsNullOrWhiteSpace(this.LastName))
        {
            validationResults.Add(new ValidationResult(Messages.validation_CustomerLastNameCannotBeBull,
                                                       new string[] { "LastName" }));
        }


        return validationResults;
    }

エンティティに IValidatableObject を実装させることができます。それは System.ComponentModel.DataAnnotations の一部です。それでも、resx ファイルをこのように使用できることがわかります。または、アプリケーションの起動時に読み取った xml ファイルの周りに独自の静的ラッパーを作成するだけです。

于 2013-05-29T12:49:22.560 に答える
0

ドメインには絶対にメッセージを入れることができます。ただし、それらはドメイン固有のものであり、何が間違っているか、何が無効であるかをクライアントに伝える必要があります (通常、クライアントに返されるエラーと検証メッセージです)。そこにある最高のDDDの例の1つを見てください http://msdn.microsoft.com/es-es/architecture/gg189193

次のようなドメインでメッセージを使用します。

 throw new InvalidOperationException(Messages.exception_BankAccountCannotDeposit);

また

originAccount.WithdrawMoney(amount, string.Format(Messages.messages_TransactionFromMessage, destinationAccount.Id));

ご覧のとおり、Domain プロジェクト内で resx ファイルを使用し、それらを使用して、例外やその他のビジネス メッセージなどのメッセージをクライアントに戻すことができます。

これがお役に立てば幸いです。乾杯

于 2013-05-29T12:44:17.597 に答える
0

これに関する問題は、ドメイン コードが UI の近くで実行されていない可能性があることです。つまり、コードサーバー (メッセージ バス エンドポイントなど) で実行されている場合、例外はすべてビジネス プロセスの一部になります。

フロントエンド言語の知識があれば実行できるものについては、リソース ファイルをお勧めします。彼らは本当に最も単純になるでしょう。

その特定の例外またはいくつかのコーディング/ルックアップシステムがおそらく必要になる以外に、

于 2013-05-29T05:02:17.650 に答える