#entity-framework #.net-core #configuration
Вопрос:
Приложение .Net Core 3.1. Настройка служб в Startup.cs настраивает DbContext EF Core 5. Одну из «статических» таблиц я хочу загрузить в память и сделать доступной с помощью дополнительных опций, чтобы сделать таблицу доступной для использования во всем приложении (кэширование дешевого человека). То же самое, что и привязка из приложений, но с использованием основной базы данных EF.
Я уже «запустил» базу данных в основном, создав область и заставив службу DbContext запустить метод инициализации. Этот метод не сработает в данном случае, потому что я добавляю услугу. Есть ли способ прочитать DbContext, пока я все еще нахожусь в службах конфигурации? Способ добавить службу после того, как хост построен, но не запущен?
Как бы вы подошли к этому?
Комментарии:
1. Простое решение состоит в том, чтобы не использовать DI для любого DbContext, который вам нужен при запуске; просто «новый» в
using
блоке. Также этот шаблон необходим, когда ваш DI DbContext настроен на основе данных в текущем запросе (например, мультитенантный).
Ответ №1:
Разве ты не знаешь? Я отправил вопрос и продолжал переформулировать свои поисковые запросы, копать и вуаля.
Использование функций IConfigureOptions
Поэтому я создал класс
using MyContexts;
using MyModels;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using System.Linq;
public class LoadMySettings : IConfigureOptions<MySettings>
{
private readonly IServiceScopeFactory _serviceScopeFactory;
public LoadMySettings(IServiceScopeFactory serviceScopeFactory)
{
_serviceScopeFactory = serviceScopeFactory;
}
public void Configure(MySettings options)
{
using (var scope = _serviceScopeFactory.CreateScope())
{
var provider = scope.ServiceProvider;
using (var dbContext = provider.GetRequiredService<MyContext>())
{
options.MySettingsList = dbContext.MySettingsTable.ToList();
}
}
}
}
и встроил это в сервисы конфигурации:
services.AddSingleton>IConfigureOptions<MySettinmgs>, LoadMySettings>();