Получить экземпляр объекта с помощью 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));
}
Безупречно. Это делается довольно часто с теми, кто новичок в Injection Dependency (я сам включил). Вопрос в том, почему вам нужно делать это таким образом?
Ответ 2
protected void Application_Start()
{
HttpContext.Current.Application["UnityContainer"] = System.Web.Mvc.DependencyResolver.Current.GetService(typeof(EFUnitOfWork));
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
public static IRepositoryWrapper IoCSession
{
get { return HttpContext.Current.Application["UnityContainer"] as IRepositoryWrapper; }
set { HttpContext.Current.Application["UnityContainer"] = value; }
}
BuildStarted Мне нравится этот путь, если есть другой способ, пожалуйста, посоветуйте нам..
Riderman вы также можете использовать UnitOfWork, как показано ниже
var container = new UnityContainer();
container.RegisterType<IRepositoryWrapper>(new EFUnitOfWork());