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)
如果将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)
只需在Global类中执行相同的操作即可
[Inject]
public IErrorLogEntryController ErrorLogEntryController { get; set; }
Run Code Online (Sandbox Code Playgroud)
NinjectHttpApplication在创建内核后注入自身.