. NET Внедрение основных зависимостей - много баз данных, один DbContext - PullRequest
0 голосов
/ 16 июня 2020

У меня есть приложение ASP. NET Core, использующее DI из Microsoft.Extensions.DependencyInjection. Приложение подключается к дурацкому количеству баз данных с одним и тем же интерфейсом, скажем, к 100 из них. Я хочу оформить их все одним и тем же DbContext, например ExternalDbContext. Единственная разница между ними - это строка подключения, которую они используют. Мне нужно создать правильную версию контекста для данного запроса. Таким образом, цепочка разрешений будет go следующим образом:

  1. Пользователь делает запрос с параметром provider = 'ABCD'.
  2. Это отображается на действие в контроллере, который имеет an ISomeService как зависимость.
  3. У этой службы есть метод DoStuff(string provider).
  4. Вот самая важная часть. Для ISomeService требуется зависимость от уровня данных, но это не может быть жесткой зависимостью от введенного ExternalDbContext, так как это должно быть разрешено динамически. Моя идея - иметь IExternalDbContextFactory, который, в свою очередь, может принимать IServiceProvider. У этой фабрики будет метод GetExternalDbContext(string provider), и я бы разрешил правильный ExternalDbContext с помощью внедренного поставщика услуг.

Для этого мне пришлось бы зарегистрировать ExternalDbContexts таким образом, чтобы позвольте мне разрешить их из IServiceProvider на основе строкового параметра. По очевидным причинам я не хочу иметь 100 разных бесполезных классов маркеров, унаследованных от ExternalDbContext, а затем регистрировать их независимо. Также я бы предпочел как-то использовать удобный метод AddDbContext.

Я, очевидно, мог бы полностью построить свою собственную инфраструктуру разрешения, но я бы предпочел повторно использовать существующее решение, чем тратить дни на написание и тестирование шаблона для этого конкретного использования чехол.

1 Ответ

2 голосов
/ 16 июня 2020

Вы можете управлять строками подключения, используя перегрузку AddDbContext, которая предоставляет вам доступ к IServiceProvider:

public void ConfigureServices(IServiceCollection services)
{
    services
        .AddEntityFrameworkSqlServer()
        .AddDbContext<ExternalDbContext>((serviceProvider, options) =>
        {
             var connectionString = serviceProvider.GetService // get service 
             // which can determine connection string
             .GetConnectionString();
              options.UseSqlServer(connectionString);
         });
       }
}

Например, вы можете разрешить IHttpContextAccessor там и проверить параметр запроса.

...