【问题标题】:Contacting database from within data validation attribute从数据验证属性中联系数据库
【发布时间】:2013-12-18 00:31:24
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案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 
        }
    

    【讨论】:

    • 这几乎就是我的想法,即使抽象为服务,我们仍然从属性联系数据库。出于某种原因,我的印象是该属性应该只是静态元数据。
    猜你喜欢
    • 2012-11-20
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    相关资源
    最近更新 更多