У меня есть приложение ASP. NET Core, использующее DI из Microsoft.Extensions.DependencyInjection
. Приложение подключается к дурацкому количеству баз данных с одним и тем же интерфейсом, скажем, к 100 из них. Я хочу оформить их все одним и тем же DbContext, например ExternalDbContext
. Единственная разница между ними - это строка подключения, которую они используют. Мне нужно создать правильную версию контекста для данного запроса. Таким образом, цепочка разрешений будет go следующим образом:
- Пользователь делает запрос с параметром
provider = 'ABCD'
. - Это отображается на действие в контроллере, который имеет an
ISomeService
как зависимость. - У этой службы есть метод
DoStuff(string provider)
. - Вот самая важная часть. Для
ISomeService
требуется зависимость от уровня данных, но это не может быть жесткой зависимостью от введенного ExternalDbContext
, так как это должно быть разрешено динамически. Моя идея - иметь IExternalDbContextFactory
, который, в свою очередь, может принимать IServiceProvider
. У этой фабрики будет метод GetExternalDbContext(string provider)
, и я бы разрешил правильный ExternalDbContext
с помощью внедренного поставщика услуг.
Для этого мне пришлось бы зарегистрировать ExternalDbContexts
таким образом, чтобы позвольте мне разрешить их из IServiceProvider
на основе строкового параметра. По очевидным причинам я не хочу иметь 100 разных бесполезных классов маркеров, унаследованных от ExternalDbContext
, а затем регистрировать их независимо. Также я бы предпочел как-то использовать удобный метод AddDbContext
.
Я, очевидно, мог бы полностью построить свою собственную инфраструктуру разрешения, но я бы предпочел повторно использовать существующее решение, чем тратить дни на написание и тестирование шаблона для этого конкретного использования чехол.