域模型验证消息本地化 - .NET

时间:2013-05-28 18:50:54

标签: .net validation domain-driven-design

在域模型中,当您拥有一个实现Validate方法的模型类时,在此方法中,您将BrokenRules添加为BusinessRule对象,并且所有这些对象都具有属性和规则消息,本地化这些消息的最佳方法是什么?

4 个答案:

答案 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文件,并使用它们将异常和其他业务消息等消息存储回客户端

希望这会对你有所帮助。 干杯