带你读《2022技术人的百宝黑皮书》——跨桌面端之组件化实践(3)

简介: 带你读《2022技术人的百宝黑皮书》——跨桌面端之组件化实践(3)

带你读《2022技术人的百宝黑皮书》——跨桌面端之组件化实践(2)https://developer.aliyun.com/article/1340325?groupCode=taobaotech


跨端组件化实践

 

组件化方案,包含框架能力和组件约束两部分。

框架设计是否科学,组件约束下是否易开发、易使用、易维护,是组件化方案要考量的核心因素。

 

 

  1. 组件框架,提供了组件运行的基础能力,主要包括: 组件发现机制

组件生命管理组件间通信

其他公共基础能力

  1. 组件约束,定义了组件开发时需要遵循的标准,其主要目的包括了:

支持组件在prg框架上运行,例如组件都继承自prg::com对象,并需要完成I接口注册。

支持组件跨平台,例如ui组件需要遵守mvp分层,在替换ui渲染层时,能确保做到业务逻辑多端一致。为了便于团队协作,例如文件结构、代码分层、命名规则等,使用相同范式去开发和使用组件。

……

 

 

组件约束是根据组件的类型、具体使用场景等因素,分别进行定义的,不同组件的标准并不完全相同。例如ui组件和非ui组件的标准就有很大的不同。

 

后面介绍下prg框架,及我们在各种场景下定义的组件约束条件。

 

prg框架

 

image.png组件发现机制                                                                            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);

 

 

 

它的实现原理是:

  1. 打包时,扫描目录下所有dll,遍历调用 GetPrgCOMFactory接口,生成组件配置xml
  2. 创建对象时,通过xml配置,找到并load对应的dll。
  3. 加载dll时,会创建prg::CPrgCOMObjectRuntime静态变量g_prgRuntime,并在构造时向PrgCOMFac tory注册clsid到this的映射关系
  4. 根据clsid,在PrgCOMFactory中找到对应的g_prgRuntime变量,调用CreateInstance静态方法,由于g_pr gRuntime变量是带了T类型信息的,就可以创建出对应的T对象。

 

这里利用了c++模版技术和静态注册技术,巧妙地完成组件解耦,解决了依赖问题和跨模块调用问题。

 

带你读《2022技术人的百宝黑皮书》——跨桌面端之组件化实践(4)https://developer.aliyun.com/article/1340323?groupCode=taobaotech

相关文章
|
Web App开发 移动开发 前端开发
带你读《2022技术人的百宝黑皮书》——跨桌面端Web容器演进(1)
带你读《2022技术人的百宝黑皮书》——跨桌面端Web容器演进(1)
111 1
带你读《2022技术人的百宝黑皮书》——跨桌面端之组件化实践(8)
带你读《2022技术人的百宝黑皮书》——跨桌面端之组件化实践(8)
|
缓存 小程序 前端开发
带你读《2022技术人的百宝黑皮书》——跨桌面端Web容器演进(5)
带你读《2022技术人的百宝黑皮书》——跨桌面端Web容器演进(5)
108 0
|
存储 iOS开发 MacOS
带你读《2022技术人的百宝黑皮书》——跨桌面端Web容器演进(2)
带你读《2022技术人的百宝黑皮书》——跨桌面端Web容器演进(2)
132 0
|
JavaScript Android开发 C++
带你读《2022技术人的百宝黑皮书》——跨桌面端Web容器演进(3)
带你读《2022技术人的百宝黑皮书》——跨桌面端Web容器演进(3)
|
开发工具 C++ 容器
带你读《2022技术人的百宝黑皮书》——跨全端SDK技术演进(1)
带你读《2022技术人的百宝黑皮书》——跨全端SDK技术演进(1)
119 0
|
中间件 开发工具 Android开发
带你读《2022技术人的百宝黑皮书》——跨全端SDK技术演进(2)
带你读《2022技术人的百宝黑皮书》——跨全端SDK技术演进(2)
113 0
|
IDE Java 开发工具
带你读《2022技术人的百宝黑皮书》——跨全端SDK技术演进(6)
带你读《2022技术人的百宝黑皮书》——跨全端SDK技术演进(6)
|
开发工具 Android开发 开发者
带你读《2022技术人的百宝黑皮书》——跨全端SDK技术演进(5)
带你读《2022技术人的百宝黑皮书》——跨全端SDK技术演进(5)
117 0
|
开发框架 开发工具 Windows
带你读《2022技术人的百宝黑皮书》——跨桌面端之组件化实践(1)
带你读《2022技术人的百宝黑皮书》——跨桌面端之组件化实践(1)