Подтвердить что ты не робот

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

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

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

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

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

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

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

Ответ 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());