C# 接受参数的服务的单例

C# 接受参数的服务的单例,c#,asp.net-core,C#,Asp.net Core,在DI容器中创建一个单例,下面的方法可以吗 public void ConfigureServices(IServiceCollection services) { var botClient = new TelegramBotClient(_config["Tokens:Telegram"]); services.AddSingleton(botClient); } 客户端来自我正在使用的库,因此我无法开始更改它。处理配置的DI服务的一种更合适的方法是使用

在DI容器中创建一个单例,下面的方法可以吗

public void ConfigureServices(IServiceCollection services)
{
    var botClient = new TelegramBotClient(_config["Tokens:Telegram"]);
    services.AddSingleton(botClient);
}

客户端来自我正在使用的库,因此我无法开始更改它。

处理配置的DI服务的一种更合适的方法是使用
IOptions
模式。这样,您就不会将启动对象与服务紧密耦合。现在,如果您的配置发生更改,您必须修改启动对象

要解决这一问题并将您的顾虑分开,请查看以下内容:

TelegramBotClientService.cs

电报模式.cs

这还没有经过测试,所以可能有一个打字错误的地方,但现在你的关注是分开的。DI管道现在正在进行实例化并注入您的配置

旁注


我注意到你可能正在注射一个单体来维护一个机器人。我强烈建议您使用
IHostedService
BackgroundService
并使用
AddHostedService
注入来维护类似于机器人的东西。

只要它不报告任何设计时错误,就可以了。如果您运行并测试它,并将该实例注入,它就更正常了。感谢@Andy通过
IOptions
:)学到了一些新的东西。您在构造函数
TelegramBotClientService
中只有一个小的输入错误,我想你指的是类型
IOptions
,而不是
IOptions
。我确实利用了主机:
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;
        // ...
    }
}
// ...
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<TelegramConfigModel>(
            Configuration.GetSection("TelegramConfig"));

    services.AddSingleton<ITelegramBotClientService, TelegramBotClientService>();
}
// ...
{
    "TelegramConfig": {
        "Token": "12345"
    }
}
public sealed class TelegramConfigModel
{
    public string Token { get; set; }
}