为了避免循环依赖和业务逻辑之间的交叉,同一层的组件是不能直接相互引用的。
这是因为:
1)除了主Module,其他任何一个业务组件都可能是处于加载或者不加载的状态,比如有2个模块A和B,如果相互依赖,且假设没有加载B,而线上模块A使用了B中功能,那么A可能会crash;
2)任何一个业务组件都是独立的,也就是说可能是由不同的部门并行开发的,不应该互相依赖。
鉴于这两个规则,同一层之间是不能直接通信(如果只考虑第1点,不考虑独立依赖,可以使用反射,但是不够美观且会影响性能)。
这个通信包括两方面:
1)界面之间的相互跳转;
2)服务之间及业务之间的相互调用。同时组件如何注册、加载、卸载,这些都是组件化架构需要解决的。
实践方案
结合上述的理论基础,在实践过程中需要解决的技术难点主要有:模块间的通信、路由表的自动维护、组件的生命周期管理、主包管理及进程间通信等。
1. 通信
说到通信,我们能想到的方案有两种,路由和事件总线。路由可以解决界面的跳转和一些dialog、toast的显隐,但是不能解决服务之间的相互调用和回调。业界提出了类似于Android中四大组件之一ServiceManager的处理方法–“接口下沉”,也就是在基础组件层新建一个ServiceManager,并提供通用服务接口IService,在需要暴露服务的地方实现该接口并手动/自动注册到ServiceManager中,这样任何需要该服务的地方都可以通过