【问题标题】:Are services created in advance before needed by the controllers?服务是否在控制器需要之前预先创建?
【发布时间】:2019-07-26 13:03:25
【问题描述】:

我在读一本书,上面写着:

当应用程序启动时,ASP.NET Core 创建Startup 类的新实例并调用其ConfigureServices 方法,以便应用程序可以创建其服务,而服务是为应用程序的其他部分提供功能的对象

我有点困惑,因为它看起来像是在控制器中实际需要它之前创建了一个服务/对象。

假设只有一个控制器需要UptimeService 对象,而CalculateController(不是默认映射控制器)是唯一需要UptimeService 对象的控制器,所以我添加:

//Startup.cs
public void ConfigureServices(IServiceCollection services)
{
   services.AddSingleton<UptimeService>();
   services.AddMvc();
}

假设我们首先通过路由到Home/Index 运行应用程序,我的问题是:

  1. 根据上图,UptimeService 总是被创建,即使我们不去Calculate/Index,因为CalculateController 是唯一需要UptimeService 的控制器,不是吗效率很低?

  2. 经常听到“注册服务”,和“创建服务”是一样的吗?

【问题讨论】:

  • Q1:依赖实例只会在解析其依赖时创建。所以,不,它不会在启动时创建UptimeService(基于显示的当前代码)。 Q2:没有
  • 你的这两个问题都很容易测试自己。只需在单例的构造函数中添加一条日志行以及它在哪些场景中打印。

标签: c# asp.net-core dependency-injection


【解决方案1】:

第二季度。不,注册服务并不意味着创建服务。 注册一个服务只会为依赖注入配置 IoC 容器。这意味着services.AddSingleton&lt;UptimeService&gt;(); 不会创建UptimeService 的实例,它只会“配置” IoC 容器,以便它可以在您请求时为您提供UptimeService 的实例。

第一季度。既然您知道“注册服务”和“创建服务”是两个不同的东西,那么在 Startup 类中您只注册服务,因此,UptimeService 的实例只会在依赖于 @ 的控制器时创建987654326@ 已创建,并且仅当您发出路由到该控制器的 HTTP 请求时才会创建该控制器。

每个请求都会创建控制器,但由于您将服务添加为Singleton,因此该服务的相同实例将提供给控制器,但每个请求都会创建控制器的新实例。

【讨论】:

  • 感谢您简洁的回答。那么就是说图中的“Services Created”是错误的,应该是“Services Registered”?
  • @slowjams 是的。你能告诉我有那张照片的书的名字吗?
猜你喜欢
  • 2021-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-22
相关资源
最近更新 更多