Параметры не передаются классу

#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();

}
 

Результат:
введите описание изображения здесь