是否在控制器需要之前预先创建了服务?

时间:2019-07-26 00:37:10

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

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

  

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

enter image description here

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

比方说,只有一个控制器需要一个UptimeService对象,而CalculateController(不是默认的映射控制器)是唯一需要一个UptimeService对象的控制器,所以我添加: / p>

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

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

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

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

1 个答案:

答案 0 :(得分:2)

Q2。不,注册服务并不意味着创建服务。 注册服务仅将IoC容器配置为进行依赖项注入。这意味着services.AddSingleton<UptimeService>();不会创建UptimeService的实例,它只会“配置” IoC容器,以便在您需要时可以为您提供UptimeService的实例。< / p>

Q1。现在您已经知道“注册服务”和“创建服务”是两件事,在Startup类中,您仅注册服务,因此UptimeService的实例仅在控制器具有对UptimeService的依赖关系,并且仅当您发出路由到该控制器的HTTP请求时,才会创建该控制器。

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