ASP.Net MVC один контроллер с несколькими хранилищами - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть слой доступа к данным, который возвращает репозитории.Например, у меня есть следующие интерфейсы репозитория:

У меня есть реализации Entity Framework этих репозиториев.Эти реализации внедряются во время выполнения с Ninject.

У меня есть один контроллер с несколькими репозиториями, приведенными ниже

 IUploadRepository _uploadRepository;
 ISalesRepository _salesRepository; 
 ITRSalesRepository _trsalesRepository;
 ILocalPurchaseRepository _localRepository;

с одним контроллером с именем -HomeController

Для того, чтобы функционироватьоперации, мне нужно использовать DBContext в реализации, поэтому я реализую все эти интерфейсы, как показано ниже:

public class UploadRepository : IUploadRepository
{
    private readonly XMANEntities _entities;
    public UploadRepository(XMANEntities entities)
    {
        _entities = entities;
    }
    *here goes all implementation with context for specific*
}

Здесь теперь у меня есть конструктор в HomeController, который выглядит так:

public class HomeController : Controller
{
  private IUploadRepository uploadRepository;

  public HomeController()
  {
     this.uploadRepository = new UploadRepository(new XMANContext());
  }

  public HomeController(IUploadRepository uploadRepository)
  {
     this.uploadRepository = uploadRepository;
  }
}

Как я могу использовать других в этом контроллере. Является ли плохой практикой вводить несколько репо в контроллер?я пробовал так, как указано ниже:

public HomeController() : this(new UploadRepository(
    new XMANEntities()), new SalesRepository(new XMANEntities()), 
    new TRSalesRepository(
       new XMANEntities()), new LocalPurchaseRepository(new XMANEntities()))
{
}

public HomeController(UploadRepository uploadRepository, SalesRepository salesRepository, 
      TRSalesRepository trsalesRepository, LocalPurchaseRepository localPurchaseRepository)
{
    this.uploadRepository = uploadRepository;
    this.salesRepository = salesRepository;
    this.trsalesRepository = trsalesRepository;
    this.localPurchaseRepository = localPurchaseRepository;
}

1 Ответ

0 голосов
/ 27 сентября 2018

Вполне приемлемо вводить несколько зависимостей в объект.Тем не менее, по возможности избегайте этого (за исключением транзакционных объектов), чтобы предотвратить смешивание обязанностей.Подход, который вы можете посмотреть, это хранимые процедуры.

 private IUploadRepository _uploadRepository;
 private ISalesRepository _salesRepository; 
 private ITRSalesRepository _trsalesRepository;
 private ILocalPurchaseRepository _localRepository;

 public HomeController(
      IUploadRepository uploadRepository,
      ISalesRepository salesRepository,
      ITRSalesRepository trsalesRepository,
      ILocalPurchaseRepository localRepository
 )
 {
     this._uploadRepository = uploadRepository;
     this._salesRepository= salesRepository;
     this._trsalesRepository= trsalesRepository;
     this._localRepository= localRepository;
 }
...