带你读《2022技术人的百宝黑皮书》——跨桌面端之组件化实践(3)https://developer.aliyun.com/article/1340324?groupCode=taobaotech
组件生命管理
prg组件支持无感跨模块创建、使用、释放对象,真正做到了一次开发,到处使用,开箱即用。
prg组件使用scoped_refptr引用计数管理内存,使用者不需要自行管理内存。
prg框架支持跨dll/dylib创建、使用、释放对象,对使用者来说dll/dylib是完全无感的,指定要创建的对象类型,接口类型,实例名称,就可以直接开始使用这个接口了,非常丝滑。
class IxxxService : public prg::IPrgCOMRefCounted { public: base::event<void()> onDataChanged; public: virtual bool GetData(const std::string& data) = 0; } // 创建prg::com组件新实例scoped_refptr<IxxxService> spInterface; prg::PrgCOMCreateInstance(c_uuidof(xxxService), spInterface); // 获取prg::com组件(没有则create,prg框架内部会保存一份引用) scoped_refptr<IxxxService> spInterface; prg::PrgCOMGetInstance(c_uuidof(xxxService), instanceName, spInterface); // 判断prg::com组件实例是否存在prg::PrgCOMHasInstance(c_uuidof(xxxService), instanceName, bhave); // 删除prg::com组件实例prg::PrgCOMDropInstance(c_uuidof(xxxService), instanceName);
我们一般会将组件获取封装成像下面这样的接口,对于使用者来说,调接口就像调用自己的代码一样方便。
/// 组件头文件 inline scoped_refptr<IxxxService> GetIxxxService() { scoped_refptr<IxxxService> spInterface; prg::PrgCOMGetInstance(c_uuidof(UIAppGuideWidget), "", spInterface); return spInterface; } ///////////////////////////////////////////////////////////////////////// // 其他组件直接调用接口std::string data; GetIxxxService()->GetData(data);
组件间通信 prg组件的接口调用和事件订阅。
接口调用
prg组件接口调用与com组件类似,区别在于prg::com做了更好用的封装,可以直接get到I接口对象进行使用。
(当然还是支持使用QueryInterface,可以通过QueryInterface获得不同类型的I接口)
class IxxxService : public prg::IPrgCOMRefCounted { public: base::event<void()> onDataChanged; public: virtual bool GetData(const std::string& data) = 0; } // 获取组件 scoped_refptr<IxxxService> spInterface; prg::PrgCOMGetInstance(c_uuidof(xxxService), instanceName, spInterface); // 调用组件方法 spInterface->GetData(callback);
带你读《2022技术人的百宝黑皮书》——跨桌面端之组件化实践(5)https://developer.aliyun.com/article/1340322?groupCode=taobaotech