C# 如何在.NETCore中为web主机和托管服务注入相同的依赖项对象?
我想使用依赖注入将对象的同一实例注入到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) =>
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
,则不需要单独配置服务。把所有这些逻辑都放在启动中。谢谢,现在你提到这一点似乎很明显。这是我决定采用的解决方案,效果很好。