我正在尝试弄清楚如何在创建单例时将运行时参数注入到单例中,然后让这些参数从那时起就被记住。不过,我不确定运行时参数的接口是否支持这一点。例如,我有一个客户端对象,它需要一个令牌,并且具有以下初始值设定项:
+ (instancetype)initWithToken:(NSString *)token;令牌是在运行时从服务器获得的,对于每个用户来说都是不同的,所以我不能简单地将NSString放在定义中。因此,我在Typhoon程序集上创建了以下方法:
- (Client *)clientWithToken:(NSString *)token;但是,在将来(当我将这个客户端注入到其他类中时),我手头上将不会有用于调用此方法的令牌。例如,我希望能够注入[self client]。因为客户端是单例的,并且已经创建了,所以无论如何令牌都不是必需的。
然而,我似乎找不到这样做的方法。显然,定义一个名为client的单独方法只会返回一个不同的客户端。我是否可以只调用clientWithToken:nil,如果客户端已经存在,参数将被忽略?也许遍历程序集的singletons数组会起作用,但这显然是非常不优雅的。
我考虑过按类型注入(因此我不需要调用方法),但我有多个相同类型的不同客户端,因此我需要明确说明要注入哪个客户端。当然,也可以选择从初始化器中删除此参数,而从程序集外部将其设置为属性;但是,在整个应用程序中都使用此模式,因此我希望避免重写太多代码。
谢谢。
发布于 2015-03-15 10:47:51
回顾Typhoon用户指南的'When to Use Runtime Arguments‘,你会发现这个场景并不是一个很好的匹配。当我们有一个顶级组件,将一些静态依赖项与后来知道的信息混合在一起时,运行时参数是很好的--从而避免创建自定义的“工厂”类。不可能以描述的方式使用它们。
相反,请考虑以下建议:
注入共享上下文类
创建一个可变的Session模型对象,并将其注册到Typhoon。当您有令牌时,更新此模型上的状态。将其注入客户端,客户端将在建立连接时使用此会话信息。
方面挂钩
挂接您的客户端,以便在调用方法之前令牌信息可用。这可以通过以下方式完成:
使用像this one.
https://stackoverflow.com/questions/29055324
复制相似问题