如何保持驗證 DRY?
使用這種方法在 MVC 中查看模型:http ://www.lostechies.com/blogs/jimmy_bogard/archive/2009/06/29/how-we-do-mvc-view-models.aspx
在我的腦海中留下一個懸而未決的問題。所以現在是我清理它的時候了。
如果我使用自動映射器將域屬性映射到 dto,那麼當 dto 映射到保存的域實體時,我的域層可以返回一組驗證規則。
但是,我沒有看到讓客戶端驗證正常工作並將錯誤添加到模型狀態的DRY方法,因此它們對應於視圖模型上的正確屬性。
乾杯
我發現了一個相關的問題,有一些有趣的回答:
我一直在考慮這個問題,在某種程度上它類似於我們在伺服器端和客戶端驗證中遇到的情況。(例如同時使用 NHibernate Validator 和 jQuery.validate)。
如今,您應該擁有一整套伺服器端驗證已廣為接受,並且添加客戶端驗證是您可以選擇的一個選項,以使您的應用程序更加使用者友好。過去,您必須手動實施客戶端驗證,但由於可用性方面的好處,您接受了重複工作。
我認為我們在這里處理的內容非常相似。您應該在域層中進行驗證。您不能依賴消費應用程序總是自己添加驗證。
然後,您可以在應用程序中選擇在 DTO/視圖模型上添加驗證。您這樣做是因為處理視圖中的驗證錯誤比讓它們進入可能引發異常或提供不太有用的錯誤消息的域更有幫助。關鍵是,從領域的角度來看,您不依賴於這樣做。您仍然對您的系統充滿信心,因為您知道是否有任何不良數據通過,您的模型會捕捉到它。
如今,客戶端/伺服器案例已不再是問題,因為已經做了很多工作來自動化它,從伺服器端程式碼生成客戶端程式碼(例如 ASP.Net MVC 中的 ModelValidatorProvider)。我相信隨著越來越多的人開始使用視圖模型/DTO,我們將開始看到類似的解決方案,用於自動將域驗證映射到 DTO(AutoMapper 已經在使用)。
所以簡而言之,我的(務實而不是理想的;))答案是:
暫時接受對 DRY 的違反,在兩個地方都進行驗證,並嘗試為未來旨在實現自動化的項目做出貢獻