FieryCrucible 3.0.1

FieryCrucible 3.0.1

测试经过测试
语言Swift 语言 SwiftSwift 版本
许可 MIT
发布最新发布2017年9月
SwiftSwift 版本4.0
SPM支持 SPM

Justin Kolb 维护。



Fiery Crucible

一个极简的类型安全 Swift 依赖注入工厂。所有真正的实例都在这里锻造。

变更日志

版本 2.1.3
  • 忘记更新 podspec 版本号。
版本 2.1.2
  • 修复了一个bug,该bug导致多次调用 weakShared 方法会引发崩溃。增加了一个测试以检测崩溃。
版本 2.1.1
  • Cocoapods 支持iOS和MacOS
版本 2.1.0
  • 使用 Swift 3.0.2 在 Ubuntu 16.04 上编译。
版本 2.0.4
  • 撤销 .gitignore 以便可以将 xcodeproj 的更改提交,这应该可以修复 Carthage 再次损坏。
版本 2.0.3
  • 重新构建项目和目录结构,使用 Swift Package Manager。
版本 2.0.2
  • Carthage 构建修复。
  • 跳过了 2.0.1,因为我忘记了更新 README。
  • 感谢 Alexander Baranovski 提示问题。
版本 2.0.0
  • 为 Swift 3.0 和 Xcode 8 GM 发布更新
  • 尝试添加 Swift Package Manager 支持
  • 添加测试以确保一切按预期工作并提供了用法示例
  • 清理了 API,移除了需要特定名称参数的方法(在 #function 之前用于名称)
  • 感谢 Anton Beloglazov 在大约 1.0.0 时协助修复循环依赖
版本 1.3.3
  • 感谢 Or Rosenblatt 更新支持 Swift 3.0 的代码。
版本 1.3.2
  • 感谢 Tim Ward 更新代码以支持 Swift 2.2。
版本 1.3.1
  • 每种方法都有一个新的形式,您现在可以在工厂参数初始化发生之后直接设置属性,这允许您在对象对其他对象可用之前先设置该对象(具有非循环依赖)。请参阅下面的更新示例。
版本 1.3.0
  • 增加了对 Swift 2 的支持
版本 1.2.0
  • 现在应与 Carthage 兼容
  • 已启用整个模块优化以提高编译时间
  • 加强了 API 的访问限制
  • 您不再需要指定名称参数(请参阅下面的更新示例)

特性

  • 构造函数注入
  • setter 注入
  • 简单的可理解代码
  • 类型安全
  • 四种内存管理类型
    • 共享 - 一个全局共享实例,其生命周期即工厂生命周期。
    • 弱共享 - 一个全局共享实例,其生命周期即某个对象(不包括工厂)的强引用存在期间。
    • 非共享 - 每次请求时都会创建一个独特的实例,其他对象必须保持对该实例的强引用才能保持其存在。
    • 作用域 - 每次请求时都会创建一个独特的实例。在请求过程中,任何引用它的其他对象都将获得相同的实例,请求完成后将创建一个不同且唯一的实例。另一个对象必须保持对该实例的强引用才能保持其存在。

循环依赖

循环引用仅通过使用 setter 注入来处理。这是因为所有实例都在setter注入触发之前的构建阶段创建,允许在需要之前建立引用。

如何使用

您可以将源代码复制到您的项目中,或者设置一个从本仓库的 git 子模块,并将项目拖到您的项目中作为子项目。

代码示例

import FieryCrucible
import UIKit

class CustomFactory : DependencyFactory {
    func application() -> CustomApplication {
        return shared(CustomApplication()) { instance in
            instance.factory = self
        }
    }

    func mainWindow() -> UIWindow {
        return shared(
            factory: {
                let instance = UIWindow(frame: UIScreen.mainScreen().bounds)
                instance.backgroundColor = UIColor.whiteColor()
                return instance
            },
            configure: { instance in
                instance.rootViewController = self.rootViewController()
            }
        )
    }

    func rootViewController() -> UIViewController {
        return scoped(UITabBarController()) { instance in
            instance.viewControllers = [
                self.tab0ViewController(),
                self.tab1ViewController(),
            ]
        }
    }

    ...
}

class CustomApplication {
    var factory: CustomFactory!

    func launch() {
        factory.mainWindow().makeKeyAndVisible()
    }
}

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var factory: CustomFactory!

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        factory = CustomFactory()
        factory.application().launch()
        return true
    }
}