6

流暢な検証とninjectを使用してASP.NETMVC3Webサイトをセットアップしています。検証コードは機能しています。ただし、検証クラスコンストラクターにブレークポイントを設定し、検証を使用するビューを要求すると、コンストラクターが複数回ヒットすることに気付きました。非常に基本的なテストに基づくと、コンストラクターがヒットする回数は、オブジェクトに存在するプロパティの数に等しいようです。他の誰かが似たようなものに出くわしたことがありますか?または、このタイプの検証が舞台裏でどのように機能するかについて、誰かがより多くの洞察を得ることができますか?-ありがとう

これがコンストラクターです...

public class PersonValidator : AbstractValidator<Person> {
    public PersonValidator() {
        RuleFor(x => x.Id).NotNull();
        RuleFor(x => x.Name).Length(0, 10);
        RuleFor(x => x.Email).EmailAddress();
        RuleFor(x => x.Age).InclusiveBetween(18, 60);
    }
}

これが私が使用しているライブラリ/リソースです(NuGetパッケージを入手し、以下の2つのリンクからの情報に基づいてすべてを構成しました):

http://fluentvalidation.codeplex.com/wikipage?title=mvc https://github.com/ninject/ninject.web.mvc.fluentvalidation

4

2 に答える 2

4

この問題を防ぐ方法を見つけました。これで私の問題は解決しましたが、これを行うことで何か影響があるかどうかについて、他の人から意見を求めたいと思います。

したがって、2番目のリンクには、Ninjectを設定する方法の説明が表示されます。

2番目のステップでは、「 InRequestScope()」拡張メソッドを適用する必要があります。その場合、コンストラクターは、バリデーターを使用するhttpリクエストごとに1回だけヒットします。これは明らかに、httpリクエストごとにバリデーターオブジェクトのインスタンスが1つだけ作成されることを意味します。これは、私には理にかなっています。このソリューションを使用することに何か影響があるかどうかわかりませんか?

Bind(match.InterfaceType).To(match.ValidatorType).InRequestScope();
于 2011-10-21T02:08:21.717 に答える
0

このスレッドを復活させます。

SimpleInjectorでも同じ問題が発生しました。私の解決策は、コレクションレジスタにLifeTime.Scopedを含めることでした。

private static void WarmUpMediatrAndFluentValidation(this Container container)
    {
        var allAssemblies = GetAssemblies();

        container.RegisterSingleton<IMediator, Mediator>();
        container.Register(typeof(IRequestHandler<,>), allAssemblies);

        RegisterHandlers(container, typeof(INotificationHandler<>), allAssemblies);
        RegisterHandlers(container, typeof(IRequestExceptionAction<,>), allAssemblies);
        RegisterHandlers(container, typeof(IRequestExceptionHandler<,,>), allAssemblies);

        //Pipeline
        container.Collection.Register(typeof(IPipelineBehavior<,>), new[]
        {
            typeof(RequestExceptionProcessorBehavior<,>),
            typeof(RequestExceptionActionProcessorBehavior<,>),
            typeof(RequestPreProcessorBehavior<,>),
            typeof(RequestPostProcessorBehavior<,>),
            typeof(PipelineBehavior<,>)
        });
        
        container.Collection.Register(typeof(IRequestPreProcessor<>), new[] {typeof(EmptyRequestPreProcessor<>)});
        container.Collection.Register(typeof(IRequestPostProcessor<,>), new[] {typeof(EmptyRequestPostProcessor<,>)});

        container.Register(() => new ServiceFactory(container.GetInstance), Lifestyle.Singleton);

        container.Collection.Register(typeof(IValidator<>), allAssemblies, Lifestyle.Scoped);
    }

container.Collection.Register(typeof(IValidator <>)、allAssemblies、Lifestyle.Scoped); <-労働者は私にとっては問題なく、リクエストごとに1回だけ電話をかけます。

于 2021-05-19T15:10:47.943 に答える