加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 05:03:40 所属栏目:百科 来源:网络整理
导读:新手 swift,我试图创建一个服务注册表: class ServiceRegistry { static var instance = ServiceRegistry() private var registry = [String:AnyObject]() private init(){} func registerT(key:T,value:AnyObject) { self.registry["(T.self)"] = value }
新手 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可能也不错.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读