问题标签 [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.
c# - 数据类的依赖倒置(定义某种类型结构的类)
所以我有这个数据类:
它只是定义了最近项目的属性,我想应用依赖反转,所以我从类中提取了一个接口:
然后我做了一个ioc容器(控制反转)并将类类型注册为接口:
因此,当我想创建一个最近使用的项目时,在我的应用程序中的任何地方:
但是在我这样做之后,我遇到了一些当前设置很难解决的问题,所以我认为这可能不是在此类中应用依赖倒置的正确方法,因为没有任何依赖倒置好处适用于:
- 单元测试:因为我不会对数据类进行单元测试
- 更改类实现的能力:因为类中的任何更改都需要更改接口才能使用添加的新功能
那我该怎么办,我在这个话题上搜索了很多,找不到明确的答案,
请帮助并提前感谢。
repository - 存储库可以调用清洁架构中的用例吗?
这是一个非常棘手的问题,因为当我们检查规则时,并不明确说明存储库不能调用 UseCase。然而,这似乎不合逻辑。是否有任何定义/良好做法以及为什么不应该这样做?
谢谢!
c# - 一切都使用工厂?
我的软件应控制一个或多个设备。程序流程就像它将在所有可用接口上搜索设备并IDevice
为找到的每个设备实例化一个类型的对象。在这里声明,所有这些对象都必须在运行时设置。
使用 Autofac 获得依赖反转 (DI) 一切都必须在开始时进行设置。如果要在运行时使用某些东西,“工厂”就是要使用的东西。因此,让我们深入研究一个示例:
程序开始看起来像这样:
一旦解决了“应用程序”,所有在开始时已知的设置都已设置。然后应用程序启动 ( app.Run()
),搜索设备,然后设置找到的所有设备的列表。现在设置一个设备需要一堆“工厂”,基本上(这就是问题所在)通过“设备”实例化的“每个类一个”。
“设备”包含一个记录器跟踪某事,在此示例中它将记录时间和事件。因此,一旦设置了新日志,就需要注入一些工厂。
现在,这只是对设备类的一点了解,它实际上集成了更多的东西。那就是它现在又变得一团糟了。
在实例化“设备”时,我设置了大约 30 个子类甚至更多。因此,因为它们是在运行时设置的,所以它们都需要一个必须通过其构造函数的“设备”提供的“工厂”。好吧,我想你明白了。
你怎么处理那件事呢?还是我又走错了路?我是否会通过尝试对所有内容进行反向依赖来误解某些内容?
另一点是,整个故事将使其可测试,其中 interface 和 autofac 是关键词。但是当使用工厂时,我总是必须使用它自己的类并且不能使用它的接口作为参考,此时 DI 不再实现。... ?
使用它将需要MyClass.Factory
而不是IMyClass.Factory
:
angular - 如何在 Angular 中应用依赖倒置原则?
让我们考虑以下场景:您在登录表单中有一个用于密码恢复的按钮,此操作会打开一个带有两个选项的模式:“通过 SMS 恢复”和“通过电子邮件恢复”,根据选择的选项,表单启用输入文本您输入电子邮件或手机和按钮以发送恢复请求。
在 Angular 中,您可以创建一个服务,该服务将所选方法作为参数,并根据该参数执行恢复密码的操作。但是,如果添加更多方法,则需要添加更多条件才能发出正确的请求。根据 SOLID 原则,您应该依赖抽象而不是细节,这就是为什么您可以执行以下操作:
和组件:
然后为了使用 SMS 实现,我应该在组件中定义一个提供程序:
或电子邮件:
然后调用该方法:this.recoveryRepository.recoveryPassword();
但是,如果表单中的恢复方法值是动态的,那么如何根据用户选择短信还是电子邮件选项来更改存储库实例?
一个简单的选择是在构造函数中注入服务:
但它违反了 SOLID 原则,如果我们想到更复杂的场景,我们可能必须更改组件中的许多内容。然后可能有一种工厂负责根据所选选项更改实例并使用 this.recoveryRepository.recoveryPassword(userId) 并仅依赖于抽象类
asp.net-core - 依赖倒置原则。为什么我可以在 ASP.NET Core 5 中访问非直接引用项目的类?
想象一下,我的解决方案中有四个项目:
- UI <- 启动项目
- 领域
- 存储库
- 引导
项目UI
依赖于Domain
和Boot
项目。
该Boot
项目依赖于 DI 容器配置的Domain
和Repository
项目。
如果我在 ASP.NET Core 5 中编写此代码,即使我在项目中没有依赖项,UI
代码也可以访问和实例化类。Repository
UI
在 .NET Framework 4.8 中,这并没有发生。这种行为使隔离变得不可能,因此这种配置中的依赖倒置原则很容易被破坏。
有没有办法在 ASP.NET Core 5 中关闭这种行为?
c# - 如何正确添加实体类对其他类的依赖,减少耦合
我正在阅读依赖倒置原则。它指出模块应该依赖于抽象。我了解大部分部分,并且可以应用它们。有一处混乱。
每当我们调用依赖类方法时。我们有时将参数作为对象传递。并且这个对象需要被实例化并作为参数传递
实体.cs
客户端类.cs
依赖类.cs
这里的 Entity 类只是一个数据传输对象。但是它对违反 DIP 的 ClientClass 和 DependentClass 有具体的依赖。我的理解正确吗?如何解决这个问题?
php - 我可以通过提供未暗示的参数来逃避依赖倒置原则吗?
我不知道我是否正确,但依赖倒置原则是一个原则,它指出一个类不应该依赖于另一个带参数的类。那么如果我不输入提示参数怎么办?或者我为什么要输入提示?顺便说一句,我使用的是 Php,所以如果我不输入提示参数,它仍然可以工作。谢谢您的回答。
blazor - 在 Blazor WebAssembly 中将程序集添加到客户端的浏览器
我有一个解决方案,其中包含一个名为 Shell 的 Blazor wasm 项目和一些作为模块的 Razor 类库项目。
正如 SOLID 的依赖反转主体所说“高级模块不应从低级模块导入任何内容”,所以我不希望我的 Shell 项目对模块有任何引用。
每个模块都有一个对 Shell 的引用,并实现了一个名为 IModule 的接口,该接口在 Shell 项目中定义。此外,我还向 Modules 添加了一个构建后命令,并将它们的输出 xcopy 到 Shell 项目输出目录。
Shell 应该在运行时使用反射找到实现 IModule 接口的程序集,并将它们添加到其路由器的 AdditionalAssemblies 中。但是当我运行这个程序时,反射找不到模块的dll文件,因为它们没有复制到客户端的浏览器中。
有没有办法将这些程序集添加到正在复制到客户端的文件中并防止“摇树”在生产中删除它们?
python - SQLAlchemy ORM & 依赖倒置
我正在努力将 SQLAlchemy ORM 与 Python 中的依赖倒置原则结合起来。我有一个要保存到数据库的对象,从数据库加载,这与 SQLA ORM 完美配合。但是我不能在不破坏依赖反转的情况下将 ORM 类与我的业务逻辑一起使用——它们太特定于 ORM。我可以使用某些接口将 ORM 对象转换为业务逻辑对象,但这会破坏 ORM“无缝更新数据库中的对象”功能,并且完全是一团糟。
有没有直接干净的方法来解决这个问题,还是我必须牺牲ORM或DI?
swift - 协议中带有关联类型的依赖倒置
我很难尝试实现依赖倒置。环顾四周,找到一篇很棒的文章Swift Type Erasure。我不知道如何才能在我的情况下获得优势。这是我想要实现的目标。
网络协议
Networkable
协议的具体实现
AViewModel
依赖于Networkable
协议
用法:
问题:
- 这是实现依赖倒置的正确方法吗?
- 如何在 Network 类上实现通用行为并且仍然可以进行测试?