通过温莎城堡在 webapi2 中注册流利验证
issue registering fluent validation in webapi2 via castle windsor
我有一个 class:
WebApiInstaller : IWindsorInstaller
其中包含:
container.Register(
Classes
.FromThisAssembly()
.BasedOn(typeof(AbstractValidator<>))
.WithService
.Base());
var container = new WindsorContainer();
container.Install(new WebApiInstaller());
GlobalConfiguration.Configuration.DependencyResolver = new WindsorHttpDependencyResolver(container);
在我的 global.cs 文件中,我目前使用的是:
var container = new WindsorContainer();
container.Install(new WebApiInstaller());
GlobalConfiguration.Configuration.DependencyResolver = new WindsorHttpDependencyResolver(container);
FluentValidationModelValidatorProvider.Configure(GlobalConfiguration.Configuration, provider => provider.ValidatorFactory = new WindsorFluentValidatorFactory(container.Kernel));
这里的 WindsorFluentValidatorFactory 看起来如下:
public class WindsorFluentValidatorFactory : ValidatorFactoryBase
{
private readonly IKernel _kernel;
public WindsorFluentValidatorFactory(IKernel kernel)
{
_kernel = kernel;
}
public override IValidator CreateInstance(Type validatorType)
{
return _kernel.HasComponent(validatorType)
? _kernel.Resolve<IValidator>(validatorType)
: null;
}
}
我的端点是这样的:
public IHttpActionResult AddPointGivenGeoJsonPointDto([FromBody] Bla blaDto)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
}
bla是这样装饰的:
[Validator(typeof(BlaValidator))]
public class Bla
验证器看起来像这样:
public class BlaValidator : AbstractValidator<Bla>
不幸的是,尽管在集成测试中传递了无效的对象,但 ModelState 永远不会无效。谁能看出我的 windsor.castle 注册有什么问题,我认为这不起作用。
如果不在调试模式下单步执行代码,这真的很难诊断。
自从我使用温莎城堡以来已经有一段时间了,但我建议的一件事是在你的 global.cs 中放置一个断点并在你的手表中添加对容器对象的引用 window,通过WindsorFluentValidatorFactory配置后class.
通过这样做,您可以检查容器及其所有已注册的服务。我知道对于 Castle Windsor,它也有一个未能注册的服务列表以及它们失败的原因。
根据我的经验,通常情况下链中缺少依赖项,如果一个依赖项没有正确注册,任何其他引用它的依赖项也会失败。
希望这对您有所帮助。
我有一个 class:
WebApiInstaller : IWindsorInstaller
其中包含:
container.Register(
Classes
.FromThisAssembly()
.BasedOn(typeof(AbstractValidator<>))
.WithService
.Base());
var container = new WindsorContainer();
container.Install(new WebApiInstaller());
GlobalConfiguration.Configuration.DependencyResolver = new WindsorHttpDependencyResolver(container);
在我的 global.cs 文件中,我目前使用的是:
var container = new WindsorContainer();
container.Install(new WebApiInstaller());
GlobalConfiguration.Configuration.DependencyResolver = new WindsorHttpDependencyResolver(container);
FluentValidationModelValidatorProvider.Configure(GlobalConfiguration.Configuration, provider => provider.ValidatorFactory = new WindsorFluentValidatorFactory(container.Kernel));
这里的 WindsorFluentValidatorFactory 看起来如下:
public class WindsorFluentValidatorFactory : ValidatorFactoryBase
{
private readonly IKernel _kernel;
public WindsorFluentValidatorFactory(IKernel kernel)
{
_kernel = kernel;
}
public override IValidator CreateInstance(Type validatorType)
{
return _kernel.HasComponent(validatorType)
? _kernel.Resolve<IValidator>(validatorType)
: null;
}
}
我的端点是这样的:
public IHttpActionResult AddPointGivenGeoJsonPointDto([FromBody] Bla blaDto)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
}
bla是这样装饰的:
[Validator(typeof(BlaValidator))]
public class Bla
验证器看起来像这样:
public class BlaValidator : AbstractValidator<Bla>
不幸的是,尽管在集成测试中传递了无效的对象,但 ModelState 永远不会无效。谁能看出我的 windsor.castle 注册有什么问题,我认为这不起作用。
如果不在调试模式下单步执行代码,这真的很难诊断。
自从我使用温莎城堡以来已经有一段时间了,但我建议的一件事是在你的 global.cs 中放置一个断点并在你的手表中添加对容器对象的引用 window,通过WindsorFluentValidatorFactory配置后class.
通过这样做,您可以检查容器及其所有已注册的服务。我知道对于 Castle Windsor,它也有一个未能注册的服务列表以及它们失败的原因。
根据我的经验,通常情况下链中缺少依赖项,如果一个依赖项没有正确注册,任何其他引用它的依赖项也会失败。
希望这对您有所帮助。