美文网首页iOS Developer
解决项目中模块间的平行依赖

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

作者: 东篱先生_ | 来源:发表于2017-05-03 17:37 被阅读0次
  • 前言

前段时间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文件中注释掉另外的模块,由于模块间已经不存在平行依赖,编译完全不受影响。

相关文章

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

    前言 前段时间ios小组一起做项目的模块化,目前项目主要有四个业务模块(有固定的四个小小队维护)和一个底层(包括网...

  • (010)SpringBoot下RestTemplate的使用

    一、引言 在多模块开发中,难免会出现模块间的业务协作。若是直接依赖模块,极大可能会出现模块的相互依赖。为解决该问题...

  • Android实现模块 api 化

    模块间的交互 首先是解决模块之前的依赖问题,模块间肯定是不能相互依赖的,那如何进行数据交互就是一个问题了;比如用户...

  • Android组件化之实现模块 API 化

    模块间的交互 首先是解决模块之前的依赖问题,模块间肯定是不能相互依赖的,那如何进行数据交互就是一个问题了;比如用户...

  • 查看模块依赖项,自定义构建逻辑

    查看模块依赖项 一些直接依赖项可能具有自己的依赖项。此类依赖项称为“传递依赖项”。Gradle 将会自动为您收集并...

  • ModuleService-Android模块之间解耦问题实现

    ModuleService 模块间解耦库,解决module之间的依赖问题,github地址:https://git...

  • webpack动机

    模块化风格 1.