【问题标题】:How does Dependency Inversion works in such case?在这种情况下,依赖倒置如何工作?
【发布时间】:2019-05-02 05:33:54
【问题描述】:

早上好,

我一直在阅读 Robert Martin 写的关于软件架构和 SOLID 原则的书,但我不明白依赖倒置是如何工作的。

简单的例子,是的,很清楚,比如https://www.oodesign.com/dependency-inversion-principle.html

但是当我们有一个插件系统时,父级必须知道所有插件并加载它们,那么如何避免父级对其插件的依赖呢?

例子:


/*
// In plugins file below
class PluginA { }
class PluginB { }
*/

import { PluginA, PluginB } from '../plugins';

class A {

  private plugins: Plugin[] = [];

  construct() {
    plugins.push(new PluginA(), new PluginB());
  }

}

是的,我们为所有插件定义了一个接口,但是我们不能在没有依赖的情况下推送它们,对吧?

那么在这种情况下如何应用依赖倒置原则呢? 如何使用没有依赖的插件?

【问题讨论】:

    标签: oop architecture


    【解决方案1】:

    如果导入它们,则在别处构造插件并将它们注入到 A 的构造函数中

    class A {
    
      private plugins: Plugin[] = [];
    
      construct(pluginsToUse) {
        plugins = pluginsToUse;
      }
    
    }
    

    【讨论】:

    • 那么我们会得到相同的依赖,但是在另一个地方,依赖倒置原则在那个地方就不会持续。如何避免这种依赖?我认为这是不可能的,我们必须有一个具体的插件列表,但是最好的存储位置在哪里呢?我认为它是低级组件,但不会有依赖倒置原则:)
    • 最终必须做一些事情。那就是“注入器”(实际上它在 Angular 中被称为)。不要纠结于概念的名称,工程师非常不擅长命名。您可能还想在阅读 SOLID 之前先了解这些模式,它本质上是对现有想法的重新散列。
    • @RWRkeSBZ 就 Angular 而言,我在想这些原则如何应用于我们当前的开发,看起来没人知道 SOLID。我认识的每个人都在开发没有灵活性的刚性单体应用程序。现在 Angular 应用看起来像 UI 套件 + 路由页面 + 服务 + UI 组件,但没有人关心架构层、依赖关系、架构组件的稳定性等等。典型的 Angular 页面包含一切,从模型和业务逻辑到视图相关变量。我认为这很糟糕。
    • 架构当然很重要,但我不会在前端开发中大惊小怪,主要是因为根据经验,大多数前端在需要改变的时候会完全重做。
    • @RomanYakimchuk 你误解了依赖倒置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-17
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 2018-06-16
    • 2017-06-21
    • 2018-01-19
    相关资源
    最近更新 更多