2016-01-06 21 views
0

我有幾個不同的類,其名稱屬性類型爲string,但在每種情況下驗證名稱的規則是相同的,例如,不能爲空,1到32個字符之間,不得包含某些無效/符號字符等。 - 您明白了。如何使用特定的驗證錯誤消息創建定製的FluentValidation PropertyValidator?

我正在使用FluentValidation庫進行驗證。我對它很新,但是就像我目前看到的一樣。我開始爲我的對象模型中的每個類創建AbstractValidator<T>派生的驗證類來驗證它們的屬性。我很快意識到我正在複製代碼來驗證各個類的名稱屬性,因此決定創建一個NameValidator定製屬性驗證器(即定製PropertyValidator派生類)。目的是將四個或五個重複的名稱驗證邏輯封裝在一個地方。

然而,我不喜歡這個解決方案(基於我的新手理解)是,我不能指定一個不同的,具體的驗證錯誤消息根據驗證失敗的標準,因爲錯誤消息必須是在構造函數中定義並傳遞給基類。換句話說,驗證錯誤消息與類類型相關,而不是IsValid(...)覆蓋內的運行時邏輯。例如,如果名稱太長,我想提供一個特定的消息,而不是一個複合消息,說明驗證失敗的十幾個不同的可能原因之一,讓用戶找出哪一個是真正的罪魁禍首。也許這是可能的,我只是想念它,或者一個屬性驗證器根本無意支持多種類型驗證的概念。

另一個方法我認爲是建立一個NameValidator類從AbstractValidator<string>導出並使用的形式的各種RuleFor語句:RuleFor(name => name).Foo(...)等這有助於限定特定驗證錯誤消息。但是,這種「感覺不對」,因爲AbstractValidator<T>用於驗證對象,而PropertyValidator用於驗證屬性。任何關於這種方法的有效性(或其他)的想法/建議將不勝感激。

所以我的問題是什麼是建議使用FluentValidation庫以可重複使用的方式封裝各種屬性驗證邏輯的方法,同時保持提供非常具體的驗證錯誤消息的能力,以準確描述爲什麼某些驗證失敗?

回答

1

如果是我,我會用NameValidator : AbstractValidator<string>的方法。 Name符合太多要求的事實使其成爲其本身的一個對象。

此外語義,PropertyValidator用於表示單一類型約束不是對象

+0

感謝拉吉用於阱理由的答覆的單個屬性的。我同意你的推理。但是,自從使用AbstractValidator 方法後,我注意到了兩個不幸的副作用。一個是'ValidationFailure.PropertyName'中的返回值現在是「Name.Name」而不是「Name」。另一個是'NotNull <>'內置的驗證器不再起作用(但其他的做法,例如'Length <>')。這讓我擔心這種方法可能會有其他未知的和意想不到的後果。 – prlc

+0

我剛剛在GitHub FluentValidation項目頁面上的一個緊密相關的主題上遇到了這個問題/答案:[link](https://github.com/JeremySkinner/FluentValidation/issues/184)。Jeremy Skinner(FluentValidation庫的作者/架構師)基本上說,不建議創建'AbstractValidator <原始類型>'並且有已知問題,所以我原來的問題仍然存在。 – prlc

+0

基本上,問題只存在於原始類型。所以,如果你要創建一個類名 - 包含一個字符串 - 那麼你可以使用AbstractValidator 。你有沒有嘗試過這種方法? –