必要に応じてページングと並べ替えをサポートするために、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ではなくCarsを検索するため、キャッシュ内で上記のバリデーターを見つけることができません(11行目のValidationFilter.cs)。
ValidatorCache.GetValidator(req, requestDto.GetType());
各サブクラスで同じ検証ロジックを記述しないようにするための、この問題の最善の解決策は何ですか?