Я хотел бы загрузить данные файла в кэш-память на 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?
@JeremyLakeman Спасибо за ваш ответ. Я новичок в работе с .net core framework. Я учусь сейчас. Итак, можете ли вы предложить какую-либо ссылку, по которой я могу научиться писать IHostService
/BackgroundService
?
Первый результат Google — хорошее место для начала. docs.microsoft.com/en-us/aspnet/core/fundamentals/host/… В котором показаны несколько распространенных вариантов использования, охватывающих множество часто задаваемых вопросов.
@JeremyLakeman Спасибо! Мне просто любопытно... Это общий способ инициализации данных на стартовом сервере?
Для ленивой инициализации после того, как API доступен, также есть stackoverflow.com/a/66996436/4139809, но его сложнее тестировать.
Ниже приведена рабочая демонстрация, вы можете обратиться к ней.
Опция 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 + "";
}
}
Результат:
Спасибо за идеальный ответ. Я действительно впечатлен.
Я попытался применить вариант 1, но это не сработало. Чем отличается ваш ответ, я обернул строку requiredservice и строку cache.set/get с помощью using (var scope = app.Services.CreateScope())
. Это проблема?
Можете ли вы поделиться дополнительным кодом, который вы использовали? И ошибка, которую вы встречаете? @возьми твой код
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 Я пробую ваш код, но вывод консоли имеет аааааа.
Gua Это так странно.. Ладно, я попробую еще раз. И ваш вариант 2 тоже попробую для своего навыка. Удачи тебе!
Это была моя ошибка.. Я проверил, все работает. Действительно спасибо за ваш ответ!
Итак, вы хотите написать
IHostedService
/BackgroundService
для запуска при запуске хоста? Хотя вы можете подождать доIHostApplicationLifetime.ApplicationStarted
, если хотите обрабатывать запросы во время прогрева кеша.