2

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

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

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

- (Client *)clientWithToken:(NSString *)token;

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

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

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

谢谢你。

4

1 回答 1

0

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

相反,请考虑以下建议:

注入一个共享上下文类

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

方面挂钩

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

  • 使用像这样的 Aspects 库。
  • 为客户端定义一个协议,并将基本实现包装在一个具有安全意识的协议中。
于 2015-03-15T02:47:51.463 回答