问题标签 [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 投票
1 回答
206 浏览

c# - 使用列表的依赖倒置在一个方法中

如何在给定的类上实现依赖反转,如下面的代码?问题是类 A 中的函数“添加”,它包含新的关键字。

我正在使用 Autofac 进行依赖注入。

我应该创建一个在我的 Autofac 中注册的“IBFactory”,还是使用方法注入,或者完全是其他的东西?

0 投票
2 回答
253 浏览

oop - 什么时候可以依赖具体的类?

今天我被问到一个我找不到答案的问题,所以我在这里寻求您的帮助!依赖倒置原则指出具体类和抽象都应该依赖于抽象,对吗?

尽管如此,我们仍然依赖于框架类,如IntegerString。关于为什么没问题有一个很好的答案吗?

我知道我们不应该仅仅因为它可能会发生微小的变化而重新发明轮子,而且我提到的这些特定类很可能永远不会以用户会注意到的方式发生变化(他们的界面不会改变)。

0 投票
1 回答
48 浏览

dependency-injection - IoC 上下文中基于代码的注册与设计时注册

在 IoC 的上下文中,基于代码的注册和设计时注册有什么区别?

我在学习 IoC、DIP、DI 和 IoC 容器时遇到了这里的概念。

0 投票
1 回答
111 浏览

interface - Open-Closed SOLID 原则是否与对接口进行编码相同?

对扩展开放和对修改关闭是否意味着代码到接口?

如果我对接口进行编码,以便可以通过实现接口来引入未来的具体实现,并且我们在不触及现有逻辑的情况下创建新类,它是否实现了我们尝试使用开放式扩展和封闭式解决的相同目标-修改SOLID原理?

0 投票
0 回答
74 浏览

c# - 如何创建一个在内部使用 DI 的库并在不使用 DI 的项目中使用?

嗨,伙计们,

我需要在项目中创建一个库,该库在内部使用 DI,如下所示:

图书馆

但是它将作为nuget包在另一个不直接使用DI的项目中使用。

解决此库的依赖关系并在客户端项目上实例化服务的最佳方法是什么?

我正在考虑使用 ServiceLocator 模式创建一个入口点,并将其提供给客户端,这是完成这项工作的唯一方法(或最佳方法)吗?

有没有另一种方法来建立这样的图书馆?

编辑:我在内部使用 DI 框架来连接库中的类。并且客户端项目有一个启动注册依赖项,但类不准备接收构造函数中的实例。

0 投票
1 回答
299 浏览

php - php中的依赖倒置问题。(存储库模式)

我在 Laravel 中实现了一个存储库模式,看起来很乏味。例如,假设我有产品,然后我必须创建一个 ProductRepository 接口,然后是一个实现该接口的 ProductRepository 类,现在我在 ProductRepository 上有一些非常通用的方法,例如:

  • 检索全部
  • 店铺
  • 更新
  • 删除

现在我必须对配料做同样的事情。如果我可以简单地使用所有这些泛型方法创建一个 ModelRepository 接口并通过传递一个类似于 Java 泛型的泛型数据类型(即模型)来实现它,那就太好了:

但是由于 php 不支持泛型,我该如何实现这种简单性呢?

0 投票
1 回答
191 浏览

dependency-injection - 使用第三方库时如何应用依赖倒置原则?

我正在阅读依赖倒置原则,据我所知,这种关系是倒置的,因为包 A(高级)定义了接口,包 B(低级)实现了接口,而不是直接调用包 B 中的类。

但是当我没有包 B 时,如何应用依赖倒置原则呢?我正在使用 PHP,并通过 Composer 包管理器导入了一些第三方库。由于我无法控制该代码,因此我无法使该库中的类实现我的高级接口。

我在 Google 和 Stackoverflow 上进行了搜索,但似乎找不到提及此用例的问题或文章。

0 投票
1 回答
50 浏览

c# - 具有依赖反转的架构(在 DI 框架之前)

我正在研究 DI 我在架构上有一些问题,也许我遗漏了一些要点。

假设我有这个非 DI 代码(我从文件中读取了“Person”列表)

首先,为了实现 DI 模式,我需要接口,所以我这样做了

现在我的问题: PersonReaderFromFile 取决于 Person 实现。没关系?或者我需要一个额外的类,比如 PersonFactory?

现在 PersonFactory 依赖于 Person 实现,但它应该是正确的。有什么建议吗?Tnx 给所有人。

编辑:我展示了一个示例 PersonReaderFromFile 实现

0 投票
0 回答
49 浏览

c# - StackOverFlow 在实现交叉引用类的依赖倒置原则中

情况:

我有三个班级:社会,父亲和儿子。该协会有一份父亲名单。每个父亲都有一个儿子。在这个应用中,每个父亲都必须知道他的儿子是谁,反之亦然,每个儿子都知道他的父亲是谁。

我使用直接交叉引用,将父亲指定为子的属性,将子指定为父类的属性,如下所示:

为了手动实现依赖倒置,我有一个名为 Factory 的公共静态类。Factory 通过其方法返回 Society、Father 和 Son 类的接口。这些方法实例化 Society、Father 和 Son 类,并将它们分别返回为 ISociety、IFather 和 Ison。

应用程序运行如下。

问题

每次工厂创建一个父亲时,它都会通过调用 CreateSon() 方法实例化一个儿子作为其构造函数输入。当 CreateSon() 方法创建一个 Son 时,它会调用 CreateFather() 方法。这会导致无限循环,从而导致 StackOverFlow 问题。

大图

我有一个大型的类库。在我的库中,高级类有低级类的列表。计算在较低级别的类中执行。计算需要访问更高级别的类的属性。因此,计算需要以某种方式通过它们所属的低级类找到更高级别的类。

为了能够对代码进行单元测试,我需要通过将Factory.CreateFather()in 传递给 Son.cs 类的构造函数来实例化 Son 类。这样做可以让我在不破坏代码的情况下用 Factory 类中的母亲类交换父亲类。

除了这两种方式之外,我不知道还有一种更优雅的方式可以让子知道父是谁:

1-上述方法,通过直接分配儿子的MyFather属性进行交叉引用。

2-在儿子中保存父亲的标识符属性(整数或 Guid)。所以儿子可以通过以下方式搜索父亲:Father MyFather = Society.Fathers[MyFathersNumber]。鉴于父亲列表被控制为没有重复。这种方法的问题在于,在一个长长的层次结构链中,访问一个类的几层变得困难导航和冗长的代码行。

在没有依赖倒置的情况下,我之前已经从方式 2 转移到方式 1 作为一种更清洁的方法。现在,当我将方式 2 与 DI 原理结合起来时,我遇到了 StackOverFlow 问题。

我的问题

有人可以告诉我在不与依赖倒置原则发生冲突的情况下让儿子知道他父亲是谁的优雅方式是什么?

谢谢你。

0 投票
1 回答
307 浏览

haskell - 使用类型类在 Haskell 应用程序中实现依赖倒置?

设计大型应用程序时的一个主要架构目标是减少耦合和依赖性。依赖关系是指源代码依赖关系,当一个函数或数据类型使用另一个函数或另一种类型时。高级架构指南似乎是Ports & Adapters架构,略有不同也称为洋葱架构六边形架构干净架构:建模应用程序的类型和功能位于中心,然后使用在领域的基础上提供有用服务的案例,在最外圈是技术方面,如持久性、网络和 UI。

依赖规则说依赖必须只指向内部。例如; 持久性可能取决于用例中的函数和类型,而用例可能取决于域中的函数和类型。但不允许域依赖于外环。我应该如何在 Haskell 中实现这种架构?具体来说:我如何实现一个不依赖(=导入)持久性模块中的函数和类型的用例模块,即使它需要检索和存储数据?

假设我想通过一个函数实现一个用例订单放置U.placeOrder :: D.Customer -> [D.LineItem] -> IO U.OrderPlacementResult,该函数从订单项创建一个订单并尝试保留该订单。这里,U表示用例模块和D域模块。该函数返回一个 IO 操作,因为它需要以某种方式保持订单。然而,持久化本身是在最外层的架构环中——在某些模块中实现P;因此,上述函数不能依赖于从P.

我可以想象两种通用解决方案:

  1. 高阶函数:该函数U.placeOrder接受一个额外的函数参数,例如 U.OrderDto -> U.PersistenceResult。这个函数是在persistence( P)模块中实现的,但是它依赖于模块的类型U,而U模块不需要声明依赖P
  2. 类型类:U模块定义了一个Persistence声明上述函数的类型类。该P模块依赖于该类型类并为其提供一个实例。

变体 1 非常明确,但不是很通用。它可能会导致具有许多参数的函数。变体 2 不那么冗长(例如,请参见此处)。然而,变体 2 导致了许多无原则的类型类,这在大多数现代 Haskell 教科书和教程中被认为是不好的做法。

所以,我有两个问题:

  • 我错过了其他选择吗?
  • 通常推荐哪种方法(如果有)?