ドメイン モデルで、Validate メソッドを実装するモデル クラスがあり、このメソッドで BrokenRules を BusinessRule オブジェクトとして追加し、それらすべてにプロパティとルール メッセージがある場合、これらのメッセージをローカライズする最善の方法は何ですか?
4 に答える
私の意見では、ローカリゼーションは 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?
...
}
ルール違反/エンティティの検証
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 ファイルの周りに独自の静的ラッパーを作成するだけです。
ドメインには絶対にメッセージを入れることができます。ただし、それらはドメイン固有のものであり、何が間違っているか、何が無効であるかをクライアントに伝える必要があります (通常、クライアントに返されるエラーと検証メッセージです)。そこにある最高の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 ファイルを使用し、それらを使用して、例外やその他のビジネス メッセージなどのメッセージをクライアントに戻すことができます。
これがお役に立てば幸いです。乾杯
これに関する問題は、ドメイン コードが UI の近くで実行されていない可能性があることです。つまり、コードがサーバー (メッセージ バス エンドポイントなど) で実行されている場合、例外はすべてビジネス プロセスの一部になります。
フロントエンド言語の知識があれば実行できるものについては、リソース ファイルをお勧めします。彼らは本当に最も単純になるでしょう。
その特定の例外またはいくつかのコーディング/ルックアップシステムがおそらく必要になる以外に、