3

必要に応じてページングと並べ替えをサポートするために、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());

各サブクラスで同じ検証ロジックを記述しないようにするための、この問題の最善の解決策は何ですか?

4

1 に答える 1

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を使用したクエリの基本的な実装が完了しました。

于 2013-03-24T22:27:12.150 に答える