模块解耦合问题

119 阅读2分钟

一.目前模块结构

目前存在的问题:模块解耦后,由于模块职责混乱,加上模块基础服务没有沉淀为基础服务层供其他模块使用;导致CTMediator桥结构滥用产生的系列问题;如钱包模块需要发送IM消息时,需要从钱包通过CBCMeditor桥转到IM模块才能发送IM消息。

下载.png

1.目前发红包的结构大概是这样子的,即使后面我们用:MXSharedInjection.register(xxxInterface.self){xxxImplement.shared}方式去做聊天模块与钱包模块的交互解耦合仍然也是会演变这个结构。

猜想大致代码是:

//示例:MXSharedInjection.register(MXIMRouterManagerDI.self) { \_ in MXIMRouterManager.shared }  MXSharedInjection.register(MXIMModuleInterface.self) { \_ in MXIMModuleImplement.shared }

猜想大概我们还是在MXInjection 协议库中申明IM模块提供的服务接口,在MIMMod模块中提供一个类去实现前面申明的协议。

2.但是这种结构存在的问题是,为什么在钱包模块发完红包后,产生的红包消息数据一定要去IM模块进行红包消息的插入呢,我们能否在钱包模块就完成红包消息的插入呢。

3.如果以上模块结构图对目前存在的问题看的不是很清晰的话,下面以聊天页面发红包功能为例,描述一下发红包功能的时序图:

WechatIMG2.jpg

4.通过以上时序图,我们可以看到整个项目中模块之间的交互逻辑都是通过CTMediator桥来实现的。比如从聊天模块进入钱包的包红包页面,我们应该采用Router路由的方式来实现。这里顺便简单讲一下Router路由与CTMediator两个组件用来接藕模块页面跳转之间的区别:Router是去中心化的方案,CTMediator是集中中心化的方案。

5.以上时序图中最后的发送红包消息存在的问题,就是我们是否可以将最后的发送红包消息在钱包模块的包红包页面直接通过xxxIMService沉淀的服务能力直接发出,而不用再走一遍CTMediator桥,进入聊天模块才能发送包红包消息。由此我们希望引出下面的目标结构

二.目标结构

WechatIMG1.jpg

1.将钱包模块与Im模块抽离出自己一些公用的Model层数据操作到一个公共的xxxDataService层。供上层所有的UI业务模块直接依赖后,直接调用,不用再通过CMeditor之间再中转后才能进行数据操作。

2.注意上层业务钱包或者IM模块的公共UI层千万不要放到DataService里面,DataService只包含从MVVM结构里面抽离出的M部分。