本文是 《Qt 框架性开发实践——基础框架篇》的第一篇。
本文所讲的内容已经开源,你可以在 这里 找到源代码。
组件合成是一种比较先进的组件化开发模式。通过它,可以实现工厂模式,策略模式,单列模式,代理模式。在 Java 中,它是 Spring boot 的 @Autowird,在 C# 中,它是 MEF 的 @Export、@Import。
(C# 的 MEF 模型)
组件合成在本质上是利用语言的反射、注解机制,通过将组件的发布与引用解耦,使用容器来管理组件的创建、组件的注入,从而有效管理组件依赖性的工具。
在 C++ 中,因为缺乏语言反射特性(虽然有运行时类型信息 rtti,但是影响性能),并没有相应的组件合成框架的实现。而 Qt 通过 Q_OBJECT 元数据,提供了比较高效的基础的类型反射,可以利用它来实现组件合成框架。
在组件合成框架中,对 Qt 元数据对运用,体现在很多方面,包括类型信息,对象构造,访问属性,方法,以及 Qt 类型系统(QVariant/QMetaType)对类型注册,类型转换。所以这是一个生动学习应用 Qt 元数据的场合。
组件合成框架不但解决组件之间的依赖性,还解决组件与模块之间的耦合性。 它能够将组件所在的模块的加载延迟到最后时刻。
可以想象,当用户处理某个任务时,相关的功能模块甚至在本地不存在。此时框架会自动完成一系列动作:
- 从后端下载对应的模块(比如 DLL 文件)
- 在本地部署并下载更多的依赖模块
- 加载该模块到内存中
- 找到对应所需组件的导出点
- 创建组件实例,让它去处理用户的任务
在模块管理这部分功能的实现中,Qt Library 被用来辅助我们的工作,并且提供了一个基础的跨平台的插件化描述框架。所以我们也将对 Qt 对插件化开发做一个初步的介绍。
所以接下来有两个子章节细节介绍组件合成框架的实现,分别是: