Внедрение зависимостей в конструктор контроллера с использованием 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>();
Другие вопросы по тегам