通过城堡windsor在{web}注册流畅的验证

时间:2015-11-24 10:45:23

标签: c# asp.net-web-api asp.net-web-api2 castle-windsor fluentvalidation

我有一个班级:

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注册有什么问题,我认为这不起作用。

1 个答案:

答案 0 :(得分:2)

如果不在调试模式下单步执行代码,这很难诊断出来。

自从我使用过城堡windsor以来已经有一段时间,但我建议的一件事就是在你的global.cs中设置一个断点并在你的观察窗口中添加对容器对象的引用。通过 WindsorFluentValidatorFactory 类配置。

通过执行此操作,您可以检查容器及其所有已注册的服务。我知道,对于Castle Windsor,它还列出了未能注册的服务以及失败的原因。

根据我的经验,通常情况是链中缺少依赖项,如果一个依赖项没有正确注册,引用它的任何其他依赖项也将失败。

希望这有帮助。