c# - 在 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% 正确。
有谁知道这个的确切工作原理?
解决方案
没错,当您使用 时,您将获得最新的注册服务serviceProvider.GetService<IService>();
,但请记住,您也可以同时获得这两种服务,serviceProvider.GetService<IEnumerable<IService>>();
在这种情况下,每种服务都有自己的生活方式。
推荐阅读
- networking - 我可以使用反向代理直接连接数据库吗?
- ios - 使用 Apple 登录刷新令牌验证仅返回访问令牌
- macos - 每当我在 Mac 上打开 Hyper 时,我的屏幕都会黑屏几秒钟
- mysql - 节点mysql ER_PARSE_ERROR 1064
- linux - 为 git commit 添加别名,这样就不需要引号
- optaplanner - Optaplanner 约束流分数计算问题
- linux-kernel - 在 Linux 中,如何测量/采样 GPIO 脉冲宽度
- flutter - Dart 封装列表(仅用于观察值)
- php - 站点生成的ip秒php
- python - 在 colaboratory 哪里导入 pygame 包?