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

  • 前言

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

  • 流程图
解决项目中模块间的平行依赖_第1张图片
DataCenter原理图.png
  1. 定义协议BFDataCenterDelegate,所有DataSource需要继承该协议。
/**
 各模块DataSources需要实现
 */
@protocol BFDataCenterDelegate 

@optional

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

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

@end

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

@interface BFAuctionDataSource ()

@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,不需要依赖其他模块任何文件就可以做到调用其他业务模块的服务。

总结
解决项目中模块间的平行依赖_第2张图片
datacenter作用.png

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

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

你可能感兴趣的:(解决项目中模块间的平行依赖)