从数据验证属性中联系数据库

时间:2013-12-18 00:31:24

标签: c# validation castle-windsor custom-attributes validationattribute

我有一个客户端类型提示,可以返回一个json列表,并为用户提供可以为输入字段输入的特定列表的选项。

在服务器上,我想确保提交的表单数据与其中一个地方匹配。实际上,除非某人是恶意的并且从提琴手或类似的东西发布数据,否则应该这样做。

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

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

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

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

1 个答案:

答案 0 :(得分: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 
    }