问题标签 [dependency-inversion]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
80 浏览

oop - 为什么“防止变化”意味着依赖的方向?

关于我的一点背景:我是一名自学成才的程序员,6 年前加入 MegaCorp(TM) 时,他开始使用 Python 并学习了 Java。拥有数学学位,我在算法和批判性思维方面相当扎实(不是双关语),但我经常发现自己在数据结构、设计或其他 CompSci 基础知识方面存在差距,而我的同行在他们的计算机科学中学到了这些基础知识培训班。

为此,我向团队中的一位高级工程师请教了一本书,以帮助填补我的空白,他建议使用Clean Architecture

我大约完成了三分之一,并且对这些建议的主要激励因素之一感到非常困惑。鲍勃叔叔提出了许多想法和原则(包括我以前听说过的SOLID原则,尽管我仍在掌握 Liskov 替换原则)旨在“保护”系统的某些部分免受要求改变。有几个例子,但最清楚的是第 73 页:

如果组件 A 应该被保护免受组件 B 的更改,那么组件 B 应该依赖于组件 A。

(我应该注意到,在没有任何我能看到的实际定义的情况下,我认为“组件”等同于 Java 包,尽管我认为如果“组件”可以应用相同的思维过程" 是一个单独的服务 - 两者都应该为用户提供稳定可用的接口,无论是本地调用还是通过网络调用)

这种说法没有提供任何证据,对我来说也不是不言而喻的。考虑ClassA组件(包)中的类在组件中ComponentA调用DoStuffReturn doStuff(DoStuffInput input, String someOtherArg)的情况- 并且其中调用是通过直接依赖关系或通过对接口的依赖关系不是in,正如 Clean Architecture 所建议的那样)ClassBComponentB ComponentBComponentA

  • 如果 B 中的更改是功能更改,而不是签名更改(即 - 对于相同的DoStuffInput输入StringDoStuffReturn返回不同的),则 A 中不需要更改:
    • ClassA的调用ClassB.doStuff保持有效(相同的参数和返回类型)
    • ClassA的单元测试(应该使用 mocked ClassBs)应该仍然通过
    • 任何测试如何ClassAClassB协作的功能/集成测试都需要更新他们的期望,但这不是改变ComponentA(除非这些测试 ComponentA- 我通常看到它们在一个ComponentAIntegrationTests包中外部化,但我想它们也可以放在一起. 但这似乎不是本书所暗示的 - 它似乎是在谈论对代码的更改,而不是对测试的更改)
  • 如果 B 中的更改是对 以外的方法的签名更改doStuff,则 A 不需要任何更改
  • 如果 B 中的更改是对 的签名更改doStuff,则 A需要更改 - 但如果接口也在 A 中,情况就是如此。

(请注意,在清洁架构提倡的设置下,其中提供类的接口在消费组件(A)中,只有第一种情况会构成 B 的变化 - 所以这是我们真正需要关注的唯一一个和)

我错过了什么?如果 ComponentA 依赖于 ComponentB,那么在什么情况下 ComponentB 中的类的更改需要 ComponentA 的更改?

(请注意,我并不是反对使用接口——它们还有许多其他好处,尤其是允许在合同的“双方”同时开发,并允许交换接口的各种实现)

0 投票
3 回答
24608 浏览

c# - 非泛型方法“IServiceProvider.GetService(Type)”不能与类型参数一起使用

我正在使用 .NET Core 依赖注入,但是当我尝试在另一个类中获取服务时,我收到“IServiceProvider.GetService(Type)”不能与类型参数一起使用的错误。

这个错误是什么意思?我知道泛型类型参数是这样的:GenericInterface<>,GetService 方法不将 GenericInterface<> 作为参数。

为什么我会收到此错误,我该如何解决?

界面

实现接口的类

BaseService 类是一个抽象类,它实现了 IService 接口。

另一个基础服务

我是如何注册它们的。

我如何获得所需的服务。

注意:我刚开始使用依赖注入、.NET Core,还不知道关于 DI 的一切。你的回答会有很大帮助。

0 投票
1 回答
195 浏览

ios - swift中的依赖倒置

嗨,我有一个问题要问这里的开发人员,我正在阅读来自 big nerd 牧场的 iOS 编程书。我对如何构建应用程序和技术很感兴趣。我试图实现它,它是一个依赖倒置,代码是这样的

