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

Ser*_*rin 2 .net c# asp.net asp.net-mvc ninject

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

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

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

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

kernel.Components.GetAll<INinjectHttpApplicationPlugin>()
  .Select(c => c.RequestScope)
  .FirstOrDefault(s => s != null);
Run Code Online (Sandbox Code Playgroud)

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

Dar*_*rov 6

(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容器一次,然后自动注入所有依赖项.如果您需要应用程序中的某个位置,除了配置依赖项的地方之外,您就会遇到严重的设计问题,因为您不再使用依赖注入,而是使用反模式的服务位置.