如何在ASP.NET应用程序中存储Ninject内核?

时间:2013-07-29 08:30:42

标签: c# asp.net .net asp.net-mvc ninject

我真的很困惑小的,部分的,单文件的例子,其中有一个Ninject内核到处都没有显示如何真正到达应用程序中的内核。

(1)我们应该实例化一个内核并将其保存在“静态”上下文中吗?或者我们应该在每个请求上实例化一个不同的请求(*在Application_BeginRequest *中)

(2)如果是“每个请求的内核”,那么为什么NinjectWebCommon.cs的Initialize()方法(安装NuGet包时获取)是调用Application_Start,因为它调用bootstrapper.Initialize(CreateKernel) - NinjectWebCommon.cs

(3)如果是“一个全局静态内核”,则“InRequestScope()”不起作用。它执行以下代码并返回null,因为在ApplicationStart()时没有请求。

kernel.Components.GetAll<INinjectHttpApplicationPlugin>()
  .Select(c => c.RequestScope)
  .FirstOrDefault(s => s != null);

(4)再次,如果它是“每个请求的内核”,我们将在哪里保存内核? HttpContext.Current?那么如果我打算使用HttpContext.Current,那么使用InRequestScope()是什么意思呢?

1 个答案:

答案 0 :(得分:6)

  

(1)我们应该实例化一个内核并将其保存在“静态”上下文中吗?   或者我们应该在每个请求上实例化一个不同的请求(* in   的Application_BeginRequest *)

单核和单核。

  

(2)如果是“每个请求的内核”,那么为什么要使用Initialize()方法   NinjectWebCommon.cs(安装NuGet包时获取)是   自调用后调用Application_Start   bootstrapper.Initialize(CreateKernel) - NinjectWebCommon.cs

每个请求不是内核。

  

(3)如果它是“一个全局静态内核”那么“InRequestScope()”   不起作用。它执行以下代码并返回null   因为在ApplicationStart()时没有请求。

     

kernel.Components.GetAll()。选择(c   =&GT; c.RequestScope).FirstOrDefault(s =&gt; s!= null);

这是完全正常的。您不能期望从您的内核中获取您在HTTP请求之外使用InRequestScope明确注册的实例。

  

(4)同样,如果它是“每个请求的内核”,我们将在哪里保存   核心? HttpContext.Current?然后是什么意思使用   InRequestScope()如果我打算使用HttpContext.Current呢?

无处。你不保存核心。您只需在应用程序启动时使用内核配置DI容器一次,然后自动注入所有依赖项。如果您需要应用程序中的某个位置,除了配置依赖项的位置之外,您就会遇到严重的设计问题,因为您不再使用依赖注入,而是使用反模式的服务位置。