Swinject 容器注册失败

Posted

技术标签:

【中文标题】Swinject 容器注册失败【英文标题】:Swinject container registration fails 【发布时间】:2018-05-23 07:43:12 【问题描述】:

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

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

在下面的类中,我在协议属性中得到nil

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

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

我做错了什么?

【问题讨论】:

如何获取ConnectivityManager的实例?我在您提供的代码中没有看到 resolve(ConectivityManager.self) @JakubVano 感谢您的提示,答案如下 【参考方案1】:

正如@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)!

    

【讨论】:

以上是关于Swinject 容器注册失败的主要内容,如果未能解决你的问题,请参考以下文章

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

登录 Azure 容器注册表时 SSL 证书验证失败

当对象范围为容器时,多次调用 Swinject 工厂关闭

无法组装交易,错误提案响应不成功,错误代码 500,msg 链码注册失败:容器以 0 退出

Swinject 返回 nil,因为对象注册错误

使用 swinject 注册具有关联类型的协议时出现问题