我使用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來覆蓋。 謝謝
任何方式從驗證中刪除驗證從服務邊界驗證? –
@Blitzkrieg您可能想要實現在您的服務之前運行的請求過濾器。這會將其與驗證類似的性質分開。關鍵要注意的是記錄不存在應拋出NotFound異常而不是驗證異常。在這裏查看[請求過濾器](https://github.com/ServiceStack/ServiceStack/wiki/Request-and-response-filters)。 – Scott
是的,這是顯而易見的...它確實從驗證中扔出401,403,404,409,421和500。如果你在問題中看到,我在這裏添加了一個註釋。 –