Получить экземпляр объекта с помощью Ninject

#asp.net-mvc-3 #dependency-injection #ninject

#asp.net-mvc-3 #внедрение зависимостей #ninject

Вопрос:

Я установил в свой проект Ninject.MVC3 через Nuget.

Я прочитал в этой статье, что для внедрения зависимостей в мои контроллеры все, что вам нужно было сделать, это установить Ninject, добавить мои зависимости в NinjectMVC3.cs и готово.

Пока все хорошо, но как получить экземпляр объекта?

 public ActionResult MyAction()
{
    var myObject = /* HERE  ??*/
}
  

В конструкторе контроллера у меня нет проблем!

 public class AccountController : Controller
{
    public AccountController(IRepository repository) { ... } //This works!!
}
  

Ответ №1:

Причина, по которой это работает, заключается в том, что ControllerFactory ищет DI и автоматически добавляет его. Если вы хотите получить конкретный экземпляр, вы можете сделать это:

 private static void RegisterServices(IKernel kernel) {
    kernel.Bind<ICoolObject>().To(CoolObject);
}

public ActionResult MyAction() {
    var myObject = 
        System.Web.Mvc.DependencyResolver.Current.GetService(typeof (ICoolObject));
}
  

Однако будьте осторожны. Это делается довольно часто с новичками в внедрении зависимостей (включая меня). Вопрос в том, почему вам нужно сделать это таким образом?

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

1.Нет, нет, я это понял. Я хочу получить экземпляр объекта. Я дошел до new StandardKernel().Get<IRepository>(); этого момента: правильно ли это?

2. Что ж, вам, вероятно, следует ввести IRepository конструктор для вашего контроллера. Но я бы не стал создавать новый StandardKernel , поскольку он уже создан для вас и доступен по адресу System.Web...Current

3. Я понимаю .. это то, что я хочу, но код был укушен .. Система. Веб….. Текущий? Как мне восстановить текущий Ninject ядра?

4. Я отключил его, потому что это был код в моем ответе. System.Web.Mvc.DependencyResolver.Current выдает текущее ядро Ninject. Затем вы вызываете GetService конкретный тип, который хотите разрешить.

5. Или, более кратко, вы можете сделать DependencyResolver.Current.GetService<ICoolObject>();