2

組み込みのRegistrationServiceに基づいて独自のユーザー登録サービスを実装しているため、以下の最初の数行を含むほとんどをコピーしました...

        if (EndpointHost.RequestFilters == null
            || !EndpointHost.RequestFilters.Contains(ValidationFilters.RequestFilter)) //Already gets run
            RegistrationValidator.ValidateAndThrow(request, ApplyTo.Post);


        // Above line does not get hit as there is the ValidationFilters.RequestFilter
        //...but then the code should have previously run validation and failed?
        //...Adding the following line causes the validation to run and fail when expected
       //...but I should not required it as that is the point of the global ValidationFilters.RequestFilter??
        RegistrationValidator.ValidateAndThrow(request, ApplyTo.Post);

私が理解していることから、 ValidationFilters.RequestFilter は以前にヒットされ、検証例外がスローされたはずです。

注意: この行を apphost 構成の最後に追加しました。

Plugins.Add(new ValidationFeature());

そして、これでバリデーターを正常に登録しています:

container.Register<AbstractValidator<UserRegistration>>(new UserRegistrationValidator());

...ValidatorCache.cs の ServiceStack ソース コードの次の行に絞り込みました。

public class ValidatorCache<T>
{
    public static IValidator GetValidator(IHttpRequest httpReq)
    {
        return httpReq.TryResolve<IValidator<T>>();
    }
}

...TryResolve がバリデーターを見つけられません。

4

2 に答える 2

2

バリデーターが IOC コンテナーから解決されていないことがわかりました...これを掘り下げるのではなく、一歩下がって、以前は自動登録方法が機能しなかった理由を見つけました。

理由は、もともとこれを持っていた...

public interface IUserRegistrationValidator : IValidator<UserRegistration>
{
}

public class UserRegistrationValidator : AbstractValidator<UserRegistration>, IUserRegistrationValidator
{ //..etc

そして、ServiceStack コードは、明らかな理由で以下に示す行でつまずいていました (フレンドリーな例外を提案します)。

    public static void RegisterValidator(this Container container, Type validator, ReuseScope scope=ReuseScope.None)
    {
        var baseType = validator.BaseType;
        while (!baseType.IsGenericType) // WOULD FAIL ON THIS LINE HERE
        {
            baseType = baseType.BaseType;
        }

        var dtoType = baseType.GetGenericArguments()[0];
        var validatorType = typeof(IValidator<>).MakeGenericType(dtoType);

        container.RegisterAutoWiredType(validator, validatorType, scope);
    }

私が遊んでいた無意味なインターフェースを取り除いた後、バリデーターを登録する自動方法を使用できます...次のように:

container.RegisterValidators(typeof(UserRegistrationValidator).Assembly);

これで問題が解決します。 https://github.com/ServiceStack/ServiceStack/wiki/Validationから UserValidator を手動で登録する方法が 100% わかりません。正しく機能します。

container.Register<AbstractValidator<User>>(new UserValidator());

...もちろん、私は間違っている可能性があります。

于 2013-09-10T14:21:14.660 に答える
1

にバリデータを登録することを検討しましたAppHost.csか?

// This method scans the assembly for validators
container.RegisterValidators(Assemblies);
于 2013-09-05T03:05:05.767 に答える