我现在正在开展一个大项目,该应用程序正在利用许多不同的服务,如: 评论,喜欢,帖子,购买等..
每个服务都有一个班级。
现在,我想要限制注册用户,对于某些操作,如帖子,评论等等。
直到现在每个班级只使用类方法,如下所示:
@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依赖注入,但如果用户注册的话,我无法检查每个呼叫... 有没有想过更好的方法来处理这个问题?更有活力......
答案 0 :(得分:0)
根据您的上述问题,我认为您不是在寻找依赖注入,而是在面向方面编程。
Aspect Orientes Programming(AOP)旨在准确解决您在上面描述的各种问题 - 这些问题涉及系统中的许多模块。示例:
如果我们使用正常的面向对象编程来满足这些交叉要求,我们就打破了单一责任原则,一个应该几乎关于一个主题的类现在正在承担更多的角色令人困惑,重复和凌乱。
AOP模块化这些跨领域的问题,然后使用方法拦截识别应该应用的所有地方。 (在AOP中我们称之为切入点的表达式)。
在Objective-c中,您可以使用ISA调配,消息转发或使用NSProxy进行手动AOP - 这些都是在运行时实现方法拦截的方法。或者,您可以使用Pete Steinberger和团队的库和一个名为“Aspects”的库。该库目前还没有切入点的表达式语言,但仍然比直接使用ObjC运行时拦截方法简单得多。
授权方面的工作原理摘要:
这样就不会重复您的横切要求(授权客户端调用)。现在您可以为简单起见决定让每个服务调用一个授权模块,但它仍然有助于了解AOP背后的理论和跨领域的关注点。
依赖注入/台风
依赖注入并不直接与您的问题有关,尽管它肯定有助于避免单身客户的陷阱: