【问题标题】:ASP.Net MVC single controller with multiple repositories具有多个存储库的 ASP.Net MVC 单控制器
【发布时间】:2018-09-27 06:39:56
【问题描述】:

我有一个返回存储库的数据访问层。 例如,我有以下存储库接口:

我有这些存储库的实体框架实现。这些实现在运行时使用 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;
  }
}

如何在此控制器中使用其他人。将多个 repo 注入控制器是不好的做法吗? 我已经尝试过这种方式,如下所示:

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;
}

【问题讨论】:

  • 你一点也不 can 在一个控制器中使用多个存储库
  • 你只需添加额外的参数 - public HomeController(IUploadRepository uploadRepository, ISalesRepository salesRepository, etc)
  • 谢谢,但我已经尝试过了,但我不知道为什么不实例化它。它给出了对象引用未设置为对象实例的异常。
  • Stephen 现在我已经编辑了我尝试过的内容,但是当我调用此 repo 的函数之一时,它给了我对象引用未设置为对象的实例。
  • 需要删除默认构造函数并配置Ninject将依赖注入到控制器中

标签: c# asp.net-mvc-5 controller


【解决方案1】:

在一个对象上注入多个依赖项是完全可以接受的。但是,尽可能避免它(事务对象除外)以防止职责混合。您可以查看的一种方法是存储过程。

 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;
 }

【讨论】:

  • 但错误 CS0051 可访问性不一致:参数类型“ITRSalesRepository”的可访问性低于方法“HomeController.HomeController(IUploadRepository, ISalesRepository, ITRSalesRepository, ILocalPurchaseRepository)”
  • @pythongbs Tnx 提醒一下,存储库声明应该是私有的
  • 感谢错误重获但已尝试但我不知道为什么不实例化。它给出了对象引用未设置为对象实例的异常。当我尝试调用 _uploadRepository.UploadDuplicateCheck(importeddata);
  • @pythongbs,这可能是一个不同的问题,可能与您的接口和类的映射有关。如果此答案对您有所帮助,您可以将其标记为答案并将问题发布到另一个线程上,并提供更多详细信息(映射的源代码)我也很乐意为您提供帮助;)
  • @pythongbs,不客气。如果您觉得答案有帮助,点赞并将其标记为答案将对遇到与您相同问题的其他人有所帮助。
猜你喜欢
  • 1970-01-01
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-25
  • 2016-06-21
  • 2010-12-01
  • 2011-02-07
相关资源
最近更新 更多