Как использовать несколько DataContexts (DbContext) в репозитории.Net Web API

#c# #.net #asp.net-core

#c# #.net #asp.net-core

Вопрос:

Я разрабатываю веб-API в .NET Core с несколькими DataContexts (DbContext). Я использовал шаблон репозитория для обработки вызовов БД. Класс репозитория принимает DbContext в качестве универсального типа.

 public class Repository<T> : IRepository where T : DbContext
{
      public Repository(T context) : base(context)
      {
      }
}
 

Этот класс репозитория вводится в классы служб в качестве IRepository при запуске. Я хочу подключиться к 2 базам данных. Итак, я использую 2 класса DataContext и передал их в класс репозитория при запуске.

Вот мой класс запуска,

 services.AddTransient<DataContext1>(x => new DataContext1(Configuration.GetConnectionString("Database1")));
services.AddTransient<IRepository, Repository<DataContext1>>();
            
services.AddTransient<DataContext2>(x => new DataContext2(Configuration.GetConnectionString("Database2")));
services.AddTransient<IRepository, Repository<DataContext2>>();
 

Когда я запрашиваю IRepository, он всегда вводит класс репозитория с последним DataContext(DataContext2). Каков наилучший способ решить эту проблему, не влияя на производительность API (память / процессор).

Вот мой класс обслуживания,

 private readonly IRepository _repository;

public BookService(IRepository repository)
{
    _repository = repository;
} 
 

Комментарии:

1.2 реализации сопоставлены с одним интерфейсом, поэтому во время выполнения у вас должен быть какой-то механизм для выбора нужной реализации. Это могут быть некоторые метаданные, связанное имя (предоставляемое через какое-либо свойство)… Таким образом, введенный тип должен быть IEnumerable<IRepository> , и из него вы можете отфильтровать нужное вам репозиторий. Пользовательский контейнер DI может предоставить некоторые другие решения для решения этой ситуации, например: autofac обеспечивает Named amp; Keyed services autofaccn.readthedocs.io/en/latest/advanced/keyed-services.html Вы можете использовать атрибут для выбора вашей зависимости

Ответ №1:

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

Ответ №2:

Внедрите фабричный класс для репозиториев вместо экземпляра самих репозиториев. Реализуйте фабричные методы в соответствии с вашими потребностями.