0

У меня есть класс:вопроса регистрации свободно проверки в webapi2 через Виндзорский замок

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, которая, я думаю, не работает.

ответ

2

Это действительно сложно диагностировать, не переходя через код в режиме отладки.

Прошло некоторое время с тех пор, как я использовал виндзорский замок, но одна из вещей, которые я бы предложил, - это поставить точку останова в вашем global.cs и добавить ссылку на объект-контейнер в окне просмотра, после того, был сконфигурирован с помощью класса WindsorFluentValidatorFactory.

Делая это, вы можете осмотреть контейнер и все его зарегистрированные услуги. Я знаю, что с Castle Windsor у него также есть список служб, которые он не смог зарегистрировать, и причины, по которым они потерпели неудачу.

Из моего опыта, как правило, в цепочке отсутствовала зависимость, и если одна зависимость не регистрируется должным образом, любая другая зависимость, ссылающаяся на нее, также не удастся.

Надеюсь, это поможет.

+0

Спасибо. Я вижу бетон BlaValidator, зарегистрированный как AbstractValidator . У меня есть подозрение, что: FluentValidationModelValidatorProvider.Configure (GlobalConfiguration.Configuration, provider => provider.ValidatorFactory = new WindsorFluentValidatorFactory (container.Kernel)); не проверяет, когда я проверяю ModelState.IsValid. Какая часть жизненного цикла webapi проверяет, является ли modelstate.isvalid? – cs0815

+0

Связывание модели применяется после фильтров авторизации и фильтров действий, (OnActionExecuting & OnActionExecuted). – Derek

+1

Возможно, мне нужно что-то реализовать здесь, что вызывает проверку? В идеале я хочу приблизиться к этому: http://sergeyakopov.com/restful-validation-with-asp-net-web-api-and-fluentvalidation/ – cs0815