.Net Core 3.1 - 具有独立配置的多个托管服务

.Net Core 3.1 - Mutiple hosted services with independent configurations

据我所知,可以在同一个 'host' 下向 运行 添加多个托管服务,就像这个取自 Microsoft page:

的示例
public IServiceProvider ConfigureServices(IServiceCollection services)
{
    //Other DI registrations;

    // Register Hosted Services
    services.AddHostedService<GracePeriodManagerService>();
    services.AddHostedService<MyHostedServiceB>();
    services.AddHostedService<MyHostedServiceC>();
    //...
}

如果不是我创建三个不同的项目,则可以为每个项目注入三种不同的配置。

有没有办法在同一个项目中做到这一点?也许加载不同的配置文件(appsettings.json)?

喜欢:

或按文件夹分隔:

配置应用程序时,您可以定义从何处获取配置(例如,请参见 this blogpost)。每个文件都可以有一个包含您想要的设置的部分,并且各个托管服务可以使用 configuration.GetSection().

获取相关配置

您可以通过多种方式做到这一点。

最好的方法是使用 IOptions 模式: 在您的应用程序设置文件中,您可以添加:

"Position": {
    "Title": "Editor",
    "Name": "Joe Smith"
  }

你应该有一个 class 匹配上面的 json 对象:

public class PositionOptions

{
    public const string Position = "Position";

    public string Title { get; set; }
    public string Name { get; set; }
}

最后你可以通过以下方式将它注入DI容器:

services.Configure<PositionOptions>(Configuration.GetSection(
                                        PositionOptions.Position));

如果您仍想使用多个应用程序设置文件,您可以执行以下操作。

在Startup.cs中:

        private readonly IConfiguration _configurationName1;
        private readonly IConfiguration _configurationName2;
        public Startup(IConfiguration configuration)
        {
            _configurationName1 = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettingsWorker1.json")
            .Build();

            _configurationName2 = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettingsWorker2.json")
            .Build();
         }

然后您可以根据需要使用单独的配置。