2014-02-15 52 views
1

我使用ServiceStack實現Api。我的解決方案的關鍵方面之一是積極的驗證策略。ServiceStack - 驗證和數據庫訪問

我用ServiceStack的ValidationFeature,這意味着如果有一個IValidator < ReqDto>(或其後代:AbstractValidator < ReqDto>)的應用程序容器中註冊,驗證將自動前的服務運行。

通過積極的驗證,我的意思是我檢查所有可能的錯誤情況和驗證程序級別的邏輯驗證。因此,我的服務邏輯非常乾淨和簡短。

從實際的角度來看,服務邏輯與服務驗證的獨立性是非常好的,因爲它提供了非常容易閱讀和理解服務邏輯/實現的原因。然而,我開始認爲FluentValidation的規則和規則集更適合於簡單的格式驗證,而不是像我在做的那樣直接訪問數據庫訪問(主要是爲了測試源自從請求拉出的id的404錯誤)。

問題:

1:這是不正確概念的驗證邏輯來​​訪問數據庫?

2:從我目前看到的包括SS源在內,我沒有找到一個表單來定義FluentValidation規則,例如:從請求中拉出Id,訪問數據庫檢索實體,並拋出404如果沒有找到條目。我只使用FV的規則來定義基本的格式驗證,如:

RuleFor(x => x.UserName).NotEmpty(); 
RuleFor(x => x.Password).NotEmpty(); 

其餘的我手動。任何人都可以解決這個問題?

注意:這不是一個關於如何將ValidationResult/ValidationError轉換爲HttpResult/HttpError的問題。我已經通過使用SS 3.9.44中引入的ValidationFeature的ErrorResponseFilter來覆蓋。 謝謝

回答

6

是的,在驗證邏輯中執行數據庫記錄存在檢查是不正確的,因爲這不是驗證檢查。這就是爲什麼這種方式不能在示例中完成的原因。

檢查是否存在記錄是驗證檢查。舉例來說明這一點:

如果你拿一個信用卡號碼,你可以使用Luhn Algorithm來驗證信用卡號碼是否有效。這將在驗證器中完成,因爲它是驗證。

但僅僅因爲你有一個有效的號碼並不意味着它存在,你可能有一個有效的卡號還沒有發出。使用驗證器驗證它是否存在是不正確的,因爲這是一個驗證過程,應該在業務邏輯中完成。

當您開始使用數據庫來檢查是否存在東西時,您已超出驗證範圍,因爲您只應將驗證的數據傳遞到數據庫。

您可以閱讀更多關於difference between validation and verification here

+0

任何方式從驗證中刪除驗證從服務邊界驗證? –

+0

@Blitzkrieg您可能想要實現在您的服務之前運行的請求過濾器。這會將其與驗證類似的性質分開。關鍵要注意的是記錄不存在應拋出NotFound異常而不是驗證異常。在這裏查看[請求過濾器](https://github.com/ServiceStack/ServiceStack/wiki/Request-and-response-filters)。 – Scott

+0

是的,這是顯而易見的...它確實從驗證中扔出401,403,404,409,421和500。如果你在問題中看到,我在這裏添加了一個註釋。 –