swift - 依赖注入,差异?
问题描述
我试图弄清楚通过直接注入依赖项或注入符合协议的依赖项通过初始化程序注入依赖项之间是否有任何区别?
直接注入依赖
struct Engine {
func start() {
print("Start")
}
func stop() {
print("Stop")
}
}
struct Car {
let engine: Engine
init(engine: Engine) {
self.engine = engine
}
}
注入符合协议的依赖项
protocol EngineProtocol {
func start()
func stop()
}
struct Engine: EngineProtocol {
func start() {
print("Start")
}
func stop() {
print("Stop")
}
}
struct Car {
let engine: EngineProtocol
init(engine: EngineProtocol) {
self.engine = engine
}
}
任何帮助将不胜感激。
解决方案
实际上,依赖注入是实现依赖倒置原则的众多方法之一。DIP 说:
A. 高级模块不应该从低级模块导入任何东西。两者都应该依赖于抽象(例如,协议)。
B.抽象不应该依赖于细节。细节(具体实现)应该依赖于抽象。
所以在你的第一个版本中,汽车和引擎取决于细节,它们不应该依赖于细节。相比之下,在您的第二个版本中,它们依赖于抽象(协议)。使用协议的 DI 可用于:
- 实现一种可以注入任何符合给定协议的类型的通用行为
- 使用模拟注入参数测试类的能力
此外,使用协议可以带来一些优势。您可以通过以下链接了解更多信息: https ://medium.com/swlh/protocol-orienting-programming-benefits-2910e3c86c7b
推荐阅读
- typescript - 为什么解包和重新包装一个类型数组不能让我回到原始类型?
- python - mariaDB:列计数与第 1 行的值计数不匹配
- ruby - 如何从数据文件循环显示内容?
- ios - iOS Core Graphic,如何计算 CGAffineTransform(scaleX offset?
- php - 计算数据表/数据库中某些输入的出现次数
- websitepanel - WebsitePanel 门户崩溃
- python-3.x - TypeError:+ 的不支持的操作数类型:数学中的“float”和“str”
- c++ - 使用 WindowSetup 类变量时出错
- javascript - 将带有格式/样式的 HTML 表格标记复制到剪贴板
- json - 如何使用计数器 +1 更改 json 文件中的特定行