我最近开始学习 DDD,根据我已经学到的知识,我尝试使用 NuGet 包编写一个电报机器人Telegram.Bot
,同时创建项目结构。现在我的任务是BotSettings
从appsettings.json
C# 类中传输该部分。目前我只需要一个独特的机器人令牌
appsettings.json
:
{
"Logging": {
...
},
...,
"BotSettings":
{
"Token": "*В этой строке находится токен бота*"
}
}
目前我的 POCO 类如下所示:
namespace TelegramBot.Domain.POCOs;
public class BotConfiguration
{
public string? Token { get; init; }
}
在同一个命名空间中,我为扩展方法创建了另一个静态类,如下所示:Configuration
IServiceCollection
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
namespace TelegramBot.Domain.POCOs;
public static class Configuration
{
public static IServiceCollection AddTOptions(this IServiceCollection services, IConfiguration config)
{
IConfigurationSection section = config.GetSection("Bot");
if (section.Value == null)
{
throw new NullReferenceException("Services.AddTOptions: there no \"Bot\" section in appsettings.json");
}
services.Configure<BotConfiguration>(config.GetSection("Bot"));
return services;
}
}
但出乎意料的是,预编译报告它不知道Configure<>()方法。我尝试在网上查找原因和解决方案,但没有找到合适的。使用其中一个选项(这是使用绑定.Bind()
并将 POCO 类添加为服务.AddSingleton() | .AddScope() | .AddTransient()
)。
进入主项目文件后program.cs
,我注意到它只知道Configure()
和Bind()
。
program.cs
:
using Telegram.Bot.Polling;
using TelegramBot.Application.Services;
using TelegramBot.Domain.Interfaces;
using TelegramBot.Service;
using TelegramBot.Domain.POCOs;
IHost host = Host.CreateDefaultBuilder(args)
.ConfigureServices((hostCtx, services) =>
{
// services.AddTOptions(hostCtx.Configuration);
services.AddHostedService<Worker>();
services.Configure<BotConfiguration>(hostCtx.Configuration.GetSection("Bot")); // без проблем
services.AddSingleton<IUpdateHandler, UpdateHandler>();
services.AddSingleton<IBot, Bot>();
services.AddSingleton<IStoppingToken, StoppingToken>();
})
.Build();
host.Run();
Configuration
请帮助我,如何解决即使我使用存储这些扩展方法的用户名也看不到这两个扩展方法的事实?先感谢您。
正如 @EvgeniyZ所说,在我的项目中,包含相同的静态文件,只是没有带有扩展方法的包。要将选项添加到依赖注入,您需要从 NuGet 安装该包
Microsoft.Extensions.Options.ConfigurationExtensions
。现在一切都按其应有的方式进行。Evgeniy,非常感谢您参与解决我的问题!