在不同的 BackgroundServices .NET Core 2.1 之间共享配置值
Sharing configuration values between different BackgroundServices .NET Core 2.1
我有一个 .NET Core 控制台应用程序,我是 运行 作为 .NET Core 2.1 中的 Windows 服务。我最终将有多个 BackgroundService
工作人员 classes 最终将进行网络调用。其中一些网络调用依赖于从它们自己的 AuthTokenWorker
BackgroundService
获取的身份验证令牌。我计划将这些代币保存在一个工作人员 class 中并与其他工作人员分享价值 classes.
我该怎么做?我可以使用 .ConfigureAppConfiguration
并使用内存中的集合吗?如果我从一个 Worker 更新该配置中的令牌,其他通过 DI 使用相同配置的人是否会收到更新后的值?执行该方法线程安全吗?
过去,我使用了通用 static Configuration
class 和 ConcurrentDictionary
以及来自不同 class 的 saved/fetched 值,但我现在.NET Core 的新手,想知道实现此目标的适当方法。
例如
Program.cs
static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostBuilderContext, serviceCollection) =>
{
serviceCollection.AddHttpClient<SClient>();
serviceCollection.AddHttpClient<DClient>();
serviceCollection.AddHostedService<SWorker>();
serviceCollection.AddHostedService<DWorker>();
}).UseWindowsService();
}
SWorker.cs
我想在 DWorker.cs
中使用 public 属性
public SClient(ILogger<STSTokenClient> logger, HttpClient client)
{
_logger = logger;
_client = client;
}
public SToken Token { get; internal set;}
因为我需要一个对象来引用属性,我可以通过构造函数注入它吗?
DWorker.cs
public DWorker(ILogger<DWorker> logger, SWorker sWorker,
DClient dClient)
{
_logger = logger;
_sWorker = sWorker;
_dClient = dClient;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
...
var token = await _dClient.FetchTokenAsync(_sWorker.Token);
}
I plan on saving those tokens within one worker class and sharing the value with the other worker classes.
改变配置 可能 可行,但这是解决此问题的一种奇怪方法。更自然的方法是使用类似 IMemoryCache
和众所周知的密钥。
请注意,IMemoryCache
的 GetOrCreate
和 GetOrCreateAsync
扩展方法是 而非 原子的。如果你想要一个异步兼容的“刷新这个令牌,但如果它已经被刷新然后共享那个刷新请求”这样的操作,那么你需要自己构建它。如果您需要,我有一个 AsyncCache
可以提供帮助。
我有一个 .NET Core 控制台应用程序,我是 运行 作为 .NET Core 2.1 中的 Windows 服务。我最终将有多个 BackgroundService
工作人员 classes 最终将进行网络调用。其中一些网络调用依赖于从它们自己的 AuthTokenWorker
BackgroundService
获取的身份验证令牌。我计划将这些代币保存在一个工作人员 class 中并与其他工作人员分享价值 classes.
我该怎么做?我可以使用 .ConfigureAppConfiguration
并使用内存中的集合吗?如果我从一个 Worker 更新该配置中的令牌,其他通过 DI 使用相同配置的人是否会收到更新后的值?执行该方法线程安全吗?
过去,我使用了通用 static Configuration
class 和 ConcurrentDictionary
以及来自不同 class 的 saved/fetched 值,但我现在.NET Core 的新手,想知道实现此目标的适当方法。
例如
Program.cs
static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostBuilderContext, serviceCollection) =>
{
serviceCollection.AddHttpClient<SClient>();
serviceCollection.AddHttpClient<DClient>();
serviceCollection.AddHostedService<SWorker>();
serviceCollection.AddHostedService<DWorker>();
}).UseWindowsService();
}
SWorker.cs
我想在 DWorker.cs
public SClient(ILogger<STSTokenClient> logger, HttpClient client)
{
_logger = logger;
_client = client;
}
public SToken Token { get; internal set;}
因为我需要一个对象来引用属性,我可以通过构造函数注入它吗?
DWorker.cs
public DWorker(ILogger<DWorker> logger, SWorker sWorker,
DClient dClient)
{
_logger = logger;
_sWorker = sWorker;
_dClient = dClient;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
...
var token = await _dClient.FetchTokenAsync(_sWorker.Token);
}
I plan on saving those tokens within one worker class and sharing the value with the other worker classes.
改变配置 可能 可行,但这是解决此问题的一种奇怪方法。更自然的方法是使用类似 IMemoryCache
和众所周知的密钥。
请注意,IMemoryCache
的 GetOrCreate
和 GetOrCreateAsync
扩展方法是 而非 原子的。如果你想要一个异步兼容的“刷新这个令牌,但如果它已经被刷新然后共享那个刷新请求”这样的操作,那么你需要自己构建它。如果您需要,我有一个 AsyncCache
可以提供帮助。