c# - 在依赖注入(inject)中注册多个 .Net Core IHostedService - .net core 中的后台服务

标签 c# .net

我有一个 .Net 核心 (v2.2) API。该 API 使用一些外部服务调用。我们想让它们像火一样忘记电话。我们使用 .net 核心后台服务来实现它。我们有多种后台服务。现在,如果我在依赖注入(inject)中注册所有这些 IHostedService,则最后注册的后台服务有效,而其他服务在项目的构造函数注入(inject)中为 null。注册依赖项,例如:

services.AddHostedService<BackgroundServiceA>();
 services.AddHostedService<BackgroundServiceB>();

此外,我尝试将它们添加为:

 services.AddSingleton<IHostedService, BackgroundServiceA>();
 services.AddSingleton<IHostedService, BackgroundServiceB>();

在这两种情况下,只有 BackgroundServiceB 有效,BackgroundServiceA 在构造函数注入(inject)中为 null。

为了处理这个问题,我使用 ServiceProvider 来获取对象。

  var services = serviceProvider.GetServices<IHostedService>();
 _backgroundServiceA = services.First(o => o.GetType() == typeof(BackgroundServiceA)) as BackgroundServiceA;

这是处理此类问题的好方法还是我在注册依赖项时遗漏了一些东西。

另外,我们可以同时触发两个后台调用吗?

最佳答案

(编辑,我最初回答错误的问题......)

依赖注入(inject)不适用于同一接口(interface)的多个实现。由于每个托管服务都注册为 IHostedService 的实现,因此可以轻松地将一个服务注入(inject)其他类型。

不过你可以重新注册每个服务,用一个工厂方法来定位后台单例实例;

services.AddHostedService<BackgroundServiceA>();
services.AddHostedService<BackgroundServiceB>();
services.AddSingleton<BackgroundServiceA>(p => p.GetServices<IHostedService>().OfType<BackgroundServiceA>().Single());
services.AddSingleton<BackgroundServiceB>(p => p.GetServices<IHostedService>().OfType<BackgroundServiceB>().Single());

编辑:反过来可能会更好;

services.AddSingleton<BackgroundServiceA>();
services.AddSingleton<IHostedService>(p => p.GetService<BackgroundServiceA>());

关于c# - 在依赖注入(inject)中注册多个 .Net Core IHostedService - .net core 中的后台服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61645020/

相关文章:

c# - 未设置时属性是否始终具有值?

.net - Visual Studio 2010 可以测试 .net 3.5 SP1 项目吗?

c# - 如何跳过读取和排序 C# 的第一行

c# - ServiceStack JSONSerializer 和 HashSet<x>

c# - 在当前屏幕上最大化 WPF 窗口

c# - 如何使用 LINQ 查询 ManagementObjectCollection,然后循环遍历返回的 ManagementObject 的 PropertyData?

c# - 在 URL 或 cookie 中安全传输对象的注意事项

c# - 以编程方式将 TortoiseSVN 与 C# 或其相关进程一起使用,以检查存储库是否是最新的

c# - 为什么我的方法只返回 IEnumerable 的第一个元素?

c# - 如何在 C# 中有效地比较两个排序的大列表?