Загрузите таблицу базы данных как IOption при запуске

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