gpt4 book ai didi

c# - 如何在 .Net Core 3 Worker 服务中设置应用程序设置

转载 作者:太空狗 更新时间:2023-10-30 01:12:34 26 4
gpt4 key购买 nike

我一直在查看有关在 .Net Core 3 中读取 appsettings.json 的许多教程和 SO 问题(例如 App Settings .Net Core),但在处理 Worker 服务时我找不到任何关于操作方法的指示。没有启动方法。相反,我有一个带有主要方法的 Program.cs:

public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
});
}

如何从 .Net Core 3 中的 Worker 服务项目中的 appsettings.json 文件读取数据?

我添加了对我使用 .Net v4.8 创建的自定义 WCF 客户端的引用,以及另一个在整个解决方案之间共享所有业务域对象的项目。我的解决方案主要是 .Net v4.8,我想使用 Worker Service。客户端项目通过代码在内部创建一个 WCF 客户端,因此所有绑定(bind)和端点都是可配置的。如果这是一个 .Net v4.8 项目,我会在 app.config 中添加以下内容:

<appSettings>
...
<add key="AminServiceUri" value="http://localhost:45108/ServiceHost/v1/AminService.svc" />
<add key="BillServiceUri" value="http://localhost:45108/ServiceHost/v1/BillService.svc" />
<add key="CustomerServiceUri" value="http://localhost:45108/ServiceHost/v1/CustomerService.svc" />
<add key="EpayServiceUri" value="http://localhost:45108/ServiceHost/v1/EpayService.svc" />
<add key="FinanceServiceUri" value="http://localhost:45108/ServiceHost/v1/FinanceService.svc" />
<add key="GrpServiceUri" value="http://localhost:45108/ServiceHost/v1/GrpService.svc" />
<add key="MetaServiceUri" value="http://localhost:45108/ServiceHost/v1/MetaService.svc" />
<add key="ReportServiceUri" value="http://localhost:45108/ServiceHost/v1/ReportService.svc" />
<add key="ServiceInfoServiceUri" value="http://localhost:45108/ServiceHost/v1/ServiceInfoService.svc" />
<add key="UsersServiceUri" value="http://localhost:45108/ServiceHost/v1/UsersService.svc" />
...
<add key="ExcessiveLogging" value="false" />
...
</appSettings>

现在我需要这些设置采用新的 JSON 格式并读入。

编辑

这是一个新的项目。 worker 没有做任何事情:

public class Worker : BackgroundService
{
private readonly ILogger<Worker> logger;

public Worker(ILogger<Worker> logger)
{
this.logger = logger;
}

protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
await Task.Delay(5000, stoppingToken);
}
}
}

下面是我如何获得这个项目类型:

Worker Service

最佳答案

例如,如果 worker 类需要访问存储在您的应用程序设置中的某些数据

public class Worker : BackgroundService {
private readonly ILogger<Worker> logger;
private readonly WorkerOptions options;

public Worker(ILogger<Worker> logger, WorkerOptions options) {
this.logger = logger;
this.options = options;
}

protected override async Task ExecuteAsync(CancellationToken stoppingToken) {
while (!stoppingToken.IsCancellationRequested) {
//do something that uses options

logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
await Task.Delay(5000, stoppingToken);
}
}
}

WorkerOptions 存储配置中的值的位置。

public class WorkerOptions {
public string AminServiceUri { get; set; }
public string BillServiceUri { get; set; }

//... other properties
}

假定 appsettings.json 文件具有相应的键

{
"WCF": {
"AminServiceUri":"http://localhost:45108/ServiceHost/v1/AminService.svc",
"BillServiceUri":"http://localhost:45108/ServiceHost/v1/BillService.svc",

//...other key-value pairs
},
"Logging": {
"ExcessiveLogging": false
}

}

默认情况下 Host.CreateDefaultBuilder 将设置通常的配置(appsettings.json 等)。

使用 hostContext.Configuration 获取可用于访问所需设置的 IConfiguration 实例并为其添加强类型对象模型。将该对象添加到服务集合中,以便它可以在需要的地方注入(inject)

例如

public class Program {
public static void Main(string[] args) {
CreateHostBuilder(args).Build().Run();
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) => {
IConfiguration configuration = hostContext.Configuration;

WorkerOptions options = configuration.GetSection("WCF").Get<WorkerOptions>();

services.AddSingleton(options);

services.AddHostedService<Worker>();
});
}

当创建 worker 时,它将被注入(inject)所需的依赖项。

引用 Configuration in ASP.NET Core

关于c# - 如何在 .Net Core 3 Worker 服务中设置应用程序设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58183920/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com