代码之家  ›  专栏  ›  技术社区  ›  Francisco Noriega

最佳实践:如何将多个依赖存储库放入操作控制器中?

  •  2
  • Francisco Noriega  · 技术社区  · 15 年前

    我有一个inventoryController,它接收到一个inventoryRepository,但是我的需求已经改变了,现在其中一个控制器方法还需要使用另外两个存储库,iloansrepository(查看关于借出库存项的获取信息)和另一个,在这里可以找到一些统计信息和额外信息。

    它的工作方式是从InventoryController中的ActionMethod调用一个ViewModelBuilder类,而这个类实际上需要这些类。目前,我正在将iInventoryRepository从控制器传递给构建器,但现在该怎么做呢?我应该将3个存储库注入控制器,然后像我现在做的那样将它们传递给构建器吗?或者我应该只做一个ioc.getInstance()?(尽管我认为这是一种反模式,不是吗?)

    谢谢!

    3 回复  |  直到 15 年前
        1
  •  2
  •   Mark Seemann    15 年前

    在这种情况下,以下指导原则起作用:

    • 太多的依赖是一种气味,你违反了 Single Responsibility Principle .
    • 不超过四个依赖项。这是一个相对的指导方针。我个人努力少一些;我一加上第三种依赖(见上文第一项),就会变得不安,但最多可以忍受四种依赖。不仅如此,我还必须重构。
    • 不要仅仅为了传递依赖关系。

    据我所知,有三个依赖项,当涉及依赖项的数量时,您仍然或多或少地处于安全区域内,尽管您应该更仔细地观察那个特定的设计方面。

    但是,正如我理解您当前的实现,您只需将依赖项传递给一个ViewModelBuilder(从而违反了第三个要点)。一个稍微好一点的选择是定义一个抽象的(比如说,iviewModelBuilder)并将其注入控制器,而不是全部三个存储库。

    在任何情况下都不应该使用服务定位器反模式(ioc.getInstance())。

        2
  •  0
  •   dariol    15 年前

    对管制员负很大责任。

    也许您应该创建一个特殊的服务来处理这个问题,并且该服务应该使用那些由构造函数自动连接的存储库(通过IOC)。

        3
  •  0
  •   queen3    15 年前
    1. 如果你的控制器工作太多,把它分成几个部分。

    2. 如果插入3个存储库只是为了创建ViewModelBinder,请不要:插入(i)ViewModelBinder。让IOC容器完成它的工作并为您解决依赖关系;此外,这将简化体系结构、测试等。

    3. 使用ServiceLocator/GetInstance并不总是可以避免的;有时您没有“根”注入点(如MVC控制器工厂),无法控制对象创建(例如模型绑定器)。因此,我让我的模型绑定器(而不是构建器)调用getInstance,但我创建了自己的“根”:例如,它们调用getInstance<imodelResolver>,而不是getInstance<Entity>。