问题标签 [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 回答
47 浏览

c# - 数据类的依赖倒置(定义某种类型结构的类)

所以我有这个数据类:

它只是定义了最近项目的属性,我想应用依赖反转,所以我从类中提取了一个接口:

然后我做了一个ioc容器(控制反转)并将类类型注册为接口:

因此,当我想创建一个最近使用的项目时,在我的应用程序中的任何地方:

但是在我这样做之后,我遇到了一些当前设置很难解决的问题,所以我认为这可能不是在此类中应用依赖倒置的正确方法,因为没有任何依赖倒置好处适用于:

  • 单元测试:因为我不会对数据类进行单元测试
  • 更改类实现的能力:因为类中的任何更改都需要更改接口才能使用添加的新功能

那我该怎么办,我在这个话题上搜索了很多,找不到明确的答案,
请帮助并提前感谢。

0 投票
1 回答
505 浏览

repository - 存储库可以调用清洁架构中的用例吗?

这是一个非常棘手的问题,因为当我们检查规则时,并不明确说明存储库不能调用 UseCase。然而,这似乎不合逻辑。是否有任何定义/良好做法以及为什么不应该这样做?

谢谢!

0 投票
1 回答
74 浏览

c# - 一切都使用工厂?

我的软件应控制一个或多个设备。程序流程就像它将在所有可用接口上搜索设备并IDevice为找到的每个设备实例化一个类型的对象。在这里声明,所有这些对象都必须在运行时设置。

使用 Autofac 获得依赖反转 (DI) 一切都必须在开始时进行设置。如果要在运行时使用某些东西,“工厂”就是要使用的东西。因此,让我们深入研究一个示例:

程序开始看起来像这样:

一旦解决了“应用程序”,所有在开始时已知的设置都已设置。然后应用程序启动 ( app.Run()),搜索设备,然后设置找到的所有设备的列表。现在设置一个设备需要一堆“工厂”,基本上(这就是问题所在)通过“设备”实例化的“每个类一个”。

“设备”包含一个记录器跟踪某事,在此示例中它将记录时间和事件。因此,一旦设置了新日志,就需要注入一些工厂。

现在,这只是对设备类的一点了解,它实际上集成了更多的东西。那就是它现在又变得一团糟了。

在实例化“设备”时,我设置了大约 30 个子类甚至更多。因此,因为它们是在运行时设置的,所以它们都需要一个必须通过其构造函数的“设备”提供的“工厂”。好吧,我想你明白了。

你怎么处理那件事呢?还是我又走错了路?我是否会通过尝试对所有内容进行反向依赖来误解某些内容?

另一点是,整个故事将使其可测试,其中 interface 和 autofac 是关键词。但是当使用工厂时,我总是必须使用它自己的类并且不能使用它的接口作为参考,此时 DI 不再实现。... ?

使用它将需要MyClass.Factory而不是IMyClass.Factory

0 投票
0 回答
145 浏览

angular - 如何在 Angular 中应用依赖倒置原则?

让我们考虑以下场景:您在登录表单中有一个用于密码恢复的按钮,此操作会打开一个带有两个选项的模式:“通过 SMS 恢复”和“通过电子邮件恢复”,根据选择的选项,表单启用输入文本您输入电子邮件或手机和按钮以发送恢复请求。

在 Angular 中,您可以创建一个服务,该服务将所选方法作为参数,并根据该参数执行恢复密码的操作。但是,如果添加更多方法,则需要添加更多条件才能发出正确的请求。根据 SOLID 原则,您应该依赖抽象而不是细节,这就是为什么您可以执行以下操作:

和组件:

然后为了使用 SMS 实现,我应该在组件中定义一个提供程序:

或电子邮件:

然后调用该方法:this.recoveryRepository.recoveryPassword();

但是,如果表单中的恢复方法值是动态的,那么如何根据用户选择短信还是电子邮件选项来更改存储库实例?

一个简单的选择是在构造函数中注入服务:

但它违反了 SOLID 原则,如果我们想到更复杂的场景,我们可能必须更改组件中的许多内容。然后可能有一种工厂负责根据所选选项更改实例并使用 this.recoveryRepository.recoveryPassword(userId) 并仅依赖于抽象类

0 投票
1 回答
46 浏览

asp.net-core - 依赖倒置原则。为什么我可以在 ASP.NET Core 5 中访问非直接引用项目的类?

想象一下,我的解决方案中有四个项目:

  • UI <- 启动项目
  • 领域
  • 存储库
  • 引导

项目UI依赖于DomainBoot项目。

Boot项目依赖于 DI 容器配置的DomainRepository项目。

如果我在 ASP.NET Core 5 中编写此代码,即使我在项目中没有依赖项,UI代码也可以访问和实例化类。RepositoryUI

在 .NET Framework 4.8 中,这并没有发生。这种行为使隔离变得不可能,因此这种配置中的依赖倒置原则很容易被破坏。

有没有办法在 ASP.NET Core 5 中关闭这种行为?

0 投票
1 回答
45 浏览

c# - 如何正确添加实体类对其他类的依赖,减少耦合

我正在阅读依赖倒置原则。它指出模块应该依赖于抽象。我了解大部分部分,并且可以应用它们。有一处混乱。

每当我们调用依赖类方法时。我们有时将参数作为对象传递。并且这个对象需要被实例化并作为参数传递

实体.cs

客户端类.cs

依赖类.cs

这里的 Entity 类只是一个数据传输对象。但是它对违反 DIP 的 ClientClass 和 DependentClass 有具体的依赖。我的理解正确吗?如何解决这个问题?

0 投票
0 回答
17 浏览

php - 我可以通过提供未暗示的参数来逃避依赖倒置原则吗?

我不知道我是否正确,但依赖倒置原则是一个原则,它指出一个类不应该依赖于另一个带参数的类。那么如果我不输入提示参数怎么办?或者我为什么要输入提示?顺便说一句,我使用的是 Php,所以如果我不输入提示参数,它仍然可以工作。谢谢您的回答。

0 投票
0 回答
58 浏览

blazor - 在 Blazor WebAssembly 中将程序集添加到客户端的浏览器

我有一个解决方案,其中包含一个名为 Shell 的 Blazor wasm 项目和一些作为模块的 Razor 类库项目。

正如 SOLID 的依赖反转主体所说“高级模块不应从低级模块导入任何内容”,所以我不希望我的 Shell 项目对模块有任何引用。

每个模块都有一个对 Shell 的引用,并实现了一个名为 IModule 的接口,该接口在 Shell 项目中定义。此外,我还向 Modules 添加了一个构建后命令,并将它们的输出 xcopy 到 Shell 项目输出目录。

Shell 应该在运行时使用反射找到实现 IModule 接口的程序集,并将它们添加到其路由器的 AdditionalAssemblies 中。但是当我运行这个程序时,反射找不到模块的dll文件,因为它们没有复制到客户端的浏览器中。

有没有办法将这些程序集添加到正在复制到客户端的文件中并防止“摇树”在生产中删除它们?

0 投票
0 回答
50 浏览

python - SQLAlchemy ORM & 依赖倒置

我正在努力将 SQLAlchemy ORM 与 Python 中的依赖倒置原则结合起来。我有一个要保存到数据库的对象,从数据库加载,这与 SQLA ORM 完美配合。但是我不能在不破坏依赖反转的情况下将 ORM 类与我的业务逻辑一起使用——它们太特定于 ORM。我可以使用某些接口将 ORM 对象转换为业务逻辑对象,但这会破坏 ORM“无缝更新数据库中的对象”功能,并且完全是一团糟。

有没有直接干净的方法来解决这个问题,还是我必须牺牲ORM或DI?

0 投票
1 回答
46 浏览

swift - 协议中带有关联类型的依赖倒置

我很难尝试实现依赖倒置。环顾四周,找到一篇很棒的文章Swift Type Erasure。我不知道如何才能在我的情况下获得优势。这是我想要实现的目标。

网络协议

Networkable协议的具体实现

AViewModel依赖于Networkable协议

用法:

问题:

  1. 这是实现依赖倒置的正确方法吗?
  2. 如何在 Network 类上实现通用行为并且仍然可以进行测试?