.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)?
喜欢:
- 对于托管服务 GracePeriodManagerService appsettings.graceperiod.json
- 对于托管服务 MyHostedServiceB appsettings.myHostedServiceB.json
或按文件夹分隔:
- 对于托管服务 GracePeriodManagerService GracePeriodManagerService\appsettings.json
- 对于托管服务 MyHostedServiceB MyHostedServiceB\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();
}
然后您可以根据需要使用单独的配置。
据我所知,可以在同一个 '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)?
喜欢:
- 对于托管服务 GracePeriodManagerService appsettings.graceperiod.json
- 对于托管服务 MyHostedServiceB appsettings.myHostedServiceB.json
或按文件夹分隔:
- 对于托管服务 GracePeriodManagerService GracePeriodManagerService\appsettings.json
- 对于托管服务 MyHostedServiceB MyHostedServiceB\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();
}
然后您可以根据需要使用单独的配置。