1

我有一个客户端 typeahead 可以拉回一个 json 列表并向用户提供他们可以为输入字段输入的特定位置列表的选项。

在服务器上,我想确保提交的表单数据与这些地方之一匹配。实际上它应该除非有人恶意并从提琴手或类似的东西发布数据。

我从存储在 Redis 中的列表中将数据提供给 typeahead。我读过从属性中联系数据库是不好的做法,但我想在允许逻辑流程继续之前检查 redis 列表中是否存在该位置。

我可以在每个网络服务器实例启动时静态缓存列表,但这意味着如果列表发生变化,则必须重新启动所有服务器才能获得更改。

也许我应该使用流利的验证器而不是使用验证属性?

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

4

1 回答 1

1

我读过从属性中联系数据库是不好的做法 [...]

您的属性不需要了解任何数据库或任何相关信息。您的属性需要做的是调用一个服务来完成这项工作。从您的属性的角度来看,服务的实现将是隐藏的。

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 
    }
于 2013-12-18T01:43:48.150 回答