gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 02:07:34 26 4
gpt4 key购买 nike

我有一个 .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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com