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

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

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

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

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

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

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

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

一个和一个内核。

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

它不是每个请求的内核。

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

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

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

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

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