【问题标题】:List ValidationAttribute validation is not very performantList ValidationAttribute 验证不是很高效
【发布时间】:2022-12-07 19:49:33
【问题描述】:

是否可以通过电影列表而不是为每次验证调用数据库?

我们考虑过缓存,但这对我们来说不切实际。

protected override System.ComponentModel.DataAnnotations.ValidationResult IsValid(object value, ValidationContext validationContext)
            {
                if (validationContext == null && value != null)
                {
                    var id = value is Movie ? ((Movie)value).ID : (int)value;
    
                    var movieRepository = DependencyInjectionHelper.Resolve<IMovieRepository>();
                    var movie = movieRepository.Get().FirstOrDefault(e => e.MovieId == id);
    
                    if (movie == null)
                        return new System.ComponentModel.DataAnnotations.ValidationResult(FormatErrorMessage(string.Empty));
    
                    return System.ComponentModel.DataAnnotations.ValidationResult.Success;
                }
    
                return System.ComponentModel.DataAnnotations.ValidationResult.Success;
            }

【问题讨论】:

  • 针对您的特定需求的非常广泛的问题。当然你可以传递电影列表,你有“值”参数,它是对象 - 所以创建将保存电影列表的类,并将它传递到这里。
  • “我们考虑过缓存,但这对我们来说不切实际”但这似乎是最好的选择。为什么不?你也可以只缓存 MovieIDs,所以这是必要的。
  • @kosist 我认为这可能是最好的解决方案
  • @TimSchmelter 这是一个多租户系统,已经涉及很多缓存。所以在这种情况下,它会为每个用户缓存他们不同的电影列表
  • 当您说传入电影列表时,您的意思是验证电影列表而不是仅验证电影列表以最小化数据库调用或传入电影列表以验证单个电影以消除数据库调用?

标签: c#


【解决方案1】:

是的,您可以传入电影列表,而不是每次需要验证某些内容时都调用数据库。您所要做的就是向接受电影列表的 IsValid 方法添加一个新参数。然后,无需调用 IMovieRepository,您可以在电影列表中搜索您需要的电影。这是一个看起来如何的示例:

protected override System.ComponentModel.DataAnnotations.ValidationResult IsValid(object value, ValidationContext validationContext, List<Movie> movies)
{
    if (validationContext == null && value != null)
    {
        var id = value is Movie ? ((Movie)value).ID : (int)value;

        var movie = movies.FirstOrDefault(e => e.MovieId == id);

        if (movie == null)
            return new System.ComponentModel.DataAnnotations.ValidationResult(FormatErrorMessage(string.Empty));

        return System.ComponentModel.DataAnnotations.ValidationResult.Success;
    }

    return System.ComponentModel.DataAnnotations.ValidationResult.Success;
}

现在,当您想要使用 IsValid 方法时,您可以传入电影列表以及值和验证上下文:

var movies = ...
var result = IsValid(value, validationContext, movies);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-17
    • 2012-03-10
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 2019-07-17
    • 1970-01-01
    相关资源
    最近更新 更多