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

能否通过Swinject容器解析未注册对象?附Unity DI对比示例

关于Swinject解析未注册对象的问题

当然可以!Swinject完全支持解析那些没有在容器中显式注册,但依赖项已经注册过的类型,这和你熟悉的C# Unity DI的行为一致。

针对你给出的场景,已经在容器中注册了IFileManager:

container.register(IFileManager.self) { _ in FileManager() }
    .inObjectScope(.container)

而你的AwesomeViewModel依赖IFileManager,构造函数是:

class AwesomeViewModel {
    init(fileManager: IFileManager) {
        // 初始化逻辑
    }
}

你不需要提前在容器中注册AwesomeViewModel,直接调用容器的resolve方法就能创建并注入依赖:

let awesomeVM = container.resolve(AwesomeViewModel.self)

原理说明

Swinject会自动扫描目标类型的构造函数,识别出它依赖的IFileManager接口,而这个接口已经在容器中有注册实例,所以会自动取出对应的FileManager实例注入到ViewModel的构造函数中,完成对象的初始化。

注意事项

  • 确保AwesomeViewModel的构造函数是可访问的:如果是跨模块使用,构造函数需要标记为public;同模块内则默认访问权限即可。
  • 如果你的ViewModel有多个构造函数,Swinject默认会优先选择参数最多的那个。如果需要指定特定构造函数,你可以显式注册并手动注入依赖(不过这就不属于“未注册对象”的场景了),示例如下:
// 显式注册指定构造函数的情况(可选)
container.register(AwesomeViewModel.self) { resolver in
    AwesomeViewModel(fileManager: resolver.resolve(IFileManager.self)!)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:09:19