首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Typhoon:将运行时参数注入单例

Typhoon:将运行时参数注入单例
EN

Stack Overflow用户
提问于 2015-03-15 07:08:43
回答 1查看 530关注 0票数 2

我正在尝试弄清楚如何在创建单例时将运行时参数注入到单例中,然后让这些参数从那时起就被记住。不过,我不确定运行时参数的接口是否支持这一点。例如,我有一个客户端对象,它需要一个令牌,并且具有以下初始值设定项:

代码语言:javascript
复制
+ (instancetype)initWithToken:(NSString *)token;

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

代码语言:javascript
复制
- (Client *)clientWithToken:(NSString *)token;

但是,在将来(当我将这个客户端注入到其他类中时),我手头上将不会有用于调用此方法的令牌。例如,我希望能够注入[self client]。因为客户端是单例的,并且已经创建了,所以无论如何令牌都不是必需的。

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

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

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2015-03-15 10:47:51

回顾Typhoon用户指南的'When to Use Runtime Arguments‘,你会发现这个场景并不是一个很好的匹配。当我们有一个顶级组件,将一些静态依赖项与后来知道的信息混合在一起时,运行时参数是很好的--从而避免创建自定义的“工厂”类。不可能以描述的方式使用它们。

相反,请考虑以下建议:

注入共享上下文类

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

方面挂钩

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

使用像this one.

  • Define这样的方面库为客户端提供
  • ,并将基本实现包装在一个安全感知的协议中。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29055324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档