0

我有一個客戶端typeahead,它返回一個json列表,並向用戶顯示選項,以便他們可以爲輸入字段輸入地點的特定列表。從數據驗證屬性中聯繫數據庫

在服務器上,我想確保提交的表單數據與這些地方中的一個匹配。實際上它應該是除非有人惡意並且從提琴手或者類似的東西上發佈數據。

我將數據提供給存儲在Redis中的列表中的類型。我讀過從屬性內聯繫數據庫是不好的做法,但是我想在允許邏輯流程繼續之前檢查redis列表中是否存在該位置。

我可以在每個web服務器實例啓動時靜態緩存列表,但現在這意味着如果列表完全更改,則所有服務器都必須重新啓動以獲取更改。

也許不是使用驗證屬性,我應該使用流暢的驗證器?

http://fluentvalidation.codeplex.com/wikipage?title=ValidatorFactory&referringTitle=Documentation

回答

0

我讀過,這是不好的做法來聯繫從 屬性中的數據庫[...]

您的屬性並不需要知道任何數據庫或任何事情。你的屬性需要做的是調用一個服務來完成這項工作。該服務的實現將隱藏在您的屬性的角度。

interface IValidationService 
{ 
    bool DoesPlaceExist(Place place); 
} 

class RedisValidationService : IValidationService 
{ 
    bool DoesPlaceExist(Place place) 
    { 
     // crazy redis magic ... 
    } 
} 


class PlaceValidationAttribute : ValidationAttribute 
{ 
    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    {  
     var validationService = new RedisValidationService(); // ideally use IoC 
     var isValid = validationService.DoesPlaceExists(new Place(value)); 
     // ... this is over simplified to just show the idea 
     // return blah blah 
    } 
+0

這幾乎是我的想法,甚至抽象爲服務,我們仍然是從一個屬性聯繫數據庫。出於某種原因,我的印象是該屬性應該只是靜態元數據。 – Neil