解决项目中模块间的平行依赖

  • 前言

前段时间ios小组一起做项目的模块化,目前项目主要有四个业务模块(有固定的四个小小队维护)和一个底层(包括网络请求库,数据库,公共组件类别等)。但是工作进行中发现,各业务模块出现平行调用,造成相互依赖。为了解决此问题,需要开发一个数据中心DataCenter的组件来剪断各业务模块间的依赖,DataCenter属于底层Core,业务模块只能依赖底层,不能依赖其他业务模块。

  • 流程图
DataCenter原理图.png
  1. 定义协议BFDataCenterDelegate,所有DataSource需要继承该协议。
/**
 各模块DataSources需要实现
 */
@protocol BFDataCenterDelegate <NSObject>

@optional

/**
 获取数据列表
 @param order 操作命令
 */
+ (void)doGetListWithOrder:(BFDCCommonOrder *)order;

/**
 获取详情
 @param order 操作命令
 */
+ (void)doGetDetailWithOrder:(BFDCCommonOrder *)order;

@end

2.创建DataSource,编写需要对外提供的服务。

@interface BFAuctionDataSource ()<BFDataCenterDelegate>

@end

@implementation BFAuctionDataSource

+ (void)load {
    // 注册
    [BFDataCenter registerDataSourceURLPattern:URL_AUCTION_CENTER dataSourceClass:[self class]];
}

+ (void)doGetListWithOrder:(BFDCCommonOrder *)order {
    ...doSomething
    if ( order.resultBlock ) {
        order.resultBlock(resultData);
        order.resultBlock = nil;
    }
}
@end

BFDCCommonOrder包含resourceName(子服务名),parameters(参数),resultBlock(回调)。

3.DataCenter调用对应DataSource服务

 NSString *pattern = targetOrder.modulesURL;
 Class dataSourceClass = [[self class] findViewObjectClassWithURLPattern:pattern];
    
  if ( [dataSourceClass respondsToSelector:@selector(doGetListWithOrder:)] ) {
        [dataSourceClass doGetListWithOrder:targetOrder];
  }

此处可以定义了一个ViewObject类统一做处理返回数据加工。

4.调用测试

[[BFDataCenter sharedInstance] fetchList:^(BFDCCommonOrder *order) {
    order.modulesURL = URL_AUCTION_CENTER;
    order.resourceName = URL_AUCTION_DATASOURCE_GETLIST;
    order.parameters = @{@"pageNum":@(0),@"pageSize":@(10),@"type":@2};
} asResult:^(BFDSResult *result) {
    NSLog(@"test result : %@",result.data);
} asError:^(BFDSError *error) {
    [BFCustomHUD showInfoWithStatus:error.errmsg];
}];

现在模块间的调用是不是简洁清晰多了,各业务只需要依赖DataCenter,不需要依赖其他模块任何文件就可以做到调用其他业务模块的服务。

总结
datacenter作用.png

从上图中的箭头表示依赖关系走向,优化前,各业务间平行依赖,相当混乱,简直是无法直视。经过DataCenter优化后,依赖关系就十分清晰,各业务只依赖底层Core。

这次模块化工作我们用cocoaPods管理,每个业务模块都是一个单独的私有库,而且只有对应的开发团队有修改权限,各业务独立开发互不干扰。任何一个业务模块与底层都能组装成一个单独的app,如果你觉得编译太慢,那么你可以在Podfile文件中注释掉另外的模块,由于模块间已经不存在平行依赖,编译完全不受影响。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,991评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,548评论 25 708
  • 何姓人四处流徙,在迭宕起伏、变幻莫测的形势下,谋求生存发展之道。皇天不负有心人,历朝历代的何姓先贤创造了不...
    涛声依旧_6e9d阅读 593评论 0 1
  • 从2008年2月12日开始,我们孩子就成了个不折不扣的小饲养员,呵呵,还真别说,这个小饲养员还挺称职呢。 自从那两...
    西瓜甜甜啦阅读 652评论 5 11
  • 接受不完美的自己,是大家能够最终进步的保障。人有悲欢离合,月有阴晴圆缺。上升和下降,才构成一个完整的周期。【海之梦...
    海之梦淡水湖阅读 210评论 0 0