Проблемы с инжекцией Ninject Constructor и сборкой - PullRequest
0 голосов
/ 13 марта 2012

Наследование от класса контроллера MVC

public class BaseController  : Controller
{

    private ITenantRepository _repository;
    [Inject]
    public BaseController(ITenantRepository repository)
    {
        _repository = repository;
    }
    protected override void Initialize(System.Web.Routing.RequestContext requestContext)
    {
        base.Initialize(requestContext);
    }
}

не может построить

BaseController 'не содержит конструктор, который принимает 0 аргументов

Я явно упускаю что-то очевидное.

1 Ответ

2 голосов
/ 13 марта 2012

В ваших дочерних контроллерах убедитесь, что вы определили конструктор с теми же параметрами, что и ваш базовый класс:

public class FooController: BaseController
{
    public FooController(ITenantRepository repository): base(repository)
    {
    }

    ...
}

Это необходимо сделать, потому что в базовом классе вы удалили конструктор без параметров и заменили его на пользовательский. Таким образом, производные классы также должны быть удалены из их конструктора без параметров.

Также обратите внимание, что обычный способ использования Ninject с ASP.NET MVC - установить его как DependencyResolver на верхнем уровне вашего приложения. Контроллеры не должны использовать какие-либо специфичные для контейнера атрибуты, такие как атрибут [Inject], который вы использовали, поскольку они привязывают ваш код к используемому вами контейнеру внедрения зависимостей.

Также обратите внимание, что в дополнение к плохой практике с предыдущей точки зрения атрибут [Inject] в конструкторе в вашем коде не оказывает существенного влияния:

  • Ничто не собирается вмешиваться и говорить: «Смотри, у него есть атрибут, нам лучше предоставить его зависимости»
  • Если вы настроили Ninject как DependencyResolver, ему не понадобится атрибут, поскольку нет никакой двусмысленности относительно того, что необходимо для создания контроллера.
    • нет конструктора по умолчанию
    • нет конкурирующего конструктора
...