#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>();