能否通过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
相关产品推荐
相关产品推荐

