Как я могу добавить dbContext после запуска в .Net Core? - PullRequest
1 голос
/ 24 мая 2019

Я использую .Net Core, используя встроенное внедрение зависимостей. На моем экране входа в систему мне нужно, чтобы пользователь также выбрал ведомственную базу данных - у нас есть разные базы данных с одинаковой структурой, чтобы использовать одно и то же приложение с разными данными. Однако я не могу понять, как добавить / изменить dbContext так поздно. Startup.cs имеет DI, но я не знаю, какую строку подключения считать из конфигурации, пока пользователь не выберет отдел. Это небольшая база данных, и компания не заботится об управлении дублирующимися базами данных.

Как я могу добавить услугу поздно

services.AddDbContext<my_accountingContext>(options =>
options.UseMySQL(Configuration.GetConnectionString("CorrectDepartmentConfig")));

когда я на самом деле знаю, что такое CorrectDepartmentConfig?

Или, если это невозможно, как я могу сделать вонючее изменение my_accountingContext после Startup.cs?

Ответы [ 2 ]

1 голос
/ 24 мая 2019

Вы можете использовать перегрузку фабрики реализации IServiceCollection в методе ConfigureServices класса Startup:

//First register a custom made db context provider
services.AddTransient<ApplicationDbContextFactory>();
//Then use implementation factory to get the one you need
services.AddTransient(provider => provider.GetService<ApplicationDbContextFactory>().CreateApplicationDbContext());

Реализация CreateApplicationDbContext зависит от того, что именно вы хотите, но основы метода должны выглядеть следующим образом:

public ApplicationDbContext CreateApplicationDbContext(){
  //TODO Something clever to create correct ApplicationDbContext with ConnectionString you need.
} 

Как только это будет реализовано, вы можете ввести правильный ApplicationDbContext в свой контроллер, действие ...

public MyController(ApplicationDbContext dbContext)
{
    _dbContext = dbContext;
}

public IActionResult([FromServices] ApplicationDbContext dbContext){
}
0 голосов
/ 24 мая 2019

Вы всегда можете установить строку подключения изнутри защищенного метода OnConfiguring.Оттуда вы можете получить доступ к экземпляру IConfiguration (класс DbContext имеет локатор служб, свойство Instance), получить строку подключения и затем вызвать метод расширения UseMySql с соответствующим подключением.

Что-то вроде этого:

protected virtual void OnConfiguring(DbContextOptionsBuilder builder)
{
    var configuration = (this as IInfrastructure<IServiceProvider>).GetService<IConfiguration>();
    var connectionString = configuration.GetConnectionString("<name>");
    builder.UseMySql(connectionString);
    base.OnConfiguring(builder);
}

Для строго типизированной версии GetService не забудьте сослаться на пространство имен Microsoft.Extensions.DependencyInjection.

...