微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有更好的方法在Swift中进行依赖注入呢?

新手 swift,我试图创建一个服务注册表:

class ServiceRegistry {

    static var instance = ServiceRegistry()

    private var registry = [String:AnyObject]()
    private init(){}

    func register<T>(key:T,value:AnyObject) {
        self.registry["\(T.self)"] = value
    }

    func get<T>(_:T) -> AnyObject? {
        return registry["\(T.self)"]
    }

}

但不是超级友好的:

寄存器:

ServiceRegistry.instance.register(CacheServiceProtocol.self,value:ImageCacheService())

检索:

if let cache = ServiceRegistry.instance.get(CacheServiceProtocol) as? CacheServiceProtocol { ... }

有更好的方法吗?摆脱as会有用吗? if中的CacheServiceProtocol …

解决方法

Swinject是Swift的依赖注入框架.在你的情况下,你可以使用它而不使用强制转换为?

寄存器:

let container = Container()
container.register(CacheServiceProtocol.self) { _ in ImageCacheService() }

检索:

let cache = container.resolve(CacheServiceProtocol.self)!

这里缓存被推断为CacheServiceProtocol类型.如果未注册指定的类型,则resolve方法返回nil.我们知道CacheServiceProtocol已经注册,所以强行解包!用来.

UPDATE

我没有完全回答这个问题.删除强制转换的实现是存储工厂闭包而不是注册表中的值.这是一个例子.我还修改了键的类型.

class ServiceRegistry {
    static var instance = ServiceRegistry()

    private var registry = [String:Any]()
    private init(){}

    func register<T>(key:T.Type,factory: () -> T) {
        self.registry["\(T.self)"] = factory
    }

    func get<T>(_:T.Type) -> T? {
        let factory = registry["\(T.self)"] as? () -> T
        return factory.map { $0() }
    }
}

寄存器:

ServiceRegistry.instance.register(CacheServiceProtocol.self) {
    return ImageCacheService()
}

检索:

// The type of cache is CacheServiceProtocol? without a cast.
let cache = ServiceRegistry.instance.get(CacheServiceProtocol.self)

使用@autoclosure可能也不错.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