Использование FluentValidation с Castle Windsor и Entity Framework 4.0 (POCO) в MVC2 - PullRequest
2 голосов
/ 21 мая 2010

Это не очень простой вопрос, но, надеюсь, кто-то столкнулся с ним.

Я пытаюсь заставить следующие вещи работать вместе:

  1. MVC2
  2. FluentValidation
  3. Entity Framework 4.0 (POCO)
  4. Замок Виндзор

У меня все получилось. Я реализовал Castle Windsor и работал с контроллерами, обслуживаемыми WindsorControllerFactory, которая является частью MVCContrib. У меня также есть Castle, обслуживающий валидаторы FluentValidation, как описано в этой статье: http://www.jeremyskinner.co.uk/2010/02/22/using-fluentvalidation-with-an-ioc-container/

Моя проблема возникает, когда я пытаюсь использовать Html.EditorForModel или EditorFor для представления. Когда я пытаюсь сделать это, я получаю это сообщение об ошибке:

Нет компонента для поддержки службы. 1020 *

Это связано с использованием генерации POCO в Entity Framework 4.0. Во время выполнения сгенерированные классы оборачиваются динамическим прокси, поэтому может происходить отслеживание и отложенная загрузка. По-видимому, при использовании EditorForModel или EditorFor он пытается попросить Windsor создать валидатор для динамического типа прокси вместо базового реального типа.

Кто-нибудь знает, что я могу сделать, чтобы решить эту проблему?

Ответы [ 2 ]

3 голосов
/ 22 мая 2010

Это метод CreateInstance моей ValidatorFactory. Если вы видите лучший способ, пожалуйста, прокомментируйте.

    public override IValidator CreateInstance( Type validatorType)
    {
        if( validatorType.GetGenericArguments()[0].Namespace.Contains( "DynamicProxies" ) )
        {
            validatorType = Type.GetType( String.Format( "{0}.{1}[[{2}]], {3}", validatorType.Namespace, validatorType.Name, validatorType.GetGenericArguments()[0].BaseType.AssemblyQualifiedName, validatorType.Assembly.FullName ) );

        }

        return ResolveType.Of( validatorType ) as IValidator;
    }
3 голосов
/ 21 мая 2010

Я предлагаю вам написать пользовательский FluentValidatorFactory, который будет возвращать правильный класс валидатора для прокси-класса класса.

...