首页 > 解决方案 > 依赖注入,差异?

问题描述

我试图弄清楚通过直接注入依赖项或注入符合协议的依赖项通过初始化程序注入依赖项之间是否有任何区别?

直接注入依赖

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
    }
}

任何帮助将不胜感激。

标签: swiftdependency-injection

解决方案


实际上,依赖注入是实现依赖倒置原则的众多方法之一。DIP 说:

A. 高级模块不应该从低级模块导入任何东西。两者都应该依赖于抽象(例如,协议)。
B.抽象不应该依赖于细节。细节(具体实现)应该依赖于抽象。

所以在你的第一个版本中,汽车和引擎取决于细节,它们不应该依赖于细节。相比之下,在您的第二个版本中,它们依赖于抽象(协议)。使用协议的 DI 可用于:

  • 实现一种可以注入任何符合给定协议的类型的通用行为
  • 使用模拟注入参数测试类的能力

此外,使用协议可以带来一些优势。您可以通过以下链接了解更多信息: https ://medium.com/swlh/protocol-orienting-programming-benefits-2910e3c86c7b


推荐阅读