ios - 台风:将运行时参数注入(inject)单例

标签 ios objective-c dependency-injection typhoon

我试图弄清楚如何在创建单例时将运行时参数注入(inject)到单例中,然后从那时起记住这些参数。不过,我不确定运行时参数的接口(interface)是否可以支持这一点。比如说,我有一个需要 token 的 Client 对象,并且具有以下初始化程序:

+ (instancetype)initWithToken:(NSString *)token;

token 是在运行时从服务器获取的,对于每个用户来说都是不同的,所以我不能简单地将 NSString 放在定义中。因此,我在 Typhoon 程序集上创建了以下方法:
- (Client *)clientWithToken:(NSString *)token;

但是,将来(当我将此客户端注入(inject)其他类时),我将没有手头的 token 来调用此方法。所以我希望能够注入(inject) [self client] , 例如。由于客户端是单例并且已经创建,因此无论如何都不需要 token 。

但是,我似乎无法找到一种方法来做到这一点。显然,定义一个名为 client 的单独方法只会返回一个不同的客户。我可以直接调用clientWithToken:nil吗?如果客户端已经存在,该参数将被忽略?也许遍历程序集的singletons array 可以工作,但这显然非常不雅。

我考虑过按类型注入(inject)(所以我不需要调用方法),但是我有多个相同类型的不同客户端,所以我需要明确说明要注入(inject)哪个客户端。当然,也可以选择从初始化程序中删除此参数,而是将其设置为程序集外部的属性;但是这种模式在我们的整个应用程序中都使用过,所以我想避免重写那么多代码。

谢谢你。

最佳答案

查看 Typhoon 用户指南的“When to Use Runtime Arguments” ' 表明这种情况并不是一个很好的匹配。当我们有一个将一些静态依赖项与稍后已知的信息混合在一起的顶级组件时,运行时参数非常有用 - 从而避免了创建自定义“工厂”类。不可能以所描述的方式使用它们。

相反,请考虑以下建议:

注入(inject)共享上下文类

创建一个可变 Session模型对象并将其注册到 Typhoon。当你有一个 token 时更新这个模型的状态。将其注入(inject)客户端,客户端将在建立连接时使用此 session 信息。

方面 Hook

Hook 您的客户端,以便在调用方法之前可以使用 token 信息。这可以通过以下方式完成:

  • 使用像 this one 这样的 Aspects 库.
  • 为客户端定义一个协议(protocol),并将基本实现包装在一个具有安全意识的协议(protocol)中。
  • 关于ios - 台风:将运行时参数注入(inject)单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29055324/

    相关文章:

    java - 是否可以为注入(inject)的 Java 资源设置 Lifestyle

    android - 错误 : cannot find symbol class DaggerAppComponent version conflict with other dependencies

    c# - 通过依赖注入(inject)将配置传递给 webjobs

    ios - 在 AudioQueue 的缓冲区之间单击/点击

    iphone - 如何知道/测试动画何时播放完毕

    ios - Autoreleased 变量在 iOS 7.1 更新中崩溃,但在 iOS 7.1 之前的操作系统版本中工作正常

    ios - AES 解密互​​操作性 IOS 和 Python

    ios - 混合模式 kCGBlendModeMultiply 没有正确地将图像与颜色相乘

    objective-c - for (NSArray *a in directory) 无法按我的预期工作

    objective-c - iOS 5.1 + PortraitMode 中的 UISplitViewController + MasterController 中的 UIActionSheet = 断言失败