如何在ASP.NET中解析全局文件中的Ninject依赖项?

Che*_*hev 3 .net c# asp.net dependency-injection ninject

我正在使用带有Web表单应用程序的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在我的页面中我只需要让它们继承Ninject.Web.PageBase.然后我可以在页面后面的代码上设置属性并将[inject]属性放在它上面.

[inject]
public IVendorBriefController vendorBriefController { get; set; }
Run Code Online (Sandbox Code Playgroud)

这非常有效.但是现在我需要在Global.asax文件本身中进行一些依赖注入.我需要的实例IErrorLogEntryController在我的Application_Error事件.如何解决此问题并将我指定的绑定用于抽象类型?

protected void Application_Error(object sender, EventArgs e)
{
    IErrorLogEntryController = ???;
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*soe 5

如果将Ninject.Web库用于ASP.NET WebForms,则应该只能够从KernelContainer静态类中获取内核。在此库中,KernelContainer类似乎是使用Ninject进行服务定位的起点。

拥有内核后,就可以获取所需的任何依赖关系。

protected void Application_Error(object sender, EventArgs e)
{
    IErrorLogEntryController = KernelContainer.Kernel.Get<IErrorLogEntryController>();
}
Run Code Online (Sandbox Code Playgroud)


Vad*_*dim 5

只需在Global类中执行相同的操作即可

[Inject]
public IErrorLogEntryController ErrorLogEntryController { get; set; }
Run Code Online (Sandbox Code Playgroud)

NinjectHttpApplication在创建内核后注入自身.