Как разрешить зависимость Ninject в глобальном файле в ASP.NET? - PullRequest
3 голосов
/ 10 мая 2011

Я использую сборки Ninject и Ninject.Web с приложением веб-форм.В файле global.asax я указываю привязки следующим образом:

public class Global : NinjectHttpApplication
{
    protected override IKernel CreateKernel()
    {
        IKernel kernel = new StandardKernel();

        // Vendor Briefs. 
        kernel.Bind<IVendorBriefRepository>().To<VendorBriefRepository>().InRequestScope();
        kernel.Bind<IVendorBriefController>().To<VendorBriefController>().InRequestScope();

        // Search Services. 
        kernel.Bind<ISearchServicesController>().To<SearchServicesController>().InRequestScope();
        kernel.Bind<ISearchServicesRepository>().To<SearchServicesRepository>().InRequestScope();

        // Error Logging
        kernel.Bind<IErrorLogEntryController>().To<ErrorLogEntryController>().InRequestScope();
        kernel.Bind<IErrorLogEntryRepository>().To<ErrorLogEntryRepository>().InRequestScope();


        return kernel;
    }
}

Тогда на моих страницах я просто должен заставить их наследовать от Ninject.Web.PageBase.Затем я могу настроить свойства кода позади страниц и поставить над ним атрибут [inject].

[inject]
public IVendorBriefController vendorBriefController { get; set; }

Это прекрасно работает.Но теперь мне нужно внести некоторые зависимости в сам файл Global.asax.Мне нужен экземпляр IErrorLogEntryController в моем Application_Error событии.Как решить эту проблему и использовать указанную привязку для абстрактного типа?

protected void Application_Error(object sender, EventArgs e)
{
    IErrorLogEntryController = ???;
}

Ответы [ 3 ]

5 голосов
/ 11 мая 2011

Просто сделайте то же самое в своем глобальном классе

[Inject]
public IErrorLogEntryController ErrorLogEntryController { get; set; }

Приложение NinjectHttpApplication внедряется после создания ядра.

5 голосов
/ 10 мая 2011

Если вы используете библиотеку Ninject.Web для веб-форм ASP.NET, вы просто сможете получить ядро ​​из статического класса KernelContainer . В этой библиотеке класс KernelContainer представляется отправной точкой для определения местоположения службы с использованием Ninject.

Если у вас есть ядро, вы можете получить любую нужную вам зависимость.

protected void Application_Error(object sender, EventArgs e)
{
    IErrorLogEntryController = KernelContainer.Kernel.Get<IErrorLogEntryController>();
}
0 голосов
/ 16 октября 2013

Global.cs:

        HttpContext.Current.Application["UnityContainer"] = System.Web.Mvc.DependencyResolver.Current.GetService(typeof(EFUnitOfWork));
...