2

我真的很困惑小的,部分的,一个文件的例子,到处都有一个 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);

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

4

1 回答 1

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

于 2013-07-29T08:40:32.263 回答