繁体   English   中英

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

[英]How to store Ninject Kernel in an ASP.NET Application?

我对小型的,部分文件的,一个文件的示例感到很困惑,其中到处都是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()是什么意思?

(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 Request之外向InRequestScope明确注册的。

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

无处。 您不会保存内核。 您可以在应用程序启动时使用内核仅配置一次DI容器,然后自动注入所有依赖项。 如果您在应用程序中某个地方需要内核,而不是在您配置依赖关系的地方,则您会遇到严重的设计问题,因为您不再使用依赖关系注入,而是使用服务位置(这是一种反模式)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM