gpt4 book ai didi

c# - 带有参数的服务的单例

转载 作者:行者123 更新时间:2023-12-04 08:10:06 24 4
gpt4 key购买 nike

在 DI 容器中创建一个单例,以下是一种可行的方法吗?

public void ConfigureServices(IServiceCollection services)
{
var botClient = new TelegramBotClient(_config["Tokens:Telegram"]);
services.AddSingleton(botClient);
}
TelegramBotClient 来自我正在使用的库,所以我无法开始更改它。

最佳答案

使用配置处理 DI 服务的更正统方法是使用 IOptions图案。这样,您就不会将启动对象与服务紧密耦合。就目前而言,如果您的配置发生更改,您必须修改您的启动对象。
一种解决此问题并保持您的关注点分开的方法,请看一下:

TelegramBotClientService.cs

public interface ITelegramBotClientService
{
Task DoSomethingAsync();
}

public sealed class TelegramBotClientService : ITelegramBotClientService
{
private readonly TelegramConfigModel _config;

public TelegramBotClientService(IOptions<TelegramConfigModel> options)
{
_config = options.Value;
}

public Task DoSomethingAsync()
{
var token = _config.Token;
// ...
}
}

Startup.cs

// ...
public void ConfigureServices(IServiceCollection services)
{
services.Configure<TelegramConfigModel>(
Configuration.GetSection("TelegramConfig"));

services.AddSingleton<ITelegramBotClientService, TelegramBotClientService>();
}
// ...

appsettings.json

{
"TelegramConfig": {
"Token": "12345"
}
}

TelegramConfigModel.cs

public sealed class TelegramConfigModel
{
public string Token { get; set; }
}
这尚未经过测试,因此某处可能存在拼写错误,但是,现在您的关注点已分开。 DI 管道现在正在执行实例化并注入(inject)您的配置。

A side note


我注意到你可能会注入(inject)一个单例来维护一个机器人。我强烈建议您使用 IHostedServiceBackgroundService并使用 AddHostedService 注入(inject)维护类似机器人的东西。

关于c# - 带有参数的服务的单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66017807/

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