Надеюсь эта статья сэкономит кучу времени тем, кто сталкивался в названиями в заголовке статьи, а тем более в одном проекте. Как же совместить эти решения вместе?
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, автоматически будет подставляться нужный валидатор.
Если нужен пример с проектом, пишите на почту, буду рада помочь.
Комментариев нет:
Отправить комментарий