Comment résolvez-vous une dépendance Ninject dans le fichier global dans ASP.NET?

J’utilise les assemblys Ninject et Ninject.Web avec une application de formulaires Web. Dans le fichier global.asax, je spécifie les liaisons comme suit:

public class Global : NinjectHttpApplication { protected override IKernel CreateKernel() { IKernel kernel = new StandardKernel(); // Vendor Briefs. kernel.Bind().To().InRequestScope(); kernel.Bind().To().InRequestScope(); // Search Services. kernel.Bind().To().InRequestScope(); kernel.Bind().To().InRequestScope(); // Error Logging kernel.Bind().To().InRequestScope(); kernel.Bind().To().InRequestScope(); return kernel; } } 

Ensuite, dans mes pages, je dois simplement les faire hériter de Ninject.Web.PageBase . Ensuite, je peux définir des propriétés sur le code situé derrière les pages et y placer l’atsortingbut [inject] .

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

Cela fonctionne très bien. Mais maintenant, je dois faire une dependency injection dans le fichier Global.asax lui-même. J’ai besoin d’une instance de IErrorLogEntryController dans mon événement Application_Error . Comment résoudre ce problème et utiliser la liaison spécifiée pour le type abstrait?

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

Faites simplement la même chose dans votre classe Global

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

NinjectHttpApplication s’injecte après la création du kernel.

Si vous utilisez la bibliothèque Ninject.Web pour ASP.NET WebForms, vous devriez pouvoir obtenir le kernel à partir de la classe statique KernelContainer . Dans cette bibliothèque, la classe KernelContainer semble être le sharepoint départ de l’emplacement du service utilisant Ninject.

Une fois que vous avez le kernel, vous pouvez obtenir toute dépendance dont vous avez besoin.

 protected void Application_Error(object sender, EventArgs e) { IErrorLogEntryController = KernelContainer.Kernel.Get(); } 
  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); }