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 等...)