首页 > 解决方案 > 在 ASPNET Core 中注册具有两个不同生命周期范围的依赖项

问题描述

我最近加入了一个拥有大量现有代码的团队。在过去的几年中,此代码已由许多不同的人编写。

扩展方法已经从 中创建,IServiceCollection以使注册依赖项更容易。当我在挖掘一些代码的内部工作时,我看到以下是在两种不同的扩展方法中完成的。

扩展 1

public void AddServices1(this IServiceCollection services)
{
   services.AddScoped<IService, Service>();
}

扩展 2

public void AddServices2(this IServiceCollection services)
{
   services.AddTransient<IService, Service>();
}

Startup.cs文件中存在以下内容

public void ConfigureServices(IServiceCollection services)
{
   ...
   services.AddServices1();
   ...
   ...
   services.AddServices2();
   ...
}

我想了解将服务注册为两个不同的生命周期的影响是什么?

我已经做了很多谷歌搜索,但我找不到任何人谈论服务注册两次但生命周期不同时会发生什么。在解析此服务时,Kestrel DI 如何决定使用哪种生命周期类型。

我最好的猜测是它基本上使用了最后一个注册的——第一个被扔掉了,但我不确定这是否 100% 正确。

有谁知道这个的确切工作原理?

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

解决方案


没错,当您使用 时,您将获得最新的注册服务serviceProvider.GetService<IService>();,但请记住,您也可以同时获得这两种服务,serviceProvider.GetService<IEnumerable<IService>>();在这种情况下,每种服务都有自己的生活方式。


推荐阅读