Swinject:生成任何对象的实例(对于未注册的对象、ViewModel 等...)

Posted

技术标签:

【中文标题】Swinject:生成任何对象的实例(对于未注册的对象、ViewModel 等...)【英文标题】:Swinject: generate instances of any object (for not registered object, ViewModel, etc...) 【发布时间】:2018-04-03 08:29:05 【问题描述】:

是否可以解决/创建未在 Swinject 容器中注册的新对象实例?在 Unity 的 c#(来自 Microsoft)的依赖注入中就是这样。

我想解析对某些协议有依赖性的 viewModel 类。 例如: 我已经在容器中注册了 IFileManager:

container.register(IFileManager.self)  _ in FileManager() .inObjectScope(ObjectScope.container)

我的 viewModel 对 IFileManager 有依赖

class AwesomeViewModel
init (fileManager: IFileManager) 
    ....

现在我想使用 Swinject 解析器创建 AwesomeViewModel 的新实例,并且我希望将所有依赖项添加到 init 中,但它不起作用

viewModel = AppDelegate.container.resolve(AwesomeViewModel.self)

ViewModel 为零

【问题讨论】:

【参考方案1】:

不,Swinject 无法推断您希望使用哪种初始化方法来实例化AwesomeViewModel。您需要先明确定义它:

container.register(AwesomeViewModel.self) 
    AwesomeViewModel(fileManager: $0.resolve(IFileManager.self)!)

诚然,如果您的类具有许多依赖项,这可能会变得非常麻烦。如果这成为问题,我建议您查看SwinjectAutoregistration 扩展。它使您可以编写:

container.autoregister(AwesomeViewModel.self, initializer: AwesomeViewModel.init)

【讨论】:

以上是关于Swinject:生成任何对象的实例(对于未注册的对象、ViewModel 等...)的主要内容,如果未能解决你的问题,请参考以下文章

swinject 是不是重新实例化对象?

Swinject 返回 nil,因为对象注册错误

每次使用 Swinject 解析对象时如何返回相同的实例?

Swinject:使用弱范围会泄漏对象

Swinject注册UIViewController最佳实践

Swinject 容器注册失败