2013-05-28 46 views
0

在域模型,当你有一个实现验证方法和模型类在这个方法要添加BrokenRules为BusinessRule对象和他们都有一个属性和规则的消息,是什么是本地化这些消息的最佳方式?领域模型的验证消息本地化 - .NET

回答

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

在我看来本地化属于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? 
    ... 
} 
+0

是的,这正是我。我很惊讶这种方法在许多书中被提到,称为DDD。我现在没有时间阅读埃文斯先生的书,但我肯定会。你是否知道.NET中的任何示例项目都能正确实现这些概念?谢谢 – elector

+0

我会接受这个作为一个答案,如果你能描述一个非常非常简单的解决方案...谢谢你。 – elector

+1

解决方案是在UI层中保留所有的演示问题(包括显示给用户的消息)。我的主要观点是,如果您不让域对象进入“无效”状态,问题可能会消失。问题是'无效'这个词是非常普遍的,并且与情境有关。我知道这听起来令人困惑,但你应该尝试用域不变量和无处不在的语言来思考。 http://codebetter.com/gregyoung/2009/05/22/always-valid/ – Dmitry

0

您遇到的问题是您的域代码可能不会在用户界面附近运行。这就是说,如果代码是一个服务器(例如消息总线端点)上运行则任何异常成为业务过程的一部分。

对于所做的任何事情运行前端语言的知识我会建议资源文件。他们真的会是最简单的。

除此之外特定的异常或某些编码/检索系统可能会被要求,

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

正如你可以看到你可以域项目中使用的resx文件并利用它们像异常和其他业务信息存储邮件回客户端

希望这有助于你。 干杯

+0

... sry忘记了破碎的规则部分。你可以这样做:在下面我的第二个答案 –