пятница, 26 февраля 2016 г.

NINJECT+WEB API 2+Fluent Validation

Надеюсь эта статья сэкономит кучу времени темкто сталкивался в названиями в заголовке статьи, а тем более в одном проектеКак же совместить эти решения вместе? 
1. Создавался проект AST.NET WEB API 2Так как проект требовал Dependency Injection, то  использовался в нем контейнер DI Ninject. 
Поэтомупервоначально в проект был добавлен пакет 
Ninject.Web.WebApi а после Ninject.Web.WebApi.WebHost Все через NuGetПосле установки, в проекте должен появиться класс NinjectWebCommonкоторый и будет вызывать автоматически метод Start. В методе  
private static void RegisterServices(IKernel kernel) 
{
   kernel.Bind<>().To<>(); 
} 
вы объявляете нужные привязки. 



Никаких больше дополнительных манипуляций с кодом делать не стоит. В старых версиях нужно было добавлять дополнительный класс DependencyResolverно в текущей версии этого делать уже не стоит. 
2. Далее нужно добавить валидаторы на данныекоторые присылались клиентами. В этом случае требуется пакет FluentValidation.WebApiустановка которого так же шла  с NuGetОн сам уже подгрузить нужные библиотеки. 
2.1 Добавляем метод 
 private static void RegisterValidators(IKernel kernel) 
  { 
            AssemblyScanner 
                .FindValidatorsInAssembly(Assembly.GetExecutingAssembly()) 
                .ForEach(result => kernel.Bind(result.InterfaceType) 
                .To(result.ValidatorType) 
                .InRequestScope()); 
    }  
в  класс NinjectWebCommon и добавляем вызов его из метода  CreateKernel(). Получается так: 
      RegisterServices(kernel); 
      RegisterValidators(kernel); 
Он вытягивает из проекта все валидаторы и привязывает их к реализациям. 
2.2 Создаем класс NinjectValidatorFactory 
 public class NinjectValidatorFactory : ValidatorFactoryBase 
    { 
        public NinjectValidatorFactory(IKernel kernel) 
        { 
            Kernel = kernel; 
        } 

        public IKernel Kernel {get;   set;  } 

        public override IValidator CreateInstance(Type validatorType) 
        { 
            if (((IList<IBinding>)Kernel.GetBindings(validatorType)).Count == 0) 
            { 
                return null; 
            } 

            return Kernel.Get(validatorType) as IValidator; 
        } 
    } 
и в том же методе CreateKernel() прописываем следующую строку: 
       FluentValidationModelValidatorProvider.Configure(System.Web.Http.GlobalConfiguration.Configuration, 
                    provider => provider.ValidatorFactory = new NinjectValidatorFactory(kernel)); 

Вот и всеничего кроме добавлять в проекте не нужно. 
Теперь при вызове метода вашего Web Api, автоматически будет подставляться нужный валидатор. 
Если нужен пример с проектомпишите на почтубуду рада помочь. 

Комментариев нет:

Отправить комментарий