我一直在尝试弄清楚通过初始化器直接注入依赖项和通过注入符合协议的依赖项来注入依赖项之间是否有区别?
直接注入依赖项
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
}
}任何帮助都将不胜感激。
发布于 2021-09-27 13:03:58
事实上,依赖注入是实现依赖反转原则的众多方法之一。迪普说:
A.高级模块不应该从低级模块导入任何内容。两者都应该依赖于抽象(例如,协议)。
B.Abstractions不应该依赖于细节。细节(具体实现)应该依赖于抽象。
所以在你的第一个版本中,汽车和引擎依赖于细节,它们不应该依赖于细节。相比之下,在您的第二个版本中,它们依赖于抽象(协议)。使用协议的DI在以下方面很有用:
此外,使用协议可以带来一些好处。你可以在下面的链接上阅读更多:https://medium.com/swlh/protocol-oriented-programming-benefits-2910e3c86c7b
https://stackoverflow.com/questions/69345293
复制相似问题