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 - 如何从一个解析器两次解析同一个控制器?的主要内容,如果未能解决你的问题,请参考以下文章