2013-05-28 94 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忘記了破碎的規則部分。你可以這樣做:在下面我的第二個答案 –