Модульный монолит и внедрение зависимостей ⇐ C#

Место общения программистов C#
Anonymous
Модульный монолит и внедрение зависимостей

Сообщение Anonymous »

В настоящее время я пытаюсь зарегистрировать зависимости в своем модульном монолите с API ASP.NET Core 7.
Каждому из модулей требуется служба хранилища BLOB-объектов. Для этой службы хранения BLOB-объектов у меня есть интерфейс IBlobStorage:

Код: Выделить всё

public interface IBlobStorage
{
void Save(string name, byte[] content);
Task Read(string name);
void Remove(string name);
}
Существует множество различных реализаций интерфейса, в зависимости от того, какое хранилище BLOB-объектов должно быть предназначено (например, учетная запись хранения Azure, облачное хранилище Google и т. д.).
Конкретные реализации требуют некоторой информации в своих конструкторах, например IOptions со строкой подключения.

Код: Выделить всё

IBlobStorage
и его реализации находятся в своего рода служебном проекте, на который ссылаются все модули.
Каждый модуль отвечает за регистрацию своих собственных зависимостей. Причина этого в том, что я хочу иметь возможность извлекать каждый модуль в отдельный развертываемый блок с как можно меньшим количеством изменений.
Суть вопроса в том, что должна быть возможность настройте каждый модуль для использования другого экземпляра учетной записи хранения. Это означает, что мне нужно иметь возможность зарегистрировать реализацию IBlobStorage для каждого модуля и разрешить реализацию с правильными параметрами для соответствующего модуля (примечание: контроллеры ASP.NET также являются частью модулей, которым они принадлежат; возможно, это поможет решить проблему).
Мне хотелось бы сделать это, чтобы модули ничего не знали о работе в монолите.Сейчас я играю с Autofac, так как альтернатива встроенному DI-контейнеру (в частности, возможность регистрировать зависимости как Keyed звучит многообещающе), но это похоже на большую работу, и мне интересно, есть ли более простое решение, которого я не видел пока.
Кто-нибудь сталкивался с подобным? Буду признателен за любые указания в правильном направлении.

Обновление. Я создал минимальный пример, чтобы проиллюстрировать свою проблему: https: //github.com/tnotheis/ModularMonolith
Запустите проект ModularMonolith и выполните запрос GET к https://localhost:7222/A и https://localhost: 7222/Б соответственно.
Ожидаемое поведение заключается в том, что /A возвращает «Это данные для «ModuleA»», а /B возвращает «Это данные для «ModuleB».
Вместо этого оба они возвращают «Это данные для «ModuleB»», поскольку ModuleB регистрируется после ModuleA, что «переопределяет» регистрацию IModuleSpecificService.>

Подробнее здесь: https://stackoverflow.com/questions/762 ... -injection

Вернуться в «C#»