全局依赖 (GlobalDependencies)

Swift Package Manager compatible MIT License Platforms

这是一个简单的依赖注入框架,适用于管理小型和中型应用程序中的全局依赖(基本上是应用级别的单例)。它的早期版本已成功应用于多个小型个人项目和一个中等规模的商业发布应用程序。

它的目的是尽可能减少依赖注入任务的阻力,以便早期应用程序仍然可以获得依赖注入的好处(更好的可测试性、更易于维护和更改依赖项),而不会减慢开发速度。

从版本 2 及更高版本开始,该软件包大量依赖于 Swift 宏的使用,因此需要 Xcode 15 和 Swift 5.9 工具链或更高版本。

要求

GlobalDependencies 本身没有太多的依赖项,因此它可以在工具支持的任何环境中工作。

工具

平台

安装

GlobalDependencies 目前仅通过 Swift Package Manager 支持。

如果正在开发自己的软件包,可以将以下行添加到您的 Package.swift 文件中

dependencies: [
    .package(url: "https://github.com/Gabardone/GlobalDependencies", from: "2.0.0"),
]

要添加到 Xcode 项目,请将 https://github.com/Gabardone/GlobalDependencies 粘贴到新软件包的 URL 字段中,并指定从当前版本开始的“高达下一个主要版本”。

如何使用 GlobalDependencies

该软件包已完全文档化,包括预期用法的教程。

您可以在这里找到该软件包 DocC 文档的在线版本。

在 Xcode 中安装依赖项进行开发时,您还可以选择 Product -> Build Documentation,这将把软件包的文档添加到 Xcode 文档查看器的内容中。

快速入门

看起来步骤很多,但实际上总共只需几分钟的工作,而且一旦设置好,进一步的工作几乎没有阻力。 更多详细说明请查看软件包的官方文档。

  1. 声明一个协议,用于导出您依赖项的 API。我们将其称为 API 协议(本快速入门中以 MyAPIProtocol 为例)。

  2. 确保该协议有一个默认实现,该实现将是您的运行代码默认使用的实现。 为了方便起见,可以将其自身命名,或者通过 typealias 命名为 DefaultMyAPIProtocol 之类的名称。

  3. 将 GlobalDependencies 软件包添加到您的项目依赖项中,并在声明 API 协议的位置 import GlobalDependencies

  4. 确保您的 API 协议的默认实现采用 DefaultDependencyValueFactory 协议,并返回与 any MyAPIProtocol 兼容的值。

  5. @Dependency 宏附加到您的 API 协议,如下所示

@Dependency
protocol MyDependencyProtocol {
    /* ... */
}
  1. 扩展 GlobalDepedencies 以采用 MyAPIProtocol.Dependency,如下所示
extension GlobalDependencies: MyAPIProtocol.Dependency {
    #GlobalDependency(type: MyAPIProtocol)
}
  1. 在您要注入该依赖项的任何类型上,附加带有 MyAPIProtocol 作为其参数之一的 @InjectedDependency
@InjectedDependencies(MyAPIProtocol)
class MyComponent {
    /* ... */
}
  1. 您需要向组件的初始化器添加一个 Dependencies 参数。
@InjectedDependencies(MyAPIProtocol)
class MyComponent {
    init(/* more parameters */, dependencies: Dependencies) {
        self.dependencies = dependencies
        /* ... */
    }

    /* ... */
}
  1. 只需从组件的 dependencies 中提取即可访问您注入的依赖项
@InjectedDependencies(MyAPIProtocol)
class MyComponent {
    /* ... */
    
    func doAThing() {
        /* ... */

        dependencies.myAPIProtocol.doSomething()

        /* ... */
    }

    /* ... */
}

依赖微型包 (Dependency Micropackages)

除了基础的 GlobalDependencies 软件包本身之外,我们还在根据需要构建许多常见的系统框架外观依赖项,这些依赖项可以快速轻松地采用,以抽象出常见的硬依赖项,并使生成的逻辑比其他方式更具可测试性。

这些通常都很小,因此我们称它们为依赖微型包(好吧,笑话不胫而走)。 只需查看帐户的存储库列表并检查那些命名为 *Dependency 的存储库,就可以很容易地找到我们自己构建的微型包。

由于这些依赖微型包是根据其他项目的需要构建的,因此它们通常不会实现对抽象 API 的完整包装(除非在某个时候需要全部 API)。 如果需要,请随时 Fork 并扩展,并请将任何您所做的对其他人可能有用的添加内容提交 PR。

贡献

虽然 GlobalDependencies 软件包本身可以“按原样”工作,并且不太可能进行重大更改,但我很清楚它仍然可以改进,因此欢迎提出建议,尤其是附带示例的建议。

依赖微型包总是可以使用更多的工作,因为它们是根据需要构建的。 如果您发现自己正在使用其中一个但正在改进它,请随时提交包含更改的 PR。 如果您为其他人可能使用的系统服务构建了一个通用服务,也是如此。 如果有人最终创建了任何依赖包,我将很乐意指向其他人的依赖包。

除此之外,请在提交 Pull Request 之前牢记 贡献指南 中提出的基线规则。

谢谢,祝您低摩擦依赖注入愉快!

开发

双击存储库根目录中的 Package.swift 以在 Xcode 中打开项目。或者从 Xcode 打开包含的文件夹(从命令行:open -a Xcode <path to package folder> 也可以)。