用于分页+排序的ServiceStack QueryBase类,但未激活验证

时间:2013-03-24 22:20:24

标签: 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);
    }
}

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

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

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

1 个答案:

答案 0 :(得分:3)

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

QueryBaseValidator修改如下:

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

为子类Cars

创建的附加验证器
public class CarsValidator : QueryBaseValidator<Cars>
{
}

通过这种方式,一切正常,我现在已经成为通用分页,排序和很快用ServiceStack查询的基本实现。