这是我使用Swinject的第一个项目,我想确保正确使用它。
来自 C++/Objective-C 背景,我对依赖注入容器没有太多经验。
我遵循 MVVM 架构,使用SwinjectStoryboard
并让故事板为我实例化所有视图控制器。
这是我的设置:
extension SwinjectStoryboard {
class func setup() {
// View Controllers
defaultContainer.registerForStoryboard(ItemsCollectionViewController.self) { resolver, controller in
controller.viewModel = resolver.resolve(ItemsCollectionViewModelProtocol.self)
controller.imageLoader = resolver.resolve(ImageLoaderProtocol.self)
}
// View Models
defaultContainer.register(ItemsCollectionViewModelProtocol.self) { resolver in
return ItemsCollectionViewModel(userSession: resolver.resolve(UserSessionProtocol.self)!)
}
// Services
defaultContainer.register(UserSessionProtocol.self) { resolver in
return UserSession(webService: resolver.resolve(WebServiceProtocol.self)!)
}.inObjectScope(.Hierarchy)
defaultContainer.register(WebServiceProtocol.self) { resolver in
return CloudKitService()
}.inObjectScope(.Hierarchy)
defaultContainer.register(ImageLoaderProtocol.self) { resolver in
let imageLoader = ImageLoader(fetcher: resolver.resolve(ImageFetcherProtocol.self)!,
cache: resolver.resolve(ImageCacheProtocol.self)!)
return imageLoader
}
defaultContainer.register(ImageFetcherProtocol.self) { resolver in
return CloudKitImageFetcher(database: .PublicDatabase)
}
defaultContainer.register(ImageCacheProtocol.self) { resolver in
return ImageDiskCache(location: .CachesDirectory, subDirectory: "items/pictures")
}
}
}
几个问题:
可以使用
defaultContainer
情节提要提供的所有内容吗?我是否可以假设没有办法为视图控制器使用初始化程序注入,因此无法将它们的
viewModel
属性设为私有?在此设置中,如果我使用
.Hierarchy
or.Container
范围会有所不同吗?
欢迎所有反馈。