Discoverer 0.0.3

Discoverer 0.0.3

Tomasz Lewandowski 管理。



  • Tomasz Lewandowski

Build Status codecov Carthage compatible Cocoapods Platform Platform License

Discoverer 是一个纯 Swift 编写的轻量级、多平台的依赖注入工具。

要求

开发

项目使用以下工具进行开发

  1. XCodeGen
  2. Cocoapods
  3. SwiftLint

安装

要开始使用 Discoverer,您首先必须决定如何将其集成到您的项目中。Discoverer 支持以下工具

Cocoapods

使用 Cocoapods 安装 Discoverer,请按照以下步骤操作

  1. 在您的 Podfile 中添加以下条目
pod 'Discoverer'
  1. 然后运行 pod install

Carthage

使用 Carthage 安装 Discoverer,请按照以下步骤操作

  1. 在您的 Cartfile 中添加以下条目
github "lewandowskit93/Discoverer"
  1. 然后运行 carthage update

Swift 包管理器

要使用 Swift 包管理器 安装 Discoverer,请按照以下步骤操作

  1. 请在你的 Package.swift 文件中添加以下包依赖:.package(url: "https://github.com/lewandowskit93/Discoverer.git", from: "0.0.3")
  2. 请添加以下目标依赖到你的 Package.swift 文件中:dependencies: ["Discoverer"])

例如,它可能看起来像这样

import PackageDescription

let package = Package(
    name: "YourLibrary",
    products: [
        .library(
            name: "YourLibrary",
            targets: ["YourLibrary"])
    ],
    dependencies: [
        .package(url: "https://github.com/lewandowskit93/Discoverer.git", from: "0.0.3")
    ],
    targets: [
        .target(
            name: "YourLibrary",
            dependencies: ["Discoverer"])
    ]
)

概述

以下是 Discoverer 中使用的功能及其概念的简要概述。

注入

注入 是一个表示单个注入的枚举。它可以有以下几种类型:

  • 单例(Singleton) - 每次都返回相同的实例,例如:
Injectable<PFoo>.singleton(Foo())
  • 懒加载单例(LazySingleton) - 如果没有实例,它将使用工厂来创建一个,然后每次都返回这个实例,例如:
Injectable<PFoo>.lazySingleton(nil, { Foo() })
  • 工厂(Factory) - 每次都返回新的实例,例如:
Injectable<PFoo>.factory({ Foo() })

注入器

注入器(Injector) 管理已注入的服务。它可以通过提供以下方式提供对服务的访问:

  • 索引器(subscript) - 返回可选类型的服务(如果没有注册,则为 nil)例如:
injector[PFoo.self]
  • 获取器(getter) - 返回服务,如果没有注册则抛出错误例如:
injector.get(PFoo.self)

已注入

已注入(Injected) 是一个属性包装器,它标记一个属性为使用给定的注入器提供的服务进行注入。例如用法:

@Injected var foo: PFoo

已注入(Injected)还允许你指定要使用的容器,例如

@Injected(injector: Environment.services) var serviceA: PServiceA

已注册

已注册 是一个属性包装器,用于标记一个注入对象在给定的注入器中被注册。示例用法

@Registered
var serviceAInjection = Injection<PServiceA>.singleton(ServiceA())

已注册还允许您指定要使用的容器,如下所示

@Registered(inInjector: Environment.services)
var serviceAInjection = Injection<PServiceA>.singleton(ServiceA())

示例

给定环境

struct Environment {
    static var services: Injector = Injector()
    static var repositories: Injector = Injector()
}

我们可以定义以下服务和存储库

protocol PServiceA {
    func foo()
}

class ServiceA: PServiceA {
    func foo() {
        print("Service A")
    }
}

protocol PRepositoryB {
    func foo() -> String
}

class RepositoryB: PRepositoryB {
    func foo() -> String {
        return "foo"
    }
}

然后按照以下方式配置注入器

struct Configurator {
    static func configure(repositories: Injector, services: Injector) throws {
        _ = try? repositories
            .register(as: PRepositoryB.self, injectable: .singleton(RepositoryB()))
        _ = try? services
            .register(as: PServiceA.self, injectable: .factory({ ServiceA() }))
    }
}

或者

struct Configurator {
    @Registered(inInjector: Environment.repositories)
    var repositoryBInjection = Injection<PRepositoryB>.factory({ RepositoryB() })

    @Registered(inInjector: Environment.services)
    var serviceAInjection = Injection<PServiceA>.singleton(ServiceA())
}

第二种方法需要创建一个配置器的实例,以便注册注入

然后向 ViewModel 注入依赖项

struct FooViewModel {
    @Injected(injector: Environment.services) var serviceA: PServiceA
    @Injected(injector: Environment.repositories) var repositoryB: PRepositoryB
}

有关更多详细示例,请参阅源代码。

贡献

本项目由 tomasz-lw 创建和维护。

如果您添加了新功能或修复了漏洞,您可以创建一个拉取请求。如果您有任何功能请求,请随时提交。

许可证

Discoverer 在 MIT 许可下发布。有关更多信息,请参阅 License.md