如何为 .NET Core 中的 Web 主机和托管服务注入相同的依赖对象?
How to inject same dependency object for both a web host and a hosted service in .NET Core?
我想使用依赖项注入将对象的相同实例注入 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"
});
}
有人描述了 the problem in more detail here 但没有提供适用于这种情况的解决方案。
您不能为启动使用依赖注入 class。原因是启动 class 实际上是在构建服务容器 之前 创建的。如果您考虑启动 class 的两个主要目的之一是什么,那么它也是有道理的:Startup.ConfigureService
方法用于配置服务容器。类似于在主机构建器上使用 ConfigureServices
方法注册托管服务的方式,您也可以在启动的 ConfigureServices
方法中配置它,它会产生相同的效果。因为这两种方式配置的都是同一个服务容器。
因此,在概念上不可能在实际用于配置服务容器之前创建 Startup
class(并因此从服务容器接收依赖项)它的创作。
如果您在启动 class 中需要 Orchestrator
服务,那么您可能会做一些次优的事情:如果您需要使用此协调器配置服务容器,请考虑使用工厂之类的东西相反,或者在运行时配置东西。否则,如果您需要您的编排器影响应用程序管道,那么您可以直接将类型注入到启动的 Configure
方法中。
最后,请注意问题标题的不同之处:“为 Web 主机和托管服务注入相同的依赖关系 object”。您 能够在托管服务和网络主机 中注入依赖项。但是启动 class 不是 虚拟主机,它只是配置虚拟主机。
我想使用依赖项注入将对象的相同实例注入 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"
});
}
有人描述了 the problem in more detail here 但没有提供适用于这种情况的解决方案。
您不能为启动使用依赖注入 class。原因是启动 class 实际上是在构建服务容器 之前 创建的。如果您考虑启动 class 的两个主要目的之一是什么,那么它也是有道理的:Startup.ConfigureService
方法用于配置服务容器。类似于在主机构建器上使用 ConfigureServices
方法注册托管服务的方式,您也可以在启动的 ConfigureServices
方法中配置它,它会产生相同的效果。因为这两种方式配置的都是同一个服务容器。
因此,在概念上不可能在实际用于配置服务容器之前创建 Startup
class(并因此从服务容器接收依赖项)它的创作。
如果您在启动 class 中需要 Orchestrator
服务,那么您可能会做一些次优的事情:如果您需要使用此协调器配置服务容器,请考虑使用工厂之类的东西相反,或者在运行时配置东西。否则,如果您需要您的编排器影响应用程序管道,那么您可以直接将类型注入到启动的 Configure
方法中。
最后,请注意问题标题的不同之处:“为 Web 主机和托管服务注入相同的依赖关系 object”。您 能够在托管服务和网络主机 中注入依赖项。但是启动 class 不是 虚拟主机,它只是配置虚拟主机。