Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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# 如何在.NETCore中为web主机和托管服务注入相同的依赖项对象?_C#_Asp.net Core_.net Core_Dependency Injection_Asp.net Core Webapi - Fatal编程技术网

C# 如何在.NETCore中为web主机和托管服务注入相同的依赖项对象?

C# 如何在.NETCore中为web主机和托管服务注入相同的依赖项对象?,c#,asp.net-core,.net-core,dependency-injection,asp.net-core-webapi,C#,Asp.net Core,.net Core,Dependency Injection,Asp.net Core Webapi,我想使用依赖注入将对象的同一实例注入到web主机和托管服务中。有办法做到这一点吗?或者是否有一些变通方法可以产生相同的结果 class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) =>

我想使用依赖注入将对象的同一实例注入到web主机和托管服务中。有办法做到这一点吗?或者是否有一些变通方法可以产生相同的结果

class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }
    public static IHostBuilder CreateHostBuilder(string[] args) =>
         Host.CreateDefaultBuilder(args)
            .ConfigureLogging(logging =>
            {
                logging.Services.AddLogging();
            })
            .ConfigureServices((hostContext, services) =>
            {
                services.AddHostedService<ExampleService>(); // Orchestrator is available in ExampleService

                services.AddSingleton<Orchestrator>();
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>(); // Orchestrator not available in "Startup"
            });
}
类程序
{
公共静态void Main(字符串[]args)
{
CreateHostBuilder(args.Build().Run();
}
公共静态IHostBuilder CreateHostBuilder(字符串[]args)=>
Host.CreateDefaultBuilder(args)
.ConfigureLogging(日志=>
{
logging.Services.AddLogging();
})
.ConfigureServices((主机上下文,服务)=>
{
services.AddHostedService();//Orchestrator在ExampleService中可用
services.AddSingleton();
})
.ConfigureWebHostDefaults(webBuilder=>
{
webBuilder.UseStartup();//Orchestrator在“Startup”中不可用
});
}

有人对此进行了描述,但没有提供在这种情况下有效的解决方案。

您不能对startup类使用依赖项注入。原因是启动类实际上是在构建服务容器之前创建的。如果考虑启动类的两个主要目的之一,那么它也有意义:使用“代码>启动”。与使用host builder上的
ConfigureServices
方法注册托管服务的方式类似,您也可以在启动的
ConfigureServices
方法中对其进行配置,并且具有相同的效果。因为这两种方法配置的是同一个服务容器

因此,在概念上不可能创建
Startup
类(并从服务容器接收依赖项),因为它实际上用于在创建服务容器之前配置服务容器

如果您需要在您的启动类中使用<代码>协调器< /代码>服务,那么您可能会做一些不理想的事情:如果需要使用这个协调器配置服务容器,请考虑使用类似工厂的东西,或者在运行时配置事物。否则,如果需要orchestrator影响应用程序管道,则可以直接将类型注入启动的

Configure
方法中


最后,请注意问题标题中的差异:“为web主机和托管服务注入相同的依赖项对象”。能够在托管服务和web主机中注入依赖项。但是startup类不是web主机,它只是配置web主机。

托管服务获得的DI图与ASP.Net中的任何其他服务(如控制器)获得的DI图相同。如果您使用的是
UseStartup
,则不需要单独配置服务。把所有这些逻辑都放在启动中。谢谢,现在你提到这一点似乎很明显。这是我决定采用的解决方案,效果很好。