0

这是我使用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属性设为私有?

  • 在此设置中,如果我使用.Hierarchyor.Container范围会有所不同吗?

欢迎所有反馈。

4

0 回答 0