如何实施多重

时间:2018-10-16 05:01:47

标签: c# entity-framework entity-framework-6 repository

我已经添加了存储库代码并将其调用到HomeController.cs

 public class HomeController : Controller
 {
     private IPlatformRepository _platformRepository;

     public HomeController()
     {
         this._platformRepository = new PlatformRepository(new IoTSimulatordbContext());    
     }

     public HomeController(IPlatformRepository platformRepository )
     {
         this._platformRepository = platformRepository;    
     }

以上代码仅适用于PlatformRepository。如果我想添加多个存储库,我可以像下面这样吗?

 public class HomeController : Controller
 {
     private IPlatformRepository _platformRepository;
     private IDeviceRepository _deviceRepository;

     public HomeController()
     {
         this._platformRepository = new PlatformRepository(new IoTSimulatordbContext());
         this._deviceRepository = new DeviceRepository(new IoTSimulatordbContext());
     }

     public HomeController(IPlatformRepository platformRepository, IDeviceRepository deviceRepository)
     {
         this._platformRepository = platformRepository;
         this._deviceRepository = deviceRepository;

     }

这是正确的方法吗?

public HomeController()
{
    this._platformRepository = new PlatformRepository(new IoTSimulatordbContext());

    this._deviceRepository = new DeviceRepository(new IoTSimulatordbContext());
}

2 个答案:

答案 0 :(得分:1)

是的,可以两次实例化IoTSimulatordbContext。如果您的应用程序变大,您可能会遇到一些错误,因为同一实例在多个地方使用,而不是节省线程。另外,以这种方式管理实例化要求您正确管理实例的处置。

我建议您使用依赖项注入(使用Autofac或Ninject)-这将帮助您管理类实例化并进行处理。因此,您使用DI的构造函数将如下所示

public class HomeController : Controller
 {
     private readonly IPlatformRepository _platformRepository;
     private readonly IDeviceRepository _deviceRepository;


     public HomeController(IPlatformRepository platformRepository, IDeviceRepository deviceRepository)
     {
         this._platformRepository = platformRepository;
         this._deviceRepository = deviceRepository;

     }

答案 1 :(得分:1)

如果您在询问语法,那么我看不到任何问题...如果您在询问设计和最佳实践,请考虑以下几点:

  1. 最好将存储库注入到控制器中,因为初始化存储库不是控制器的考虑...您的代码违反了单一责任原则,因为控制器是承担初始化存储库的额外/不必要的责任。

  2. 您的问题中的另一个好处是有关控制器中依赖项的数量。为此,请参考尼古拉的IoC第二定律see here

  

任何具有超过3个依赖项的类都应向SRP提出疑问   违反

您的控制器具有2个存储库的依赖项,所以很好...但是,如果您有3个以上的依赖项,则考虑进行重构是一件好事。如果您想知道如何重构存储库,请考虑以下内容:

  • 标识域的Aggregate roots,并为每个聚合根创建一个单一的存储库...因此,实质上,您是在一个存储库中组合相关类型。

  • 您可以将存储库合并为一个更大的块(服务)...现在,高级类(控制器)依赖于您的服务,而服务又依赖于一个或多个存储库。