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