概要
对于简单的应用,一般单一模块就能满足需求。但是对于规模比较大,功能比较多的应用,就需要考虑通过组件化拆分,来让项目架构更清晰了。那么就会带来新的问题,如何在组件之间进行数据通信呢?
整体架构流程
技术细节
1、在公共组件中按照业务组件分别创建通信接口,对其它组件暴漏可供调用的函数
export interface ICompComm {
}
export interface IModule1Comm extends ICompComm {
method1(): Promise<string>
method2(param: string): Promise<boolean>
}
export interface IModule2Comm extends ICompComm {
method3(param: number): Promise<string>
}
2、创建组件通信管理器
const COMM_MODULE1 = 'COMM_MODULE1'
const COMM_MODULE2 = 'COMM_MODULE2'
export class CommManager {
private static instance: CommManager
private static mServices: Map<string, ICompComm> = new Map()
public static getInstance(): CommManager {
if (!CommManager.instance) {
CommManager.instance = new CommManager()
}
return CommManager.instance
}
register<T extends ICompComm>(moduleName: string, service: T) {
CommManager.mServices.set(moduleName, service)
}
service(moduleName: string) {
return CommManager.mServices.get(moduleName)
}
}
3、在公共组件module的Index.ets文件中导出
export { IModule1Comm } from "./src/main/ets/comm/IModule1Comm"
export { IModule2Comm } from "./src/main/ets/comm/IModule2Comm"
export { CommManager } from "./src/main/ets/comm/CommManager"
4、在业务组件module中实现通信接口
export class Module1CommImpl implements IModule1Comm {
method1(): Promise<string> {
return Promise.resolve('')
}
method2(param: string): Promise<boolean> {
return Promise.resolve(true)
}
}
export class Module2CommImpl implements IModule2Comm {
method3(param: number)): Promise<string> {
return Promise.resolve('')
}
}
5、在业务module的index.ets文件中导出
export { Module1CommImpl } from './src/main/ets/comm/Module1CommImpl'
export { Module2CommImpl } from './src/main/ets/comm/Module2CommImpl'
6、在EntryAbility.ets文件中将通信接口实现类注册到通信组件管理器中
CommManager.getInstance().register<IModule1Comm>(COMM_MODULE1, new Module1CommImpl())
CommManager.getInstance().register<IModule2Comm>(COMM_MODULE2, new Module2CommImpl())
7、在需要进行组件间通信的地方,通过组件通信管理器获取到通信接口实现类,即可实现跨组件通信
CommManager.getInstance().service(COMM_MODULE1) as IModule1Comm).method1()
小结
以上就是组件间通信的简单实现。