2013-03-24 44 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