在域模型中,当您拥有一个实现Validate方法的模型类时,在此方法中,您将BrokenRules添加为BusinessRule对象,并且所有这些对象都具有属性和规则消息,本地化这些消息的最佳方法是什么?
答案 0 :(得分:2)
在我看来,本地化属于UI。您甚至有这个问题的事实可能表明您overgeneralized您的模型并引入了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?
...
}
答案 1 :(得分:1)
破坏规则/实体验证
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文件周围创建自己的静态包装器。
答案 2 :(得分:0)
您遇到的问题是您的域代码可能无法在UI附近运行。话虽这么说,如果代码 在服务器上运行(例如消息总线端点),那么任何异常都会成为业务流程的一部分。
对于所做的任何事情运行前端语言的知识,我会建议资源文件。它们确实是最简单的。
除了可能需要特定的例外或某些编码/查询系统之外,
答案 3 :(得分:0)
您绝对可以在域中拥有邮件。但它们应该是特定于域的,并告诉客户什么是错的或什么是无效的(通常是回复给客户的错误和验证消息)。 看看那里最好的DDD示例之一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文件,并使用它们将异常和其他业务消息等消息存储回客户端
希望这会对你有所帮助。 干杯