Внедрение зависимостей в конструктор контроллера с использованием ControllerFactory в ASP.NET MVC 5
Я занимаюсь разработкой приложения ASP.NET MVC 5. Мне нужно использовать параметры в конструкторе контроллера. DefaultControllerFactory не может разрешить его, и я унаследовал от него свой собственный ControllerFactory:
public class ControllerFactoryProvider : DefaultControllerFactory
{
public IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName)
{
string controllerType = string.Empty;
IController controller = null;
// Read Controller Class & Assembly Name from Web.Config
controllerType = ConfigurationManager.AppSettings[controllerName];
if (controllerType == null)
throw new ConfigurationErrorsException("Assembly not configured for controller " + controllerName);
// Create Controller Instance
IDataTransmitter _dataTransmitter = new DataTransmitter();
controller = Activator.CreateInstance(Type.GetType(controllerType), _dataTransmitter) as IController;
return controller;
}
public void ReleaseController(IController controller)
{
//This is a sample implementation
//If pooling is used to write code to return the object to pool
if (controller is IDisposable)
{
(controller as IDisposable).Dispose();
}
controller = null;
}
} Я зарегистрировал это в Global.asax:
ControllerBuilder.Current.SetControllerFactory (new ControllerFactoryProvider ());
Но когда я запускаю свое приложение, оно, использующее DefaultControllerFactory, не видит конструктор с параметрами.
Где я могу иметь ошибку?
1 ответ
Как я сказал в комментариях, нет необходимости переопределять фабрику вашего контроллера. Вам просто нужно подключить ваш предпочтительный контейнер внедрения зависимостей.
У меня не было возможности работать со всеми контейнерами внедрения зависимостей для .net, но я постараюсь дать объективный ответ.
Ninject
Установить Ninject
в asp.net Mvc 5
Проект очень прямой.
Установка пакета nuget
Там очень удобно nuget package
называется Ninject.MVC5
,
Вы можете установить его:
- С использованием
manage nuget packages
диалог или - Запустив
Install-Package Ninject.MVC5
в консоли диспетчера пакетов.
После установки Ninject.MVC5
вы увидите новый файл в вашем решении в App_Start/
называется NinjectWebCommon.cs
, Здесь вы можете увидеть, каким будет содержимое этого файла.
Подключение ваших зависимостей
Теперь, когда пакет установлен, вы хотите зарегистрировать свои зависимости, используя apin для ninject.
Допустим, у вас есть IFoo
интерфейс и его реализация Foo
public interface IFoo
{
int Bar()
}
public class Foo : IFoo
{
public int Bar()
{
throw new NotImplementedException();
}
}
В вашем NinjectWebCommon
класс, который вы собираетесь рассказать ninject
как решить IFoo
интерфейс:
/// <summary>
/// Load your modules or register your services here!
/// </summary>
/// <param name="kernel">The kernel.</param>
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IFoo>().To<Foo>();
}
Имейте в виду, что по умолчанию Ninject имеет неявное самосвязывание конкретных типов, это означает, что
Если тип, который вы разрешаете, является конкретным типом (как Foo выше), Ninject автоматически создаст ассоциацию по умолчанию через механизм, называемый неявной самосвязью. Это как будто есть регистрация, как это:
Bind<Foo>().To<Foo>();