ios - Swinject 容器注册失败

标签 ios swift dependency-injection swinject

在尝试将某些协议(protocol)绑定(bind)到各种类时,我遇到了一种奇怪的行为,即在协议(protocol)中获取 nil。 这是依赖注入(inject)器类:

class DependencyInjector: NSObject {
    
    let container: Container
    
    override init() {
        container = Container()
        super.init()
        register()
    }
}

extension DependencyInjector {
    
    func register() {
        container.register(NetworkProtocols.self) { _ in ApiManager() }.inObjectScope(.container)
        container.register(ConnectivityManager.self) { r in
            let controller = ConnectivityManager()
            controller.network = r.resolve(NetworkProtocols.self)
            return controller
        }
        
        container.storyboardInitCompleted(ChooseCameraViewController.self) {r,c in
            c.network = r.resolve(NetworkProtocols.self)
        }
        
        container.storyboardInitCompleted(InstallationViewController.self) {r,c in
            c.network = r.resolve(NetworkProtocols.self)
        }
        
        container.storyboardInitCompleted(CameraSetupViewController.self) {r,c in
            c.network = r.resolve(NetworkProtocols.self)
        }
        
        container.storyboardInitCompleted(LoginViewController.self) { r,c in
            c.network = r.resolve(NetworkProtocols.self)
        }
    }
} 

这是AppDelegate:

var dependencyInjector: DependencyInjector!

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.        
    dependencyInjector = DependencyInjector()
    
    let window = UIWindow(frame: UIScreen.main.bounds)
    self.window = window
    let bundle = Bundle(for: ViewController.self)
    let storyboard = SwinjectStoryboard.create(name: "Main", bundle: bundle, container: dependencyInjector.container)
    window.rootViewController = storyboard.instantiateInitialViewController()
    
    return true
}

在下面的类中,我在协议(protocol)属性中得到了 nil:

class ConnectivityManager: NSObject {
    
    var network: NetworkProtocols!
    
    func connectHotSpot() {
        self.network.whoAmI(success: {
            print("api succses")
        }, failure: { (error) in
            print(error.localizedDescription)
        })
    }
}

网络变量始终为 nil,而在其他使用 storyboardInitCompleted 的类中,网络变量有效。

我做错了什么?

最佳答案

正如@JakubVano 所说,我必须获得 ConnectivityManager 的一个实例:

    container.register(ConnectivityManager.self) { r in
        let controller = ConnectivityManager()
        controller.network = r.resolve(NetworkProtocols.self)
        return controller
    }

   container.storyboardInitCompleted(ChooseCameraViewController.self) {r,c in
    c.connectivityManager = r.resolve(ConnectivityManager.self)!

    }

关于ios - Swinject 容器注册失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50482598/

相关文章:

ios - canOpenUrl - 不允许此应用程序查询 scheme instagram

ios - 如何在swift spritekit中加载游戏后立即调用scene.view.paused

ios - 在 NSOperation 子类 : sync or async pattern? 中发送多个请求

swift - 开发 macOS 的辅助应用程序,apiDisabled

IOS SWIFT - 服务调用完成获取时返回响应数据

c# - MEF 4.5 中缺少 CompositionInitializer。我可以用什么代替?

c# - 简易喷油器 : Decorator for multiple interfaces

使用 ASM 或 CGLib 的 Java 依赖注入(inject)

ios - Xamarin Storyboard 在构建 661 后无法正确呈现

ios - NSURLSessionConfiguration 不接受 HTTPAdditionalHeaders 中的 'Content type'