Передача выбранной базы данных в DBcontext через DI - PullRequest
0 голосов
/ 29 августа 2018

Вот мой сценарий. Представьте себе экран с выпадающим списком штатов США. Этот список заполняется из одной базы данных администратора. В зависимости от выбора других предметов на экране заполняются другие базы данных. у нас есть база данных для каждого государства, которые совместно используют одну схему. У меня нет проблем с использованием DI для выпадающего списка States. Однако у меня возникли проблемы с получением выбранного состояния. Я проверил жесткое кодирование состояния и DI работает нормально. Я хотел бы использовать Session для этого, но я читал, что вы не можете и, честно говоря, я не смог заставить его работать. Мы ценим любые предложения.

        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
        services.AddScoped(p => p.GetService<IHttpContextAccessor>()?.HttpContext);


        services.AddDbContext<AdminManagement.Data.AdminDataContext>(options =>
            options.UseSqlServer(Configuration.GetSection("Connections:myAdmin").Value).UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking));          

        //this is the issue here I want to be able to pass the selected state 
        services.AddDbContext<CollectionDataContext>((serviceProvider, builder) =>
        {
            //I wish I could use this...any alternatives?
            //HttpContext.Session.GetString("SelectedState");

            //hardcoded for testing purposes. it works ok 
            var selectedDb = "SC"; 

            //this gets the connection string from app settings, later I will get it from an API
            var connectionString = GetConnectionStringFromService(selectedDb);
            builder.UseSqlServer(connectionString);
        });

        //my one admin database Data context
        services.AddScoped<AdminManagement.Data.AdminManagementQueries>();

        // my multiple databases clases that use DI
        services.AddScoped<CollectionManagementQueries>();
        services.AddScoped<CollectionManagementCommands>();

1 Ответ

0 голосов
/ 29 августа 2018

Вам необходимо получить контекст у поставщика услуг. Это делается через:

var httpContextAccessor = serviceProvider.GetRequiredService<IHttpContextAccessor>();

Затем вы можете сделать что-то вроде:

var selectedDb = httpContextAccessor.HttpContext.Session.GetString("SelectedState");

Обратите внимание, что IHttpContextAccessor не зарегистрирован по умолчанию. Вы можете исправить это, добавив в ConfigureServices следующее:

services.AddHttpContextAccessor();
...