搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
我家自动化
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
iperf2工具的使用_iperf2 jitter
2
frp、FTP服务
3
zynq PL部分无需打包,与PS AXI通信(linux系统)_ps axi转网络通信
4
PowerInfer-2:智能手机上的大语言模型快速推理_powerinfer-2: fast large language model inference
5
【最新案例】网络智能类SCI&EI,极速审稿,录用到检索仅2个月零9天_journal of network intelligence
6
两个浏览器窗口间通信_gethub跨浏览器通讯项目
7
AIGC技术赋能教育数字化转型的机遇与挑战
8
AI大模型盘点:国内10强及体验网址_国内除了文心一言还有什么
9
Git | git remote update 和 git fetch 的区别
10
Qt中操作SQLite数据库_qt sqlite
当前位置:
article
> 正文
插件式应用程序的智慧_应用插件引擎是什么
作者:我家自动化 | 2024-07-21 13:53:10
赞
踩
应用插件引擎是什么
插件式应用程序的智慧
不知你经手过的应用程序项目会不会存在这样的情况:1.开发前说好功能分配到个人,可到头来别人写的却只是功能类库,你还是需要在主程序中调用它们;2.主程序存在大量的静态成员,同时对应的类库也或多或少的存在一些和主程序相关的静态成员;3.由于主程序功能太多,导致代码页中事件过多,代码冗长;4.客户偶尔要求添加或删除某个功能,你至少得找到主程序的源码,同时在界面中添加或删除某个功能,最后重新编译系统,实在太麻烦;5.同一个产品不同用户对于功能的要求不尽相同,你还得制作多个不同版本,即便是通过配置文件来实现功能的隐藏,但却也无法改变对象已被创建的事实。
你是否希望有一个这样的项目,可以将应用程序的各个功能的开发分配到个人,每个功能都对应一个类,开发完成后,他会自动集成到主界面中去;同时,主程序代码简约,整个应用程序没有或极少存在静态成员;添加一个新功能乃至几个大型的工具条,都无需再次打开旧的源码了重新编译;如果想注销界面里的指定的功能,只需要在配置文件中稍加记录,便可使整个系统在重新启动后,不在创建该对象的实例,实现真正的“瘦身”。
你是否会因为VS编译器在你安装过SVN后,主菜单上多了一个“VisualSVN”菜单项而感到好奇;你是否会因为ArcGIS Desktop支持用户自己开发,拓展系统功能而感到高级;你是否会因为Photoshop在加载界面时,会不断出现扫描系统文件(如:DLL文件)而感到帅气;你是否会因为ArcMap可以通过加载对话框,选择有效地文件(如:DLL文件)后,瞬间使界面上便出现一个或多个工具条而感到神奇。
其实,这些都是插件结构可以帮你解决和做到的。 要知道,所有大型的桌面应用程序基本使用的都是插件的结构,如:Office些列软件、ArcGIS Desktop系列软件、AutoCAD等等。下面我们来简单看一下插件结构。
一个插件应用程序主要五个部分组成:宿主对象、插件引擎、通信契约、各个插件对象、通信钩子。
宿主对象:顾名思义就是各个插件对象展现后所寄宿的实体对象,它就是用户看到的最终的界面部分,也就是我们常规开发里称的主程序。其实,一个插件应用程序的宿主对象不过只是一个简单地框架罢了,里面只需调用“插件引擎”并传入“通信钩子”就可以的,一共加起来不过百十行代码而已。(当然你也可以加入一些配置文件之类的东西,这些就另当别论。)这样的主程序就不会出现代码冗长的问题了。
插件引擎:就是将文件(即:编译后的系统文件,如:DLL文件)中的各个插件对象,通过反射机制将它们逐一读取,并依据“通信契约”将其分门别类的放入插件集合字典,再将它们转化成对应的实体对象,同时传入“通信钩子”,最终将其集成到宿主对象中去。插件引擎是整个插件系统的核心,它的实质就是如何将插件变成界面的操作对象。由此,只要有符合要求的编译文件,通过插件引擎就可以实现系统的无限拓展。当然,你也可以将不需要的插件对象,在系统读取插件时就将其屏蔽,实现真正的“瘦身”。
通信契约:是一个定义了不同插件对象接口和继承这些接口类的集合,用于标识和区分各个不同种类的插件对象,以及定义某种插件对象的基本信息。因此,我们只要继承对应的插件接口就可以不断添加新功能,而无需重新编译系统。
各个插件对象:是继承某一“通信契约”接口的插件对象,它是一个界面对象的具体实现者。这样我们便可以实现,一个界面对象对应一个类。同时,也可以正真的实现一个成员开发一个或多个功能,而无需再花时间将各功能集成到主界面中去(因为有插件引擎帮你自动处理)。当某一功能出现异常,我们便可直接到对应的类中去寻找原因,无需再在一堆混乱的源码中苦苦寻觅。
通信钩子:可以是一个或多个类或接口,它主要用于数据的通信,将宿主对象中要处理的数据或要操作的对象,关联到各个插件对象中去。有了这样的钩子作为整个系统通信的使者,你还需要定义如此之多的静态成员吗!
总的来看,一个插件式应用程序启动后,系统会检索和读取指定目录下存放的插件文件,通过反射机制查询里面所包含的插件对象,将符合条件的插件对象反射成实例,分门别类的放入插件集合字典中,再将它们转化成对应的实体对象同时传入“通信钩子”,最终集成到宿主对象中去。
由此看来,SVN只不过是在知道VS“通信契约”和“通信钩子”的前提下,对VS编译器进行了简单地拓展;ArcGIS Desktop支持用户自己开发拓展系统功能,只是因为它公布了桌面产品的“通信钩子”和“通信契约”;Photoshop在加载时,不断出现扫描系统文件,原来是在读取和解析插件文件; ArcMap软件通过加载效地文件(如:DLL文件)产生新的工具条,不过是“插件引擎”读取和创建了插件实体对象罢了。
虽然,桌面应用程序已经渐渐淡出我们的视线,市场的需求也越来越少,但是插件开发的思想依然可以给我们很多的启示,从中也可以能学到很多的知识,这些都会使我们受用终生。
相关链接:
基于 LiuZhenHong.Controls 2.X 控件开发的插件应用程序Demo:
http://download.csdn.net/detail/ll_zz_hh_/6022221
完整的GISShare.Controls.WinForm控件及插件源码(最新):
GitHub - gisshare2015/GISShare.Controls.WinForm: 基于.NET开发的WinForm自定义控件
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/我家自动化/article/detail/861076
推荐阅读
article
使用
STM32
实现
智能家居
系统...
系统概述 本系统使用
STM32
单片机作为控制核心,通过WiFi模块与互联网连接,实现远程控制功能。系统包括三个主要模块:...
赞
踩
article
在
c
onda
环境下安装
P
y
Tor
c
h
+
P
y
Tor
c
h
Geometri
c
(P
y
g)_
c
onda
in...
关于
c
uda和
c
udnn不需要按网上教程去官网下载,也不需要手动在
c
onda
环境内安装。直接按
P
y
Tor
c
h
官网命令安装...
赞
踩
article
零
基础
学
Python
网络
爬虫
案例
实战
全
流程
详解(入门与提高篇)_
爬虫
证券日报
网...
笔者编写的《
Python
金融大数据挖掘与分析全
流程
详解》于2019年出版面市后,陆续有不少读者表示对该书的
爬虫
部分非常感...
赞
踩
article
【
Git
】概念 1 ---
工作
区
、
暂存
区
、版本
库
、远程
仓
库
_
仓
库
暂存
区
是什么意思...
本文转自https://www.cnblogs.com/qdhxhz/p/9757390.html一、概念1、四个
工作
区
...
赞
踩
article
基于
springboot
的
网上
购物
商城
系统研发_
springboot
商城
...
2.1毕业设计是最能体现出我们所学知识的应用情况,是对我们大学期间所学知识的应用巩固和提高的时刻。通过这次的毕业设计让我...
赞
踩
article
C#
处理
json
数据_
return
json
convert.
serializeobject
(resu...
参考文章(如有侵权,请联系我删除,谢谢):https://www.cnblogs.com/JiYF/p/8628942....
赞
踩
article
基于
python
的
百度
资讯
爬虫
的
设计与实现...
最后,程序将提取到
的
数据打印输出。扫描指定
的
环境变量 _proxy大小写不敏感
的
方法,对所有
的
操作系统,当它不能找到它,...
赞
踩
article
代码
拉取_
SourceTree
回滚
代码
...
有时候,我们需要对以前的
代码
进行回滚。例如,最近我需要在之前的某个提交记录的基础上修改某个东西,我之前又没有拉新的分支,...
赞
踩
article
鸿蒙
开发
-
web
-
页面
_
鸿蒙
api9
开发
,
使用
web
组件
引入在线网页
,
需要调用在线
页面
的js方法
,
方...
上文学习了
鸿蒙
开发
web
相关的知识,了解
web
组件
的基本概念,以及加载
页面
的三种方式,同时也学习了
web
组件
的的基本属性...
赞
踩
article
Ubuntu
on
Windows10
跨平台
开发
环境搭建权威指南...
关注「实验楼」,每天分享一个项目教程 本文今天会详细讲解下怎样在
Windows10
下安装
Ubuntu
、搭建 Lin...
赞
踩
article
图
神经网络
框架-
PyTorch
Geometric
(
PyG
)的使用及踩坑_
geometric
引入m...
PyG
(
PyTorch
Geometric
)是一个基于
PyTorch
的图
神经网络
框架,建议先了解
PyTorch
的使用再学...
赞
踩
article
【EI
会议
】
2024
年
光电
信息
、
光学
工程与机器视觉国际学术
会议
(
OIOEMV
2024
)_
光电
信息
会...
2024
年
光电
信息
、
光学
工程与机器视觉国际学术
会议
(
OIOEMV
2024
)将汇集全球
光电
信息
、
光学
工程与机器视觉领域的...
赞
踩
article
2024.2
DataWhale
多
智能
体
实战 第三章 单
智能
体
开发
_
多
智能
体
demo
...
下面将演示如何使用MetaGPT实现一个单动作
智能
体
,该
智能
体
可以根据用户的需求写出一个python函数,比如:"wri...
赞
踩
article
一页
纸
项目
管理
(
OPPM
)——适合小
项目
管理
项目
阶段规划和报告用...
项目
管理
是一件非常复杂的事情,如何把这样一件复杂的工作简化,把握关键要素,快速与团队沟通,高效地与上级汇报
项目
状况,是项...
赞
踩
article
QTabWidet
设置
不同
Position
,
tabBar
文字均水平显示_
tabwidget
.setl...
1、
设置
不同
Position
,
tabBar
文字均水平显示QTabWidget
设置
在
设置
Position
为East或者We...
赞
踩
article
为什么
我
选择
离开
工作
9年的
腾讯
?...
点击蓝色“架构文摘”关注
我
哟加个“星标”,每天上午 09:25,干货推送!下周,就是
我
加入
腾讯
9 周年,
我
选择在同一天...
赞
踩
article
Spring
Boot
集成
Activity7
实现
简单的
审批
流_
springboot
整合
审批
...
详细介绍工作中集成
Activity7
实现
简单的
审批
流的过程_
springboot
整合
审批
springboot
整合
审批
...
赞
踩
article
yolo
v5
/
yolo
v3
训练
自己
的
数据
集(超详细,细的有点烦)_
yolo
数据
集...
YOLO系列是非常优秀的物体检测框架,目前总共有V1-V5五个版本。本博客的目的在于教大家如何使用YOLOv5
训练
自己
的...
赞
踩
article
雷迪
9000
使用
说明_到底谁更省电?
麒麟
9000
深度
对比
骁龙
865
+...
在芯片制程工艺不段突破物理极限的今天,手机芯片的性能每年都在以10%以上的速度快速提升,如今跑分都突破了70万大关,性能...
赞
踩
article
ASP
.NET
Core
中
JsonResult
和
ObjectResult
的用法_objectresu...
在Asp.net
Core
中,
JsonResult
和
ObjectResult
都可以返回Json格式的响应结果,他们之间用...
赞
踩
相关标签
stm32
智能家居
单片机
pytorch
深度学习
python
爬虫
开发语言
spring boot
后端
java
C# json
百度
代码 拉取
harmonyos
华为
神经网络
自然语言处理
人工智能
信号处理
ai
笔记
软件工程
团队开发