【问题标题】:Swinject - how to resolve the same controller twice from one resolver?Swinject - 如何从一个解析器两次解析同一个控制器?
【发布时间】: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 有什么问题?

【问题讨论】:

    标签: ios swift 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 类的单例对象

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-02
          • 2023-03-22
          • 1970-01-01
          • 2017-12-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多