带你读《2022技术人的百宝黑皮书》——跨桌面端之组件化实践(2)https://developer.aliyun.com/article/1340325?groupCode=taobaotech
跨端组件化实践
组件化方案,包含框架能力和组件约束两部分。
框架设计是否科学,组件约束下是否易开发、易使用、易维护,是组件化方案要考量的核心因素。
- 组件框架,提供了组件运行的基础能力,主要包括: 组件发现机制
组件生命管理组件间通信
其他公共基础能力
- 组件约束,定义了组件开发时需要遵循的标准,其主要目的包括了:
支持组件在prg框架上运行,例如组件都继承自prg::com对象,并需要完成I接口注册。
支持组件跨平台,例如ui组件需要遵守mvp分层,在替换ui渲染层时,能确保做到业务逻辑多端一致。为了便于团队协作,例如文件结构、代码分层、命名规则等,使用相同范式去开发和使用组件。
……
组件约束是根据组件的类型、具体使用场景等因素,分别进行定义的,不同组件的标准并不完全相同。例如ui组件和非ui组件的标准就有很大的不同。
后面介绍下prg框架,及我们在各种场景下定义的组件约束条件。
prg框架
组件发现机制 prg框架利用模板技术,通过打包时扫描dll生成配置、加载dll时静态注册组件,实现了一套组件发现机制。
prg框架的组件发现机制,依赖于id注册,组件对外只暴露类id和I接口,实现了组件间完全去依赖。 先来看一下示意代码:
// 定义一个prg::com组件class IxxxService; DEFINE_IID(IxxxService, "{4E6A382D-1FDA-49C6-8521-E284DA7B71CC}") DEFINE_CLSID(xxxService, "{D1A52645-7587-4885-ABFD-323BA62905F5}") // 创建这个prg::com组件scoped_refptr<IxxxService> spInterface; prg::PrgCOMCreateInstance(c_uuidof(xxxService), spInterface); ////////////////////////////////////////////////////////////////////////// // implement(不对外暴露) class CxxxService : public prg::CPrgCOMRootObject<prg::CCOMThreadSafeRefPolicy> , public IxxxService { public: DECLARE_PRGCOM_RUNTIME(CxxxService, c_uuidof(xxxService), "xxxService", "xxxService", prg::GetDepend- sCLSID()) BEGIN_PRGCOM_MAP(CxxxService) PRGCOM_INTERFACE_ENTRY(IxxxService) END_PRGCOM_MAP() }; IMPLEMENT_PRGCOM_RUNTIME(CxxxService);
它的实现原理是:
- 打包时,扫描目录下所有dll,遍历调用 GetPrgCOMFactory接口,生成组件配置xml。
- 创建对象时,通过xml配置,找到并load对应的dll。
- 加载dll时,会创建prg::CPrgCOMObjectRuntime静态变量g_prgRuntime,并在构造时向PrgCOMFac tory注册clsid到this的映射关系。
- 根据clsid,在PrgCOMFactory中找到对应的g_prgRuntime变量,调用CreateInstance静态方法,由于g_pr gRuntime变量是带了T类型信息的,就可以创建出对应的T对象。
这里利用了c++模版技术和静态注册技术,巧妙地完成组件解耦,解决了依赖问题和跨模块调用问题。
带你读《2022技术人的百宝黑皮书》——跨桌面端之组件化实践(4)https://developer.aliyun.com/article/1340323?groupCode=taobaotech