PropertyInjector
为什么我应该使用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文件。