NamadaInject 0.2.3

NamadaInject 0.2.3

nayanda1 维护。



  • nayanda

NamadaInject

NamadaInject 是一个简单的 Swift 依赖注入库

CI Status Version License Platform

示例

要运行示例项目,首先克隆仓库,然后在 Example 目录中运行 pod install

要求

安装

NamadaInject 可以通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中

pod 'NamadaInject'

作者

nayanda, [email protected]

许可证

NamadaInject遵循MIT许可证。详情请参阅LICENSE文件。

基本用法

NamadaInject非常容易使用,只需要提供一些依赖的提供者

NamadaInjector.provide(for: Dependency.self, SomeDependency())

然后在你的类中使用属性包装器或者使用全局函数来使用它

class InjectedByPropertyWrapper {
    @Injected var dependency: Dependency
    
    ...
    ...
}

class InjectedByInit {
    var dependency: Dependency
    
    init(dependency: Dependency = inject()) {
        self.dependency = dependency
    }
}

提供者是自动闭包类型的,所以你可以这样做

NamadaInjector.provide(for: Dependency.self) {
    dependency: SomeDependency = .init()
    dependency.doSomeSetup()
    return dependency
}

提供者会自动只创建一个实例。如果你想让提供者为每次注入创建新实例,你可以传递选项

NamadaInjector.provide(for: Dependency.self, option: .alwaysNew, SomeDependency())

或者如果你想显式将其设置为单例

NamadaInjector.provide(for: Dependency.self, option: .singleton, SomeDependency())

别忘了,如果没有注册提供者,它会抛出不可捕获的错误。如果你想手动捕获错误,只需使用tryInject代替

class InjectedByInit {
    var dependency: Dependency
    
    init(dependency: Dependency? = nil) {
        do {
            self.dependency = dependency ?? try tryInject()
        } catch {
            self.dependency = DefaultDependency()
        }
    }
}

不匹配规则

如果NamadaInjector没有找到完全匹配的类型但找到了多个兼容类型,它将使用与请求类型最接近的一个。

protocol Dependency {
    ...
    ...
}

class MyDependency: Dependency {
    ...
    ...
}

class YourDependency: MyDependency {
    ...
    ...
}

class OurDependency: YourDependency {
    ...
    ...
}

你可以这样注册你的依赖项

NamadaInjector.provide(for: Dependency.self, MyDependency())
NamadaInjector.provide(for: YourDependency.self, YourDependency())
NamadaInjector.provide(for: OurDependency.self, OurDependency())

结果将是

class InjectedByPropertyWrapper {
    @Injected var thisWillBeMyDependency: Dependency
    @Injected var thisWillBeYourDependency: MyDependency
    @Injected var thisWillBeYourDependencyToo: YourDependency
    @Injected var thisWillBeOurDependency: OurDependency
    
    ...
    ...
}


class InjectedByInit {
    var thisWillBeMyDependency: Dependency
    var thisWillBeYourDependency: MyDependency
    var thisWillBeYourDependencyToo: YourDependency
    var thisWillBeOurDependency: OurDependency
    
    init(thisWillBeMyDependency: Dependency = inject(),
         thisWillBeYourDependency: MyDependency = inject(),
         thisWillBeYourDependencyToo: YourDependency = inject(),
         thisWillBeOurDependency: OurDependency = inject()) {
        self.thisWillBeMyDependency = thisWillBeMyDependency
        self.thisWillBeYourDependency = thisWillBeYourDependency
        self.thisWillBeYourDependencyToo = thisWillBeYourDependencyToo
        self.thisWillBeOurDependency = thisWillBeOurDependency
    }
}

如果你更愿意使用已注册的最远类型,则可以在propertyWrapper或inject函数中传递规则,如以下所示

class InjectedByPropertyWrapper {
    @Injected(ifNoMatchUse: .furthestType) 
    var thisWillBeMyDependency: Dependency
    
    @Injected(ifNoMatchUse: .furthestType) 
    var thisWillBeOurDependency: MyDependency
    
    @Injected(ifNoMatchUse: .furthestType) 
    var thisWillBeYourDependency: YourDependency
    
    @Injected(ifNoMatchUse: .furthestType) 
    var thisWillBeOurDependencyToo: OurDependency
    
    ...
    ...
}


class InjectedByInit {
    var thisWillBeMyDependency: Dependency
    var thisWillBeOurDependency: MyDependency
    var thisWillBeYourDependency: YourDependency
    var thisWillBeOurDependencyToo: OurDependency
    
    init(thisWillBeMyDependency: Dependency = inject(ifNoMatchUse: .furthestType),
         thisWillBeOurDependency: MyDependency = inject(ifNoMatchUse: .furthestType),
         thisWillBeYourDependency: YourDependency = inject(ifNoMatchUse: .furthestType),
         thisWillBeOurDependencyToo: OurDependency = inject(ifNoMatchUse: .furthestType)) {
        self.thisWillBeMyDependency = thisWillBeMyDependency
        self.thisWillBeOurDependency = thisWillBeOurDependency
        self.thisWillBeYourDependency = thisWillBeYourDependency
        self.thisWillBeOurDependencyToo = thisWillBeOurDependencyToo
    }
}

贡献

你知道怎么做,只需克隆并提交pull request即可