Как загрузить данные при запуске приложения веб-API .net core 6.0?

Я хотел бы загрузить данные файла в кэш-память на program.cs(.net core 6.0), и загруженные данные будут использоваться во многих службах.

Поэтому я ввел builder.Services.AddMemoryCache(); в исходный код.

Но потом я не знаю, как использовать этот кеш памяти прямо здесь (в program.cs).

В предыдущей версии с помощью метода Configure и параметра IMemoryCache cache я мог загружать данные с кешем памяти, как показано в следующем блоке кода.

public void Configure(IMemoryCache cache)
{
    cache.set(...);
    cache.get(...);
}

Я разрабатываю веб-API .net core 6.0. Кто-нибудь знает, как инициализировать данные в program.cs в .net core 6.0?

Итак, вы хотите написать IHostedService / BackgroundService для запуска при запуске хоста? Хотя вы можете подождать до IHostApplicationLifetime.ApplicationStarted, если хотите обрабатывать запросы во время прогрева кеша.

Jeremy Lakeman 17.05.2022 03:01

@JeremyLakeman Спасибо за ваш ответ. Я новичок в работе с .net core framework. Я учусь сейчас. Итак, можете ли вы предложить какую-либо ссылку, по которой я могу научиться писать IHostService/BackgroundService?

takeyourcode 17.05.2022 03:05

Первый результат Google — хорошее место для начала. docs.microsoft.com/en-us/aspnet/core/fundamentals/host/… В котором показаны несколько распространенных вариантов использования, охватывающих множество часто задаваемых вопросов.

Jeremy Lakeman 17.05.2022 03:07

@JeremyLakeman Спасибо! Мне просто любопытно... Это общий способ инициализации данных на стартовом сервере?

takeyourcode 17.05.2022 03:09

Для ленивой инициализации после того, как API доступен, также есть stackoverflow.com/a/66996436/4139809, но его сложнее тестировать.

Jeremy Lakeman 17.05.2022 03:14
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
46
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ниже приведена рабочая демонстрация, вы можете обратиться к ней.

Опция 1

Сделайте это после сборки веб-хоста в Program.cs:

...
builder.Services.AddMemoryCache();
var app = builder.Build();
var cache=app.Services.GetRequiredService<IMemoryCache>();
cache.Set("key1", "value1");
...

Вариант 2

Используйте размещенную службу для инициализации кеша:

public class InitializeCacheService : IHostedService
    {
        private readonly IServiceProvider _serviceProvider;
        public InitializeCacheService (IServiceProvider serviceProvider)
        {
            _serviceProvider = serviceProvider;
        }

        public Task StartAsync(CancellationToken cancellationToken)
        {
            using (var scope = _serviceProvider.CreateScope())
            {
                var cache = _serviceProvider.GetService<IMemoryCache>();

                cache.Set("key1", "value1");
            }

            return Task.CompletedTask;
        }

        public Task StopAsync(CancellationToken cancellationToken)
        {
            return Task.CompletedTask;
        }
    }

В Program.cs добавьте следующий код:

builder.Services.AddMemoryCache();
builder.Services.AddHostedService<InitializeCacheService>();

ValuesController (все два варианта используют этот контроллер)

    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        private readonly IMemoryCache _cache;
        public ValuesController(IMemoryCache cache)
        {
            _cache = cache;

        }
        [HttpGet("{key}")]
        public ActionResult<string> Get(string key)
        {
            //_cahce.Count is 0
            if (!_cache.TryGetValue(key, out var value))
            {
                return NotFound($"The value with the {key} is not found");
            }

            return value + "";
        }
    }

Результат:

Обновлять

Спасибо за идеальный ответ. Я действительно впечатлен.

takeyourcode 17.05.2022 07:06

Я попытался применить вариант 1, но это не сработало. Чем отличается ваш ответ, я обернул строку requiredservice и строку cache.set/get с помощью using (var scope = app.Services.CreateScope()) . Это проблема?

takeyourcode 17.05.2022 07:08

Можете ли вы поделиться дополнительным кодом, который вы использовали? И ошибка, которую вы встречаете? @возьми твой код

Qing Guo 17.05.2022 07:29
using (var scope = app.Services.CreateScope()) { var services = scope.ServiceProvider; var context = services.GetRequiredService<IMemoryCache>(); context.Set("test", "aaaaaa"); Console.WriteLine(context.Get("test")); } И вывод консоли был пуст, но ваше решение работает хорошо. Это проблема?
takeyourcode 17.05.2022 07:43

@takeyourcode Я пробую ваш код, но вывод консоли имеет аааааа.

Qing Guo 17.05.2022 07:55

Gua Это так странно.. Ладно, я попробую еще раз. И ваш вариант 2 тоже попробую для своего навыка. Удачи тебе!

takeyourcode 17.05.2022 17:52

Это была моя ошибка.. Я проверил, все работает. Действительно спасибо за ваш ответ!

takeyourcode 17.05.2022 18:21

Другие вопросы по теме