Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.Net Core中的依赖项注入-后台服务中注册多个.Net Core IHostedService_C#_.net - Fatal编程技术网

C# 在.Net Core中的依赖项注入-后台服务中注册多个.Net Core IHostedService

C# 在.Net Core中的依赖项注入-后台服务中注册多个.Net Core IHostedService,c#,.net,C#,.net,我有一个.NETCore(v2.2)API。该API使用一些外部服务调用。我们想让他们像火一样忘记电话。我们使用.net核心后台服务来实现这一点。我们有多种后台服务。现在,如果我在依赖项注入中注册所有这些IHostedService,最后注册的后台服务可以工作,而其他服务在项目的构造函数注入中则为null。注册依赖项,如: services.AddHostedService<BackgroundServiceA>(); services.AddHostedService<Ba

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

services.AddHostedService<BackgroundServiceA>();
 services.AddHostedService<BackgroundServiceB>();
services.AddHostedService();
services.AddHostedService();
此外,我还尝试将它们添加为:

 services.AddSingleton<IHostedService, BackgroundServiceA>();
 services.AddSingleton<IHostedService, BackgroundServiceB>();
services.AddSingleton();
services.AddSingleton();
在这两种情况下,只有BackgroundServiceB工作,BackgroundServiceA在构造函数注入中为空

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

  var services = serviceProvider.GetServices<IHostedService>();
 _backgroundServiceA = services.First(o => o.GetType() == typeof(BackgroundServiceA)) as BackgroundServiceA;
var services=serviceProvider.GetServices();
_backgroundServiceA=services.First(o=>o.GetType()==typeof(backgroundServiceA))作为backgroundServiceA;
这是处理此类问题的好方法,还是我在注册依赖项时遗漏了什么


另外,我们是否可以并行触发这两个后台调用?

尝试通过
AddHostedService
在单独的
ConfigureServices
启动外调用来注册它们,如中所述:

公共静态void Main(字符串[]args) { CreateHostBuilder(args.Build().Run(); }

公共静态IHostBuilder CreateHostBuilder(字符串[]args)=>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder=>
{
webBuilder.UseStartup();
})
.ConfigureServices(服务=>
{
services.AddHostedService();
services.AddHostedService();
});

尝试通过
AddHostedService
单独调用
ConfigureServices
在启动外部调用来注册它们,如中所述:

公共静态void Main(字符串[]args) { CreateHostBuilder(args.Build().Run(); }

公共静态IHostBuilder CreateHostBuilder(字符串[]args)=>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder=>
{
webBuilder.UseStartup();
})
.ConfigureServices(服务=>
{
services.AddHostedService();
services.AddHostedService();
});

避免直接访问托管服务


使用中间服务,如“排队后台任务”中所述避免直接访问托管服务

使用中间服务,如“排队后台任务”中所述(编辑,我最初回答了错误的问题…)

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

但是,您可以使用工厂方法再次注册每个服务,以定位后台单例实例

services.AddHostedService();
services.AddHostedService();
services.AddSingleton(p=>p.GetServices().OfType().Single());
services.AddSingleton(p=>p.GetServices().OfType().Single());
(编辑,我最初回答了错误的问题……)

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

但是,您可以使用工厂方法再次注册每个服务,以定位后台单例实例

services.AddHostedService();
services.AddHostedService();
services.AddSingleton(p=>p.GetServices().OfType().Single());
services.AddSingleton(p=>p.GetServices().OfType().Single());

我更新了问题。我也尝试将它们添加为AddHostedService。没用,我更新了问题。我也尝试将它们添加为AddHostedService。它不起作用。它不是一个排队的后台服务,它是一个简单的后台服务,我们重写了ExecuteASync方法。它不是一个排队的后台服务,它是一个简单的后台服务,我们重写ExecuteAsync方法。如果我们将其设置为singleton,并且如果后台流程方法中有一些变量包含特定于客户的值,它会对多租户应用程序产生影响吗?如果我们将其设置为单例,并且如果后台处理方法中有一些变量包含特定于客户的值,它会对多租户应用程序产生影响吗?
public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        })
        .ConfigureServices(services =>
        {
            services.AddHostedService<BackgroundServiceA>();
            services.AddHostedService<BackgroundServiceB>();
        });