LightDependency 2.0-beta1

LightDependency 2.0-beta1

Aleksey Gotyanov维护。



LightDependency 2.0-beta1

  • 作者:
  • Gotyanov

Build Status Cocoapods platforms pod Carthage compatible

LightDependency

Swift的控制反转容器

安装

CocoaPods

# Podfile
use_frameworks!

target 'YOUR_TARGET_NAME' do
    pod 'LightDependency'
end

替换YOUR_TARGET_NAME,然后在Podfile目录下运行命令

$ pod install

Carthage

将下一行添加到 Cartfile

github "LightDependency/LightDependency"

然后运行

$ carthage update --platform ios

使用

简单示例

let container = LightContainer.createRootContainer()
container.configure(defaults: .registerSingletons) { context in
    context.register { MyApiClient() as MyApiClientType }
    context.register { resolver in
        try MyService(apiClient: resolver.resolve())
    }
}

let service: MyService = try container.resolve()

协议和类的定义

protocol MyApiClientType {
    // ...
}

final class MyApiClient: MyApiClientType {
    // ...
}

final class MyService {
    init(apiClient: MyApiClientType) {
        // ...
    }

    // ...
}

示例 2

let container = LightContainer.createRootContainer()
container.configure(defaults: .registerSingletons) { context in
    context.register { ItemService() }
        .asDependency(ofType: { $0 as ItemsProvider })
        .asDependency(ofType: { $0 as DetailInfoProvider })
}

container.configure(defaults: .createNewInstancePerResolve) { context in
    context.initContext.register(ItemListViewModel.init)
    context.initContext.register(ItemDetailsViewModel.init)
    context.factoryContext.register(ItemDetailsViewModelFactory.self)
}

let itemListViewModel: ItemListViewModel = try container.resolve()
定义

final class ItemService: ItemsProvider, DetailInfoProvider {
    // ...
}

protocol ItemsProvider {
    // ...
}

protocol DetailInfoProvider {
    // ...
}

typealias ItemDetailsViewModelFactory = (ItemModel) -> ItemDetailsViewModel

final class ItemModel {
    // ...
}

final class ItemListViewModel {
    init(itemsProvider: ItemsProvider, itemDetailsFactory: @escaping ItemDetailsViewModelFactory) {
        // ...
    }

    // ...
}

final class ItemDetailsViewModel {
    init(itemModel: ItemModel, detailInfoProvider: DetailInfoProvider) {
        // ...
    }

    // ...
}