當我在asp.net mvc網站項目上工作時,我調查了不同的驗證方法。其中一些是DataAnotation驗證和驗證塊。他們使用屬性來設置驗證規則。就像這樣:面向方面編程在面向對象的世界突破規則?
[Required]
public string Name {get;set;}
我被搞糊塗了這種方法如何使用SRP(單一負有責任的原則)從OOP的世界結合。我也不喜歡業務對象中的任何業務邏輯,我更喜歡「糟糕的業務對象」模型,但是當我用真實需求的驗證屬性來裝飾業務對象時,它們變得醜陋(具有很多屬性/帶有本地化邏輯和等等)。
想法與屬性真的很簡單,但在我看來,驗證裝飾應與對象分開。我不確定將驗證規則分離到xml文件或另一個對象的方法,也許這是一個解決方案。
AOP的另一個不好的方面 - 單元測試這樣的代碼的問題。當我使用自定義屬性修飾某些控制器動作時,例如在動作之間導入/導出TempData或初始化一些必需的服務時,我無法編寫適當的單元測試來測試此操作。
你認爲這些屬性不會破壞srp,或者你忽略了這一點,並認爲它最簡單,不是最糟糕的方式嗎?
P.S.我讀了一些喜歡的文章和討論,我只是想把事情按正確的順序排列。
P.P.S.我的「流利」英語遺憾:=)
編輯 我認爲這是打破規則「和醜陋的將是這樣的場景: 如果在驗證具有一定的業務規則 - 例如用戶必須有唯一的電子郵件在系統中,您應該驗證用戶輸入在應用程序中拋出所有圖層,因此當您編寫自定義屬性以檢查此數據時,業務對象將與您的數據層throw屬性相關聯。
任何含有「醜陋」,「破壞規則」等詞的論證已經開始從語用學轉向價值判斷。 – 2010-06-18 08:32:35