热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

我的插件式桌面软件框架类库(一)XFrmWork简介

一.综述工欲善其事,必先利其器。器可以来自他人,也可以自造。我进实验室的第一个项目便是开发一款行业软件,相比于真正的商业软件,它的系统本身真的很简单。但真是应了那句话,“大学不适合做软件”,

一. 综述

  工欲善其事,必先利其器。器可以来自他人,也可以自造。我进实验室的第一个项目便是开发一款行业软件,相比于真正的商业软件,它的系统本身真的很简单。但真是应了那句话,“大学不适合做软件”,整个系统交互复杂,设计冗余,维护起来很困难。在项目结题之后,整个系统便存在硬盘里再也没有人问津。虽然我只开发了其中一个模块,但依旧心痛。

  痛定思痛,我希望能有一个成熟简单的桌面框架,解决多数桌面开发遇到的问题:界面显示,数据库,插件式架构,调试输出,网络连接等。同时尽可能减少多个开发者之间的耦合度,为此我了解了SharpDevelop等开源软件,但它的设计对我而言依旧太复杂了。更强调的是代码复用,为一个项目开发的模块,为何不能为另外一个项目服务,同时尽可能减小集成的工作量?于是,从研一上学期开始,我便投入了第一个插件式桌面框架类库的开发: XFrmWork 。

  如今,它作为基础类库为三个项目软件提供服务,分别是XMOVE,实验室的数据挖掘软件和LTE软基站仿真演示程序。

  下面是以XFrmWork为基础实现的软件之一——XMOVE Studio:

  

  下面,本文集将简要介绍其功能和实现。

二. 基本结构

  XFrmWork基于WPF界面技术和.NET Framework 4.0。 插件式结构设计。主框架包含五个类库,其名称和功能如下图所示:

  绝大多数的UI控件采用了MVVM结构,利用数据绑定实现界面与逻辑分离。所有使用外部开源控件的都对其做了接口抽象,因此可以在任何时候使用其他同功能控件,上层代码不需做更改。

  同时,框架正在增加其他类库,其中包括专门实现多媒体功能的XFrmWork.MultiMedia库,由于其并未开发完成,因此此处没有介绍。

三. 系统特性介绍——基本功能

  1. 插件式管理容器

  为了尽可能的减少组件集成的工作量,系统采用了类似插件树的设计方案。所有的功能都通过可组装的插件接入系统。使用非常方便,只需在对应的类上添加attribute标识。

  插件的结构类似于键值对:键(Key)是插件要求实现的接口,值是对应的插件名称字典。管理器可以随时插入,删除(有安全隐患)插件字典中的数据。至于插件系统的具体实现,可参考我的系列博文。

  以下是插件系统搜索相关目录下的插件后形成的插件列表:

   您可以详细了解到当前系统所有的插件字典的键(上图的“插件接口列表”)和 值,同时给出插件的加载策略和详细信息。

  2. 可自动组装的算法组装器

  在科研计算领域,通常面临的问题是复杂多样的,因此很难通过图形界面完成配置和操作。但我借鉴了Labview的理念,任何复杂算法总可以分解为不同的模块的组装。因此,我们只需设计不同的算法模块,并定义它们的接口。用户可以根据问题的不同,对模块实现组装和配置,解决实际中的复杂问题。

  模块可以理解是拥有输入输出接口的“盒子”,一个盒子可能包含多个输入或多个输出。只有输入全部满足,才能执行,但可以不输出给其他盒子。多个盒子可以以复杂的形式组装为算法网络,实现自动化处理。同时,不同的算法之间可能存在耦合和分层。算法管理系统将对模块实现分层和分组。不同组之间模块无交互,因此可以并行执行。同组算法由第一层依次执行到下层,类似流水线。我在这篇博文中,详细介绍了它的实现:

  如上图,数据统计输出模块和时间序列分析是分在一组,但不同层的模块,处理时先执行数据统计输出,并将其结果传输到时间序列分析。 另外一组, 计算方法A和B都是C的输入,运行时先完成A,B的处理(并行完成),当两个任务都完成时,传递给计算方法C,继续执行。  值得注意的是,不同组之间是并行的,他们的执行互不干扰。

  3. 调试输出

  良好的调试可以方便开发者和使用者,通常我们采用VS自带的调试工具,但在软件Release之后,需要有界面输出工具。

  调试输出组件我采用了log4.net组件,网上相关资料较多,此处不赘述。以下是实现效果:

  值得一提的是,该组件可以按照信息等级的不同(Debug,Info或是Error等)显示不同的颜色,以提示用户。这些数据可以方便的保存为文件,或传输给指定的电子邮箱地址。

  4. 数据库和数据服务

   数据作为软件系统的核心,作者开发了多项数据相关模块

  •     数据库抽象层(抽象数据库具体实现),使得未来可升级其他数据库而不更改上层代码
  • 数据库管理器:可方便连接,显示,导入,存储数据库数据:
  • 数据查看器:为方便数据开发,采用数据绑定和反射技术实现数据查看。其界面会随数据类型的不同而动态改变。

      

  • 动态查询:作者学习整合了一些开源组件的设计思想,用户可在通过LINQ, 在数据集中实现自定义查找。例如,查找数据集”基本信息1“中性别为女的数据集可采用如下写法:
