簡體   English   中英

數據或域層的規則驗證?

[英]Rules Validation on Data or Domain layer?

我一直在閱讀Pro ASP.NET MVC框架,Steven Sanderson,在第11章中討論了數據驗證。

在頁390,我們看到將驗證邏輯移動到您的模型層一節 在本節中,我們將在第392頁中看到一些代碼,說明如何實現驗證。

該代碼實現了一個GetRuleViolations()方法,如果某些東西不正常, Save()方法會使用它來拋出RuleException

然而,在我看來, 域層和數據訪問層之間沒有區別 ,這里是代碼:

public void Save() {
    var errors = GetRuleViolations();
    if (errors.Count > 0)
        throw new RuleException(errors);

    // Todo: Now actually save to the database or whatever
}
private NameValueCollection GetRuleViolations() {
    // validations...
}

在我正在工作的項目中,我有一個Domain層 ,盡可能使用持久性,以及數據訪問層 ,通過NHibernate實現數據訪問,並實現在Domain層中定義接口的存儲庫。

如果我按照作者在此提出的那樣實現驗證規則,那么在“ Save() ”方法中,它們將繼續我的數據訪問層,但至少我認為它們應該駐留在域模型上!

所以,我的問題是 :在創建分層應用程序時 ,使用域層實現域實體並將接口暴露給存儲庫(持久性無知), 數據訪問層從域層實現存儲庫並實現所有數據訪問代碼, 其中驗證規則應該存在嗎?

我的主要(或至少是第一個 )接口將是ASP.NET MVC應用程序,如果這可能會改變任何東西。

謝謝。

在MVC架構中,M(模型) 包括域層數據訪問層 所以桑德森的例子並沒有錯。

也就是說,當您使用這兩個層(而不是只有一個)實現域模型時,驗證邏輯應該轉到域層以增加域對象的內聚力,並避免驗證邏輯在許多地方重復(例如,在每個具體的地方)庫)。

它們肯定屬於您的域層 (您可以在其中實現IDataErrorInfo ,但這只對我認為的Windows窗體或WPF應用程序有用)。

看起來這種驗證理念與Paul Stovell所揭示的非常相似(查看他的這篇文章 )。 它非常強大,我經常使用它。 基本上:

  1. 擁有無效的業務對象沒有任何問題,只要您不嘗試持久化它。
  2. 應該可以從業務對象中檢索任何和所有損壞的規則,以便數據綁定以及您自己的代碼可以查看是否存在錯誤並適當地處理它們。

因此,由於您的域層持久性很重要,我相信您的實體至少應該知道它們何時被持久化。 Save方法是一種讓它們負責自己的持久性的方法(它們隨后可以委托給數據訪問層 )。 我看不出有什么不妥。

我通常優先選擇有效的域對象。 只能通過防止對象變為無效的方法來更改域對象。

另一方面,表示對象可以包含臨時無效值或無法正確解析的值。 但是,當數據有效時,方法調用將僅由表示層發布給域對象。

域對象強制執行不變量,表示對象向用戶指示應如何修改其輸入以尊重約束。

驗證應在您的域層中完成。 您的業​​務邏輯是域的一部分,而不是數據訪問。 驗證可能不在域對象本身(實際類)內部完成,但它應該位於域層內。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM