You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过依赖注入在多ViewController间共享同一服务类实例?

问题解答

1. 依赖注入完全可以实现实例共享,没必要用单例

你完全不需要依赖单例模式来共享服务类实例。核心思路是在顶层(比如AppDelegate、SceneDelegate或者专门的依赖容器)创建唯一的服务类实例,然后通过依赖注入的方式,把这个同一个实例依次传递给FirstVC、PageVC以及每个SecondVC。这样所有用到这个服务的控制器,拿到的都是同一个对象,自然实现了实例共享。

这种方式比单例更灵活——比如测试时你可以轻松替换成Mock服务类,不用修改全局单例的逻辑;而且避免了单例带来的全局状态耦合问题。

2. 把服务作为FirstVC的依赖,再传递给子VC的方案非常合理

这是依赖注入在ViewController层级中最常用的实践之一,完全符合依赖注入的设计原则:

  • 每个控制器的依赖关系都是显式的,从初始化方法就能清楚看到它需要什么服务
  • 避免了控制器自行创建依赖(比如硬编码初始化服务类),降低了耦合度
  • 整个依赖传递链路清晰,便于维护和调试

简单代码示例

定义服务类

class MainService {
    // 你的服务逻辑
    func doSomething() {
        print("执行服务操作")
    }
}

FirstVC接收服务并传递给子VC

class FirstVC: UIViewController {
    private let mainService: MainService
    private var pageVC: PageVC!

    // 通过初始化注入服务
    init(mainService: MainService) {
        self.mainService = mainService
        super.init(nibName: nil, bundle: nil)
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // 初始化PageVC时传递同一个服务实例
        pageVC = PageVC(mainService: mainService)
        // 添加pageVC到当前控制器逻辑...
    }
}

PageVC接收服务并传递给SecondVC

class PageVC: UIPageViewController {
    private let mainService: MainService

    init(mainService: MainService) {
        self.mainService = mainService
        super.init(transitionStyle: .scroll, navigationOrientation: .horizontal)
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    // 创建SecondVC时传递服务
    func createSecondVC() -> SecondVC {
        return SecondVC(mainService: mainService)
    }
}

SecondVC接收服务

class SecondVC: UIViewController {
    private let mainService: MainService

    init(mainService: MainService) {
        self.mainService = mainService
        super.init(nibName: nil, bundle: nil)
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    func useService() {
        mainService.doSomething()
    }
}

顶层注入实例

// 在AppDelegate或SceneDelegate中创建服务实例,注入给FirstVC
let mainService = MainService()
let firstVC = FirstVC(mainService: mainService)
// 展示firstVC的逻辑...

内容的提问来源于stack exchange,提问作者incelemeTRe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 22:10:34