这是书中应用程序委托中的代码

这是 photoViewController 类

这是用于依赖反转代码的照片存储类

我要问的是,如果我有一个标签栏控制器,并且让我们说 2 个视图控制器其中一个正在获取新闻数据,而另一个控制器正在获取天气数据。我如何实现这种依赖反转,因为应用程序委托中的根视图控制器将是选项卡栏控制器,这就是我混淆实现它的原因?因为本书只使用一个视图控制器。

0 投票
1 回答
41 浏览

swift - 尝试使用依赖倒置存储值时崩溃

我想在我的应用程序中的应用程序委托中实现依赖倒置,因为我rootController是我的UITabBarController,但是当我想尝试它时出现错误

致命错误:在展开可选值时意外发现 nil

这是我在 appDelagate 中的代码

这是我的探索课

这是我的 exlporeViewController

实际上,如果我不使用依赖反转,代码就可以工作,就像我的探索视图控制器不使用这样的强制展开

但是由于我想获得知识并使用依赖倒置来学习 SOLID 原理,所以我想坚持这个原理。

0 投票
0 回答
59 浏览

design-patterns - 为什么控制反转和依赖反转原则不是设计模式,而依赖注入是?

为什么依赖注入是一种设计模式,而控制反转依赖反转原则都不是?

尽管存在差异,但在我看来,它们似乎是设计模式。

0 投票
2 回答
214 浏览

oop - 从具体类派生?

在“Head First Design Patterns”一书中,提到不违反“依赖倒置”原则的方法之一是:

没有类派生自具体类。

是否可以彻底遵守这条规则?在许多常用的框架和库中,通常会发现不遵循此规则的类。

0 投票
1 回答
136 浏览

php - 在类方法中使用框架定义的全局常量是否违反了依赖注入原则?

使用来自您正在使用的框架的常量。即,ABSPATH在 WordPress 中。

如果我不将该常量的值作为依赖项添加到constructor类的函数中,并且直接在方法内部使用它,它将破坏依赖注入原则有多严重?

说,严格来说,您需要执行以下操作:

而是类似的东西?

如果它总是被定义,因为它位于默认定义它的框架之上,我真的还需要这样做吗?

0 投票
3 回答
435 浏览

java - 继承是否与依赖倒置原则相矛盾

依赖倒置原则说(Head First Java):

  • 依赖于抽象。不要依赖具体的类。

继承权是什么意思?作为子类依赖于具体类。

我问的是一个案例 - 有一个接口Bird(没有飞行方法,因为有些鸟不能飞),它代表所有非会飞的鸟。所以我创建了一个类 -NonFlyingBird它实现了Bird.

现在我想为会飞的鸟做一个课程。由于NonFlyingBirdsFlyingBirds具有相同的属性,我扩展了FlyingBirdsfromNonFlyingBirds和 ImplementFlyable以赋予它飞行行为。

难道它不会破坏FlyingBirds从具体类扩展的依赖倒置原则NonFlyingBirds吗?

注意 - 我扩展的唯一原因是因为它具有与+ 飞行行为FlyingBird相同的属性和方法。NonFlyingBird所以通过继承重用代码是有意义的。

0 投票
3 回答
2511 浏览

solid-principles - SOLID 设计原则:Liskov 替换原则和依赖倒置原则

只是向 Stack Overflow 和 Microsoft 开发社区提出关于 OO 软件设计原则(称为 SOLID)的想法和问题。请问里氏替换原则和依赖倒置原则有什么区别?我已经考虑了一段时间,但我不确定有什么区别。请问你能告诉我吗?非常欢迎任何想法/反馈。

0 投票
1 回答
46 浏览

clean-architecture - 试图理解《清洁架构》一书的图14.11

在此处输入图像描述

这是来自“清洁架构”一书的第 14 章

它试图通过引入UServer来打破Stable-->Flexible的直接依赖。

这样我们就可以拥有 Stable-->UServer<--Flexible,没有人会直接依赖于具体的类 c。

但是在图 14.11 中,谁来实例化 c?

它不能是稳定的,那将引入稳定-->灵活的背部。

它不能是 UServer,这会给你双向依赖。

它本身不能是灵活的,因为那仍然会强制稳定调用灵活。

所以它必须是图 14.11 中没有的东西,对吧?像某种依赖注入框架?

作者是在暗中表达吗?