2016-04-06 40 views
1

我使用Repository模式與規範模式組合與服務網絡(我喜歡在DAO庫)進行交互:因爲這表明鏈接:http://thinkinginobjects.com/2012/08/26/dont-use-dao-use-repository/驗證值混亂

用戶界面與控制器,控制器交互與服務交互,服務與存儲庫交互以及爲服務web進行CRUD操作的規範,您可以說這是應用程序的全局體系結構,一種基礎架構。

我很困惑,網絡服務的端點接受值,但它不接受負數,並且我聲明它爲int,並且在Java中沒有unsigned int,所以現在是很好的檢查在規範發出請求之前(因爲我已經知道它會失敗),或者僅在內部服務中,每個規範中的值的有效性!我認爲使每個規範檢查它的價值更好,因爲我要求每個服務使用這個規範來處理這種檢查,也就是說我可以擺脫代碼重複,如果每個規範都沒有檢查,並讓該服務爲此執行該操作,該檢查將在每個服務中重複使用,這對我來說是一種糟糕的代碼重用。

這是一個很好的放置驗證內部存儲庫,如果測試faillure會引發異常,該服務將無法捕捉它,並讓控制器捕捉它來通知用戶他所做的。

我是小有一點困惑SRP(單一職責原則),這樣做,確實每個指標符合SRP?!!!! (我一直對SRP有問題,我無法確切知道系統中每個班級的職責)。

這是Android的應用程序,並且我們有intetion把它也可以作爲Web應用程序(所以,我想這樣做以正確的方式,最大限度地提高代碼重用)。

如果我做它falsy方式,如果there'e另一種更好的方式或任何東西,現在請讓我吧:)

回答

2

你可以做驗證任何你想要的,但是,這取決於你把它的驗證獲得不同的角色:

控制器是面向用戶的。因此,他們應該驗證用戶輸入並呈現一些可讀的錯誤。根據您使用的框架,這可能是單獨驗證器或綁定器或任何其他任務的任務,但它與控制器密切相關。

在任何情況下,用戶數據的任何驗證應,在理想情況下,被前控制器將請求轉發給服務處理。如果你需要禁止輸入「-1」 - 它應該在這裏。如果在文本字段中輸入「abc」 - 再次在這裏。等等。

服務是面向領域。他們應該驗證他們的任務是否可以用給定的數據完成。但是,如果不是,他們應該快速使用某種斷言調用失敗或拋出運行時異常。他們不應該提供關於失敗原因的良好錯誤列表(如果僅用於審計目的)。他們給出的任何數據應該已經被之前的實體(控制器,驗證器等)所覆蓋。服務唯一關心的是 - 如果他們被要求的操作被業務規則所允許。

如果驗證服務層失敗(拋出異常) - 這是一個你已經錯過了驗證的一些位在控制器的信號。

有時,服務級別驗證與控制器中的驗證不匹配。想象一下,在某個項目中,普通用戶只能輸入正值,而管理員也可以輸入負值。由於某些商業邏輯原因,也不能輸入「0」。 「當前用戶輸入底片」的驗證「值爲負值」將駐留在控制器中。驗證「值爲零」也將駐留在Controller中。服務將只有「如果值爲零時拋出異常」或只是「斷言值不爲零」,因爲從它的角度來看,它可以用正面和負面來完成請求。

知識庫/規格是面向數據源的。因此,這些可以添加一些與發送請求本身相關的斷言。如果已知數據源不接受零,則此層可以對該數據源進行預驗證,並且在給定任務以查詢零時也會引發異常。

如果存儲庫層中的驗證失敗(拋出異常) - 這是您錯過了服務或控制器驗證的信號。


換句話說:

  • 如果你的規範規定,「用戶不應該被允許進入負值爲平衡區域」 - 這正好與一個適當的消息給控制器。
  • 如果您的規格說明「所有客戶的餘額總是正值」 - 這將用於服務驗證。
  • 如果您的規範聲明「銀行webservice只接受請求中的正值」,那麼此驗證的地方就是存儲庫。

因此,無論您的情況如何,請考慮哪些約束是真實的,並適當地組織您的驗證。

+0

非常感謝你,以非常好的方式解釋,所以很有用,現在一切都很清楚,我將書籤作爲參考使用它的答案,再次感謝你:) –