0

これは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スコープを使用すると違いがありますか?

すべてのフィードバックを歓迎します。

4

0 に答える 0