#asp.net-core-mvc
#asp.net-core-mvc
Вопрос:
Я пытаюсь передать параметры классу через конструктор из файла appsettings.json. Сам файл выглядит следующим образом:
"IDP": {
"UrlCbr": "https://www.cbr-xml-daily.ru/daily_json.js",
"UrlDadata": "https://suggestions.dadata.ru/suggestions/api/4_1/rs/suggest/currency",
"DadataToken": "94dabe1e8342c21fdad9622be29514d4f0f99bbd8",
"BotToken": "1549046386:AAHJsdsaMVaCT-8O3D_P8VLxw6EKAr4P9JfSU",
"BotName": "Hop_hipBot",
"BotUrl": "https://111295d46c69.ngrok.io/{0}"
}
Для этого я создал класс IDP.cs:
public class IDP
{
public string UrlCbr { get; set; }
public string UrlDadata { get; set; }
public string DadataToken { get; set; }
public string BotToken { get; set; }
public string BotName { get; set; }
public string BotUrl { get; set; }
}
Затем в Startup.cs я устанавливаю соединение:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews().AddNewtonsoftJson();
services.Configure<IDP>(Configuration.GetSection("IDP"));
}
Мне нужны эти данные в реализации бота:
class Bot
{
private static TelegramBotClient botClient;
private static IOptions<IDP> _IDPs;
public void Temp(IOptions<IDP> IDPs)
{
_IDPs = IDPs;
}
public static async Task<TelegramBotClient> GetBotClientAsync()
{
if (botClient != null)
{
return botClient;
}
botClient = new TelegramBotClient(_IDPs.Value.BotToken);
var hook = string.Format(_IDPs.Value.BotUrl, @"api/bot");
await botClient.SetWebhookAsync(hook);
return botClient;
}
}
Ну а сам бот запускается в Startup.cs:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
Bot.GetBotClientAsync().Wait();
}
И когда вы запускаете все приложение, _IDPs
поле в боте оказывается null
. Почему это происходит и как мне нужно правильно доставить данные боту? В других классах все работает правильно, и параметры передаются
Комментарии:
1. Привет, мой ответ помог вам решить вашу проблему? Если да, не могли бы вы принять это в качестве ответа? Если нет, не могли бы вы продолжить, чтобы сообщить мне об этом? См.: Как принять в качестве ответа . Спасибо.
Ответ №1:
У вас есть ошибка в классе Bot. Изменить:
public void Temp(IOptions<IDP> IDPs)
{
_IDPs = IDPs;
}
Для :
public class Bot
{
.....
private static IOptions<IDP> _IDPs;
public Bot(IOptions<IDP> IDPs)
{
_IDPs = IDPs;
}
......
}
Ответ №2:
Измените свой код, как показано ниже:
public class Bot
{
private static IOptions<IDP> _IDPs;
public static void Temp(IOptions<IDP> IDPs)
{
_IDPs = IDPs;
}
public static async Task GetBotClientAsync()
{
var data = _IDPs.Value.BotToken;
}
}
Startup.cs:
public void ConfigureServices(IServiceCollection services)
{
//more services...
services.Configure<IDP>(Configuration.GetSection("IDP"));
var serviceProvider = services.BuildServiceProvider();
Bot.Temp(serviceProvider.GetService<IOptions<IDP>>());
Bot.GetBotClientAsync().Wait();
}