Swinject中不同的ViewControllers中的依赖注入不一致,发布Swift 3.0更新:为什么?

时间:2016-10-14 18:45:46

标签: ios swift swinject

我正在注册一些Swinject singleton-with-a-small-s(.container)服务:

defaultContainer.register( SomeService.self )
{
    _ in SomeService() 
}.inObjectScope( .container )

defaultContainer.register( AnotherService.self )
{
    responder in AnotherService(
        someService: responder.resolve( SomeService.self )!
    )
}.inObjectScope( .container )

将它们注入某些视图控制器中:

defaultContainer.registerForStoryboard( SomeViewController.self )
{
    resolvable, viewController in
    viewController.someService = resolvable.resolve( SomeService.self )
    viewController.anotherService = resolvable.resolve( AnotherService.self )!
}

defaultContainer.registerForStoryboard( AnotherViewController.self )
{
    resolvable, viewController in
    viewController.someService = resolvable.resolve( SomeService.self )
    viewController.anotherService = resolvable.resolve( AnotherService.self )!
}

然后以两种不同的方式显示这些视图控制器,SomeViewController,如下所示:

DispatchQueue.main.async
{
    self.performSegue( withIdentifier: "somePageSegue", sender: nil )
}

AnotherViewController就像这样:

let anotherViewController = UIStoryboard(
    name: "Main"
    , bundle: nil
).instantiateViewController( withIdentifier: "anotherSegue" )

present( anotherViewController, animated: true, completion: nil )

SomeViewController会注入其服务,但不幸的是AnotherViewController没有。

这曾经在Swinject升级到Swift 3.0之前工作,但现在不行。为什么会这样,需要改变什么呢?

谢谢。

更新

我既不熟悉Swinject的基础代码库,也不熟悉我自己熟悉的时间,而是挖掘表面下发生的事情,我发现了以下内容,希望对此有用任何可能比我更了解它的人:

成功的VC DI:

// once into:
private func injectDependency(to viewController: UIViewController)

// then:
defaultContainer.registerForStoryboard( SomeViewController.self )

// then many times into:
public func _resolve<Service, Factory>(name: String?, option: ServiceKeyOptionType? = nil, invoker: (Factory) -> Service) -> Service?

FAILED VC DI:

// repeatedly going from:
private func injectDependency(to viewController: UIViewController)

// to:
public func _resolve<Service, Factory>(name: String?, option: ServiceKeyOptionType? = nil, invoker: (Factory) -> Service) -> Service?

// and back again,
// then twice into:
public override func instantiateViewController(withIdentifier identifier: String) -> UIViewController

其他说明:

失败的VC是TabBarController中的UIViewController,两者都已经在标准的XCode故事板中布局。

2 个答案:

答案 0 :(得分:1)

为了调用registerForStoryboard,您需要从SwinjectStoryboard实例化给定的控制器,而不仅仅是UIStoryboard

let anotherViewController = SwinjectStoryboard.create(name: "Main", bundle: nil)
    .instantiateViewController(withIdentifier: "anotherSegue")

present(anotherViewController, animated: true, completion: nil)

答案 1 :(得分:1)

事实证明这是一个错误,详见:https://github.com/Swinject/Swinject/issues/177。目前正在修复一个修复程序。一旦我了解更多,我会报告。

<强>更新

这显然是固定的。