2013-03-24 55 views
3

我创建了一个QueryBase类,以便在需要时支持Paging和Sorting。用于Paging + Sorting的ServiceStack QueryBase类,但未验证验证

public class QueryBase 
{ 
    public string Sort { get; set; } 
    public int PageNumber { get; set; } 
    public int PageSize { get; set; } 
} 

如果一个类支持这些功能,它会只是这样的扩展它:

public class Cars: QueryBase, IReturn<CarsResponse> 
{ 
} 

public class CarsResponse : IHasResponseStatus 
{ 
    public List<Car> Cars { get; set; } 
    public ResponseStatus ResponseStatus { get; set; } 
} 

然后才能从查询字符串填补QueryBase我创建在需要时可以使用RequestFilterAttribute :

public class QueryRequestFilterAttribute : Attribute, IHasRequestFilter 
{ 
    #region IHasRequestFilter Members 

    public IHasRequestFilter Copy() 
    { 
     return this; 
    } 

    public int Priority 
    { 
     get { return -100; } 
    } 

    public void RequestFilter(IHttpRequest req, IHttpResponse res, object requestDto) 
    { 
     var request = requestDto as QueryBase; 
     if (request == null) { return; } 
     request.PageNumber = req.QueryString["pageNumber"].IsEmpty() ? 1 : int.Parse(req.QueryString["pageNumber"]); 
     request.PageSize = req.QueryString["pageSize"].IsEmpty() ? 15 : int.Parse(req.QueryString["pageSize"]); 
     request.Sort = req.QueryString["sort"].IsNullOrEmpty() ? "id" : req.QueryString["sort"]; 
    } 

    #endregion 
} 

一切工作正常,但现在我的目标是实现验证,以便确定像maxpagesize可或minpagenumber一些基本规则。 一个非常基本的实现是:

public class QueryBaseValidator : AbstractValidator<QueryBase> 
{ 
    public QueryBaseValidator() 
    { 
     RuleFor(query => query.PageSize).LessThanOrEqualTo(100).GreaterThan(0); 
    } 
} 

这样验证过滤器无法找到上述在其缓存中验证,因为它搜索汽车,而不是QueryBase(第11个ValidationFilter.cs):

ValidatorCache.GetValidator(req, requestDto.GetType()); 

这个问题的最佳解决方案是什么,以避免在每个子类中编写相同的验证逻辑?

+0

我不明白需要使用RequestFilter。由于您从QueryBase继承 - Cars已具有正确的属性,因此可以将它们用作查询参数。您在过滤器中提供的默认值可以在构造函数中设置。对 ? – 2015-06-17 14:22:12

回答

3

我找到了一个解决方案,但我不知道它是否是最好的:对每个实现QueryBase的类使用验证器。

QueryBaseValidator作如下修改:

public class QueryBaseValidator<T> : AbstractValidator<T> where T : QueryBase 
{ 
    public QueryBaseValidator() 
    { 
     RuleFor(query => query.PageSize).LessThanOrEqualTo(100).GreaterThan(0); 
    } 
} 

的子类汽车

public class CarsValidator : QueryBaseValidator<Cars> 
{ 
} 

这样一切正常,我现在已经基本实现通用分页,排序和很快创造额外的验证使用ServiceStack进行查询。

+0

我加了这个答案,但用于分页的模式并不是最好的。我将根据Demis的建议对其进行更改 – 2013-03-27 00:05:15

+0

对于FluentValidation,我认为你已经根据项目讨论提供了最佳答案:https://fluentvalidation.codeplex.com/discussions/256596 – 2013-06-17 16:23:12

+0

@IvanFioravanti,你有没有想过用更好的方法寻呼? – BrandonG 2013-06-27 21:58:01