from data in 基本数据1
where 性别 is f
select data

  点击查找,系统就会自动解析LINQ语句,并执行查找功能。

四. 系统特性介绍——图形与可视化

  1. 基于AvalonDock的类VS界面布局系统

  复杂软件一般需要可自定义的布局系统,本框架使用了AvalonDock开源软件的WPF版本,可以随时修改布局,拖放任意组件,支持不同分辨率,甚至显示在不同的显示器上。同时,系统可以保存或加载已经保存的布局。

  2.  可自动换肤的界面系统

  WPF的动态资源使得原本在winform时代几乎不可能实现的“动态换肤”成为可能。您可以选择软件右上角的主题管理选单,选择不同风格的界面效果。

  3. 关系型数据可视化控件

  在数据挖掘子项目中,需要动态显示和分析数据间的联系,因此我设计了专门显示关系数据的可视化控件,具备如下功能:

  •   可动态定义关系点样式和线样式,可通过xaml或C#代码定义,系统在运行时反射获得。
  • 可实现2D,3D效果
  • 用户可搜索,定位,放大和拖拽不同点和画布,并对画布进行放缩
  • 布点算法支持随机撒点,FDA(力导引)等多种算法,并在不断扩充中
  • 布点可实现动态显示,呈现网络形成过程。

  下图展示了微博用户网络(采用星状布点)

  

   4. 统计型图表控件

  为了方便显示统计数据,我使用了开源图表控件WPFWisifire。同时,采用了接口隔离方式简化了控件实现,使用时仅需要传递一组KeyValuePair序列,即可实现绘图。支持柱状,线状,雷达等类型图表。下图展示了中国登记在案的科研项目每年数量的变化图:

  5. 地理控件

  地理图形可以更直观的帮助用户分析数据,因此我使用了开源控件GMap.Net实现地图功能。同样使用接口隔离具体实现,可自动定位,绘制路径,增删修改地标等。

 五. 其他特性和功能

  1. 反射加速特性

  为实现更好的扩展性,作者在程序中大量使用反射,为提速,作者使用了一些技术提升反射性能,从而优化了用户体验。

  2. 自组装菜单

  系统上方的菜单也是根据插件接口自动组装完成的,如下图所示:

  

  3. 网络通信库

  作者通过重新封装socket等基础功能,提供了方便上层调用的通信功能。

  4. 序列化,.NET Remoting等

  作者使用了多项技术,使得上层不需要考虑数据存储的序列化细节,只需调用一个函数即可完成。而对于跨进程调用时,系统使用了.NET Remoting等技术。在此不一一赘述。

 

六. 总结

  XFrmWork是我在.NET开发中实现的第一个完整类库集。坦白的说,博客园里的诸位大神,早已使用或已经开发了比XFrmWork强得多的架构系统。但是它却是适合我自身的系统。在不同项目的需求驱动下,我的团队推动了它的不断升级。这也让我学到了更多的知识。我会为其插件搜索速度绞尽脑汁,也会吸收各类开源软件的架构精华。其实,有这样的平台,对我来说已经足够。如果它能被我带入到工作中,那一定是最幸福的事情。

  开放全部的源代码没有价值,我会在“插件系统加载”和“自组装模块"的基础上继续与大家分享它的开发经验。欢迎大家关注。


推荐阅读
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 工作经验谈之-让百度地图API调用数据库内容 及详解
    这段时间,所在项目中要用到的一个模块,就是让数据库中的内容在百度地图上展现出来,如经纬度。主要实现以下几点功能:1.读取数据库中的经纬度值在百度上标注出来。2.点击标注弹出对应信息。3 ... [详细]
  • 最近学习了关于使用最为流行的jquery发送请求,在实践中以最为简单的聊天室作为测验的辅助工具,对相关网页开发有一个初步的认识,希望大家能够一起学习进步。首先介绍一下 ... [详细]
  • 一份来自清华的数据分析笔记,请查收!
    之前发过很多数据分析的文章,收到不少好评,但也有一些困惑:入门数据分析该学哪些知识点?该看哪些书?是从Pyth ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Shodan简单用法Shodan简介Shodan是互联网上最可怕的搜索引擎,与谷歌不同的是,Shodan不是在网上搜索网址,而是直接进入互联网的背后通道。Shodan可以说是一款“ ... [详细]
author-avatar
国王的驴耳朵要吐槽
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有