У вас, кажется, есть несколько вопросов:
A) Ваше использование Космоса зависит только от вызовов, которые вы делаете в базу данных, и не зависит от того, сколько сервисов вы создаете для доступа к база данных.
B) Глядя на ваш код, кажется, что вы используете Microsoft.Extensions.DependencyInjection
. Эта структура поддерживает открытые генерики, которые теоретически могут сократить ваши четыре одноэлементные регистрации до одной регистрации с использованием открытого универсального типа c. Что-то вроде:
.AddSingleton(typeof(IDocumentDBRepository<>), typeof(DocumentDBRepository<>)
Здесь тип сервиса open generi c равен IDocumentDBRepository<>
, а тип реализации - DocumentDBRepository<>
. Когда инфраструктура внедрения зависимостей должна создать службу IDocumentDBRepository<Car>
, она создаст экземпляр DocumentDBRepository<Car>
. Это означает, что все еще будет экземпляр репозитория для каждого указанного c типа документа (Car
, House
et c.), Но вам не нужно внедрять службу для каждого указанного типа c.
К сожалению, это невозможно в вашем случае, так как вы используете конструктор, который требует аргумент для каждой из четырех служб. Тем не менее, вы можете реорганизовать свои услуги, чтобы обойти эту проблему. Одно (общее) решение состоит в том, чтобы ввести фабрику:
public interface IDocumentDBRepositoryFactory<T>
{
IDocumentDBRepository<T> Create(string databaseName);
}
И реализацию:
internal class DocumentDBRepositoryFactory<T>
{
public IDocumentDBRepository<T> Create(string databaseName)
=> return new DocumentDBRepository(databaseName);
}
Затем вы регистрируете эту фабрику (используя открытые обобщения):
.AddSingleton(typeof(IDocumentDBRepositoryFactory<>), typeof(DocumentDBRepositoryFactory<>)
Теперь потребителям репозиториев придется использовать экземпляр IDocumentDBRepositoryFactory<T>
, вызывать метод Create
и указывать имя базы данных, чтобы получить действительный экземпляр IDocumentDBRepository<T>
. Другой вариант - избавиться от аргумента databaseName
для фабричного метода и вместо этого сконфигурировать экземпляр фабрики для его предоставления (предположительно из конфигурации).
Введение фабрики позволяет вам откладывать решения с момента настройки система, когда система выполняет. В этом случае принимается решение о том, к какой базе данных подключаться.