Swinject - 如何从一个解析器两次解析同一个控制器?

Posted

技术标签:

【中文标题】Swinject - 如何从一个解析器两次解析同一个控制器?【英文标题】:Swinject - how to resolve the same controller twice from one resolver? 【发布时间】:2018-08-24 08:12:06 【问题描述】:
import Swinject

class GenericsAssembly: Assembly 
    func assemble(container: Container) 
        container.register(TabBarController.self)  resolver in
            let split1 = resolver.resolve(SplitViewController.self)!
            let split2 = resolver.resolve(SplitViewController.self)!
            split1.tabBarItem = UITabBarItem(title: "1", image: UIImage(named: "icon-notepad"), selectedImage: nil)
            split2.tabBarItem = UITabBarItem(title: "2", image: UIImage(named: "icon-chat"), selectedImage: nil)
            let controller = TabBarController(view: resolver.resolve(TabBarView.self)!)
            controller.viewControllers = [
                tasksSplitViewController,
                threadsSplitViewController
            ]
            return controller
        
        container.register(SplitViewController.self)  _ in
            return SplitViewController()
        
        container.register(TabBarView.self)  _ in
            return TabBarView()
        
    

而且...底部只有一个 TabBarItem。为什么?

如果我这样使用它:

let split1 = SplitViewController()
let split2 = SplitViewController()

那么一切都很好。;) 在我的实现中,Swinject 有什么问题?

【问题讨论】:

【参考方案1】:

你可以试试这个:

container.register(SplitViewController.self, name: "second")  _ in
    return SplitViewController()


let split2 = container.resolve(SplitViewController.self, name: "second")

以其他方式容器将返回已解析的控制器

【讨论】:

【参考方案2】:

如果您需要在单个register 闭包中解析两个不同的实例,则需要使用.transient 对象范围:

container.register(SplitViewController.self)  _ in SplitViewController() 
    .inObjectScope(.transient)

您可以在docs 中阅读有关对象范围的更多信息。

【讨论】:

【参考方案3】:

我添加了“名称”和“inObjectScope”,它对我有用。 检查下面我的工作示例

 var container = Container()

 container.register(ApiClientProtocol.self, name : "ApiClientInstance")  r in ApiClient().inObjectScope(.container)

 container.register(LoginViewModelProtocol.self)  r in LoginViewModel(fetcher: r.resolve(ApiClientProtocol.self, name: "ApiClientInstance")!)
  

LoginViewModel 类以上有 ApiClient 类的单例对象

【讨论】:

以上是关于Swinject - 如何从一个解析器两次解析同一个控制器?的主要内容,如果未能解决你的问题,请参考以下文章

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

Swinject:使用元类型列表解析

Webpack multiple 需要解析到同一个文件但被导入两次

DOJO 和 DIJIT 不能两次解析同一个 ID?

Laravel 访问器两次向 json 对象提供信息

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