在我们的项目模块化过程中,遇到了一个问题,就是业务方应该怎么去更好的调用模块提供的服务。大家可以看下modularize-client的工程代码,现在有两种方式。
第一种就是下载模块的,如下:
//2016.9.5 注释上面一行,改用如下解耦的方式
GETIFACE(iface, LTMDownloadManagerProtocol, DownLoadModuleName);
BOOL bResult = [iface AddDownloadWithMovieDetail:movieDetail
videoModel:video videoCodeType:rateCode == VIDEO_CODE_UNKNOWN ? VIDEO_CODE_SD : rateCode
icon:[movieDetail getDownloadIcon]
download_url:@""
file_Size:[NSString stringWithFormat:@"%f",fileSize]
download_Size:@"0"
download_Status:[NSString stringWithFormat:@"%d",DownloadStatusWait]
locale_File_Path:cacheDownloadFilePath
audioTrack:@""
subtitleDownloadStatus:@""
subtitleKey:@""];
用到的宏:
//定义获取接口的宏
#define GETIFACE(x, T, n) \
id<T> x = nil; \
{ \
LTMModuleManager *moduleManager = [LTMModuleManager sharedModuleManager]; \
LTMBaseModule *m = [moduleManager moduleWithName: (n)]; \
x = (id<T>) [m interfaceForProtocol: NSStringFromProtocol(@protocol(T))]; \
}
第二种是用户中心模块的,如下:
//获取设备的信息
[[LTUserCenterServiceManager auditService] getDeviceUidInfo];
用到的LTUserCenterServiceManager,是放在ModuleInterface这个工程下面,它负责为用户中心模块提供对外的调用的服务管理类。
@interface LTUserCenterServiceManager : NSObject
//用户(会员)相关服务
+ (id<LTUserCenterAuditProtocol>) auditService;
@end
@implementation LTUserCenterServiceManager
+ (id<LTUserCenterAuditProtocol>) auditService {
return [self getServiceByProtocol:NSStringFromProtocol(@protocol(LTUserCenterAuditProtocol))];
}
+ (id) getServiceByProtocol:(NSString *)protocol {
LTMModuleManager *moduleManager = [LTMModuleManager sharedModuleManager];
if (!moduleManager) {
return nil;
}
LTMBaseModule *m = [moduleManager moduleWithName:LTUsercenterModuleName];
if (!m) {
return nil;
}
return [m interfaceForProtocol:protocol];
}
@end
两种方式的主要区别是,前者由业务方调用宏GETIFACE,需要知道两参数,服务LTMDownloadManagerProtocol,模块DownLoadModuleName,这样就可以获得
模块提供这个服务的实例;而后者是在ModuleInterface这个工程中,统一管理用户中心模块提供的服务,业务方可以很方便的直接调用
[LTUserCenterServiceManager auditService]就可以获得这个实例了。
Centralization
说白了,后者的思路是将ModuleInterface想象成一个服务中心,我想要下载服务的时候,我就去问服务中心问去就好,那么服务中心就要承担集成每个小模块提供的服务优点就是在业务量较少的时候,可以高度集成服务,方便统一管理,但是缺点也是很明显,服务中心需要依赖不同小模块的服务,每次小模块提供的服务改动,都需要去通知中心服务修改。
Distribution
前者的思路是,每个模块就是一个小的服务中心,是一种分布式的服务,需要哪个模块的服务,只要提供模块名称(moduleName)和服务名称(protocolName)就可以了,缺点就是,没次都要提供比较多的代码去调用,当然可以在自己的模块里,统一集成依赖的外部服务,就是在自己的模块里弄一个serviceManage,就可以方面调用了。
优点就是真正将不同的模块做成模块化,业务方也有一个更清晰模块的概念,用最直接的方式去调用具体模块的服务。
大家想一想,哪种方式比较好呢?欢迎讨论~