これはSwinjectを使用する初めてのプロジェクトであり、適切に使用できるようにしたいと考えています。
C++/Objective-C のバックグラウンドを持つ私は、依存性注入コンテナーの経験があまりありません。
私はMVVMアーキテクチャに従い、SwinjectStoryboardストーリーボードを使用してすべてのView Controllerをインスタンス化します。
これが私のセットアップです:
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または.Containerスコープを使用すると違いがありますか?
すべてのフィードバックを歓迎します。