Discoverer 是一个纯 Swift 编写的轻量级、多平台的依赖注入工具。
要求
开发
项目使用以下工具进行开发
安装
要开始使用 Discoverer,您首先必须决定如何将其集成到您的项目中。Discoverer 支持以下工具
Cocoapods
使用 Cocoapods 安装 Discoverer,请按照以下步骤操作
- 在您的 Podfile 中添加以下条目
pod 'Discoverer'
- 然后运行
pod install
。
Carthage
使用 Carthage 安装 Discoverer,请按照以下步骤操作
- 在您的 Cartfile 中添加以下条目
github "lewandowskit93/Discoverer"
- 然后运行
carthage update
Swift 包管理器
要使用 Swift 包管理器 安装 Discoverer,请按照以下步骤操作
- 请在你的 Package.swift 文件中添加以下包依赖:
.package(url: "https://github.com/lewandowskit93/Discoverer.git", from: "0.0.3")
- 请添加以下目标依赖到你的 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。