PropertyInjector 0.0.10

PropertyInjector 0.0.10

Stan Feldman维护。



  • 作者
  • Stan Feldman

PropertyInjector

Language Platform Version

为什么我应该使用PropertyInjector?

通常,依赖注入对您的应用程序有益,因为它促进了松散耦合的架构并提高了可测试性。实现依赖注入的方式有很多,但我认为属性依赖注入既灵活又易于使用。这个库实现了属性依赖注入,您只需在类中声明您的依赖并使用它们作为属性即可,无需构造函数参数或额外代码。

开始使用

安装库

对于Cocoapods,请在Podfile中添加以下行

pod 'PropertyInjector'

对于Carthage,请在Cartfile中添加以下行

github "stanfeldman/PropertyInjector"

注册您的依赖

确保在注入之前将依赖项注册。您可以在管理器的构造函数中注册依赖。

class DependencyManager {
    init() {
        DependencyResolver.register {
            $0.singleton(MyDependency())
            // or
            $0.singleton(MyInterface.self, MyImplementation())
        }
    }
}

并将此管理器添加到iOS项目的 AppDelegate 和SwiftUI项目的 App 对象中。

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    private let dependencyManager = DependencyManager()
}

注入您的依赖

只需将依赖对象声明为一个属性,并添加 @Inject 属性包装器。当对象使用时,将延迟解析该依赖。

class ViewController: UIViewController {
    @Inject private var dependency: MyDependency
}

特性

解析策略

支持两种解析策略。

  • factory 每次解析依赖时都会创建您的依赖。
  • singleton 仅在第一次创建依赖并重用实例。
DependencyResolver.register {
    $0.factory(MyDependency())
    $0.singleton(MyDependency())
}

依赖参数

您可以带参数注册依赖项。

DependencyResolver.register {
    $0.factory(MyDependency.self) { parameters in
        return MyDependency(name: parameters["name"] as! String)
    }
}

然后使用一些参数解析它。

@Inject(with: ["name": "Boris"]) private var dependency: MyDependency

let sub2: SubDependency2 = DependencyResolver.resolve(with: ["name": "Boris"])

手动依赖解析

使用 @Inject 的自动属性注入是首选,但手动解析依赖项也是可能的。

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let dependency1: MyDependency1 = DependencyResolver.resolve()
        let dependency2: MyDependency2 = DependencyResolver.resolve(with: ["uuid": UUID().uuidString])
    }
}

循环依赖

依赖按需解析,所以只要两个依赖都没有在它们的构造函数中使用,那么将类B注入到类A中,或者将类A注入到类B中是没有问题的。

可选解析

PropertyInjector将尝试解析可选的未包装类型。

class ViewController: UIViewController {
    @Inject private var dependency: MyDependency? // will try to resolve as MyDependency
    @Inject private var dependency: MyDependency! // the same
}

示例

要运行示例项目,请先克隆仓库,然后从 Example 目录运行 pod install

许可

PropertyInjector在MIT许可下可用。有关更多信息,请参阅LICENSE文件。