我使用流畅的验证和ninject设置了ASP.NET MVC3网站。验证码正在运行。但是,我在验证类构造函数中设置了一个断点,我注意到当我请求使用验证的视图时,构造函数会被多次命中。基于非常基本的测试,似乎命中构造函数的次数等于对象上存在的属性数。还有其他人遇到过类似的东西吗?或者有人可以更深入地了解这种类型的验证在幕后如何运作? -Thanks
这是构造函数......
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包,并根据以下两个链接的信息配置了所有内容):
http://fluentvalidation.codeplex.com/wikipage?title=mvc https://github.com/ninject/ninject.web.mvc.fluentvalidation
答案 0 :(得分:4)
我想出了如何防止这个问题。虽然这解决了我的问题,但我希望其他人就这样做是否有任何后果提供意见?
因此,在第二个链接上,您将看到有关如何设置Ninject的说明。
在第二步,您需要应用“ InRequestScope()”扩展方法。然后,每个使用验证器的http请求只会触发一次构造函数。这显然意味着每个http请求只创建一个验证器对象实例,这对我来说很有意义。我不知道使用这个解决方案会有什么后果吗?
Bind(match.InterfaceType).To(match.ValidatorType).InRequestScope();
答案 1 :(得分: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); <- 工作人员对我来说很好,每个请求只调用一次。