依赖注入与单例,初始化

时间:2014-07-16 15:40:09

标签: objective-c typhoon

我现在正在开展一个大项目,该应用程序正在利用许多不同的服务,如: 评论,喜欢,帖子,购买等..

每个服务都有一个班级。

现在,我想要限制注册用户,对于某些操作,如帖子,评论等等。

直到现在每个班级只使用类方法,如下所示:

 @interface UpdateOrderServies : NSObject

+(void)deleteOrder: (STOrder *)order
         andReturn: (void(^)(NSError *error))errorBlock;

+(void)updateOrder: (STOrder *)order
         andReturn: (void(^)(NSError *error))errorBlock;

但是现在,我想首先检查用户是否已注册,如果没有,则不返回值。 因此,我想出的最好的方法是将类更改为单调,并在每次调用类时询问,如果用户注册如此:

+(id) getInstance {

    static UpdateOrderServies *__sharedDataModel = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        __sharedDataModel = [[UpdateOrderServies alloc]init];

    });

    if (![__sharedDataModel userIsRegisterd]) {
        return nil;
    }

    return __sharedDataModel;

}

它有效,但是,嗯,它不是一个非常好的答案,你可以看到..我想要更通用的东西。 我正在考虑使用Typhoon依赖注入,但如果用户注册的话,我无法检查每个呼叫... 有没有想过更好的方法来处理这个问题?更有活力......

1 个答案:

答案 0 :(得分:0)

根据您的上述问题,我认为您不是在寻找依赖注入,而是在面向方面编程。

Aspect Orientes Programming(AOP)旨在准确解决您在上面描述的各种问题 - 这些问题涉及系统中的许多模块。示例:

  • 每次用户与服务进行交互时,都应检查安全性。
  • 所有交易应具有审计线索
  • 每个商店的互动应该会产生天才推荐

如果我们使用正常的面向对象编程来满足这些交叉要求,我们就打破了单一责任原则,一个应该几乎关于一个主题的类现在正在承担更多的角色令人困惑,重复和凌乱。

AOP模块化这些跨领域的问题,然后使用方法拦截识别应该应用的所有地方。 (在AOP中我们称之为切入点的表达式)。

在Objective-c中,您可以使用ISA调配,消息转发或使用NSProxy进行手动AOP - 这些都是在运行时实现方法拦截的方法。或者,您可以使用Pete Steinberger和团队的库和一个名为“Aspects”的库。该库目前还没有切入点的表达式语言,但仍然比直接使用ObjC运行时拦截方法简单得多。

授权方面的工作原理摘要:

  • 登录时,我们使用用户名/密码质询,oauth令牌或类似功能对我们的用户进行身份验证。通过对用户进行身份验证后,我们现在可以授权服务调用。
  • 确定需要授权的每项服务以及所需的权限(您可以使用任何您喜欢的角色,功能等方案)。
  • 良好的面向对象原则说每个班级应该承担一个责任。所以你的服务客户端应该是关于调用远程服务的。我们可以编辑服务客户端以评估登录用户的权限并决定是否继续。但这将是混乱和重复。相反,我们将使用步骤2中的信息(每个服务所需的权限)并将其评估委托给我们的授权模块。
  • 现在AOP步骤: 对于每个服务调用,我们将告诉我们的AOP lib拦截服务客户端方法并首先调用授权模块。

这样就不会重复您的横切要求(授权客户端调用)。现在您可以为简单起见决定让每个服务调用一个授权模块,但它仍然有助于了解AOP背后的理论和跨领域的关注点。

依赖注入/台风

依赖注入并不直接与您的问题有关,尽管它肯定有助于避免单身客户的陷阱:

  • 在您的班级之间创建一个明确的合同 - 增加代码凝聚力。
  • 确定应用程序中的关键“角色”,并描述它们组合成一个整体的方式。可以将一个演员换成另一个演奏者来完成相同的合同。
  • 使用模拟和存根简化单元测试。
  • 简化集成测试 - 能够将一个actor换成另一个actor,使系统进入所需状态。例如,仅修补授权模块。