我真的很困惑小的,部分的,单文件的例子,其中有一个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()是什么意思呢?
答案 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容器一次,然后自动注入所有依赖项。如果您需要应用程序中的某个位置,除了配置依赖项的位置之外,您就会遇到严重的设计问题,因为您不再使用依赖注入,而是使用反模式的服务位置。