• 插件式开发


    3.1. 整个.NET开发框架之间的关系

    我一直从事相关的.NET开发工作,一直在想如何整合我所有的开发经验及技术积累。在学习、进步、提升的开发工作中,开发过很多Winform共享软件、Asp.Net的WebForm项目、Asp.NET MVC项目等,发现很多东西是相互关联很紧密的,但往往自己觉得太忙太懒,要好好整理,并整理出一个体系的东西一般比较难,但我一直没有停步,梦想总会慢慢接近并实现。

    3.2. Winform开发框架的架构视图

    在这里插入图片描述

    在这里插入图片描述
    框架界面层以下的架构设计

    在这里插入图片描述
    框架数据访问层类的关系
    在这里插入图片描述
    Winform框架各层的调用关系

    3.4. 插件化框架的项目工程规划

    为了减少框架整体的复杂性以及提高重用,对插件化的应用框架的项目工程进行了划分,包括《框架基础界面模块》、《插件应用框架启动模块》、《仓库管理系统模块业务逻辑》、《仓库管理系统模块窗体界面》等几个部分。
    前面两个部分是插件化框架的核心,可以认为是不需要变化的模块,提供所有插件应用动态创建以及使用的框架支撑;后面两个是具体的主业务模块,这里以Winform开发框架中的仓库管理系统作为主业务模块,它本身也是插件应用之一,具体的项目工程结构以及说明如下所示。

    3.4.1. WCF开发框架特点

    WCF主要是基于客户端-服务端通讯模式来实现分布式应用,并通过服务公布的节点进行访问,实现数据的交换等服务。下面是其中应用的几个示意图。
    在这里插入图片描述
    在这里插入图片描述

    3.4.2. WCF开发框架架构视图

    基于Winform框架的WCF开发框架扩展,首先在界面层和BLL层插入一层WCF服务层,界面层UI不再业务层BLL打交道,而是代之以WCF服务层的客户端代理类打交道,而WCF服务层则是BLL层更进一步的包装,设计图如下所示。
    在这里插入图片描述

    3.5.1. 混合型框架总体设计思路

    Winform开发框架之混合型框架,还是秉承模块化的思路,可以把这个框架分为两大块,一块是主要业务系统模块(如备件管理系统),一块是各种辅助性模块(如通用权限、通用字典、通用附件管理、通用人员管理。。。。),这种两块组合,就是一个完美的系统了。
    整个系统的业务系统模块和辅助性模块,都是基于一个思路,通过接口调用开关,决定调用的是WCF服务层,还是Winform业务层(直接访问数据库),当然界面层的调用不管是调用WCF服务层还是Winform业务层,都是基于相同的接口,我们可以把它称为Facade层。辅助性模块则是多种常用模块的组合,它们可能是下面几种的常见模块:通用权限模块、通用字典模块、通用附件管理模块、通用人员管理模块等等。

    4. 插件化框架设计

    支持插件化应用的开发框架能给程序带来无穷的生命力,也是目前很多系统、程序追求的重要方向之一。插件化的模块,在遵循一定的接口标准的基础上,可以实现快速集成,也就是所谓的热插拔操作,可以无限对已经开发好系统进行扩展,而且不会影响已有的功能,不在需要的模块,通过修改配置移除即可。目前在Winform开发框架、WCF开发框架、混合型开发框架,均实现插件化的框架设计。
    我的Winform开发框架一直以来,来源于多年的项目积累以及客户的反馈,已经具备了众多很好的特性以及相关的模块组合,为了更好拥抱变化,提高基于Winform开发框架基础上开发新系统的效率,以及为框架融入更多好的特性,故此把我的Winform开发框架在原来的基础上进行扩展,实现基于插件化应用的框架特性。
    为了引入插件化的应用框架特点,首先需要对通用权限管理系统进行了改进,其中增加了菜单管理模块就是为了做插件化做准备的,通过权限管理系统配置好菜单的相关信息,然后在应用框架中动态加载菜单功能即可实现。这个菜单模块,是用来配置基于Winform开发框架、WCF开发框架、混合式开发框架或者Web开发框架的菜单,通过预先的配置,框架程序的动态加载解析,就能实现插件模块的热插拔功能了。

    4.3. 插件应用的动态加载

    上面说到,只要是实现基于Form的,都可以动态创建方式调用显示插件的界面出来,而如果界面实现了IFucntion的权限控制接口,那么框架就能够传递给它相应的数据,实现更加完善的控制功能。
    在关于权限系统的菜单管理图片中,可以看到了有个Winform的窗体类型的字段,里面就是用来动态构造插件的配置信息,这些信息主要是用来构造插件的窗体,并传递给它相关数据即可,下图是菜单管理里面的 “Winform窗体类型” 信息的具体内容。

    当系统完成菜单的动态创建后,菜单按钮的响应事件就是触发动态加载插件的事件。在添加菜单的时候,对它的响应事件也做了处理,具体代码如下所示。
    在这里插入图片描述

    通过动态创建菜单模块,动态加载插件应用,以及权限控制等管理,我们就能隔离框架本身和插件应用模块之间的耦合性关联,所有后续开发或者别人开发的业务模块,都可以很方便的通过权限管理系统配置数据、自动更新模块更新程序应用的方式,把一个高效、易于扩展、动态管理的系统应用弄得丰富多彩,有声有色。

    6.2. 界面层模块设计

    6.1. 界面层入口类设计

    程序入口类是Portal类,提供一个Main函数,Main函数将启动一个名为MainForm的窗体。另外Portal类有一个静态类GlobalControl,这个类包含一些常用到窗体的模块功能,同时也会放置一些常用到的属性放到这里,这些功能及属性,可以给系统整个生命周期内任何窗体使用。GlobalControl类还含有MainForm类的实例,在Main函数启动的时候构造传递过来。
    整个Winform框架只包含一个MainForm窗体,这个是系统的主界面,而主界面则可以包含无数个数据查询显示窗体对象,如FrmItemDetail、FrmPurchase、FrmTakeOut等窗体,这些窗体主要通过多文档界面来展示,方便管理而且美观实用。另外每个对应的业务窗体,如FrmItemDetail窗体,它可能还会有一些数据编辑、新建数据等窗体,这些窗体类之间的关系如下图所示。
    在这里插入图片描述
    程序入口类关系

    6.2. 界面层模块设计

    采用窗体继承,极大程度上统一了界面,并且对常用的界面操作,提供了良好的封装,如基础数据编辑、新增窗体积累封装了对回车、方向键、数据刷新、异常处理、数据检查、数据保存、数据更新等接口,为窗体的数据处理提供了很大的方便性。
    而数据查询显示窗体则考虑到多文档展示的需要,一般继承合适的基类,封装一些常用到的界面布局,以便实现相应的界面处理效果。
    1)基于传统界面的窗体继承

    采用窗体继承,极大程度上统一了界面,并且对常用的界面操作,提供了良好的封装,

    • 如基础数据编辑、新增窗体积累封装了对回车、方向键、数据刷新、异常处理、数据检查、数据保存、数据更新等接口,为窗体的数据处理提供了很大的方便性。
    • 而数据查询显示窗体则考虑到多文档展示的需要,一般继承合适的基类,封装一些常用到的界面布局,以便实现相应的界面处理效果。
      在这里插入图片描述

    6.3. 业务层模块设计

    6.3.1. 业务层继承关系

    具体的备件管理业务类ItemDetail继承自BaseBLL业务基类,该基类封装了对数据对象的常用操作,通过给基类传递一个对应的业务实体类,从而实现具体业务逻辑的处理。

    在这里插入图片描述

    业务规则基类BaseBLL,它是采用了泛型和和反射的方式来实现,另外通过不同的数据库配置信息,从不同的程序集中构建相应的数据库访问,实现多种数据库访问的支持及切换。虽然在实际项目开始后,切换数据库较少,但对于Winform开发框架,能开发不同的数据库应用,这个也是很重要,我们只需要提供相应数据库访问层就可以了。

    在这里插入图片描述
    整个框架是面向对象的数据处理方式,所有的业务类通过类似BLLFactory.Instance出来的对象都是强类型的,具有所有ItemDetail业务类的一切智能提示,非常方便操作,而不是一个通用的数据库操作类。使用业务实体类来传递数据有很多方便之处,不需要记住各种字段名称,而且在业务操作中也不容易出错,当然整体框架也提供了基于DataTable等数据信息的返回,以适应一些特殊的情况。
    6.3.2. 数据访问层继承关系
    数据访问层的对象,除了继承自基类BaseDAL外,还实现自己的特殊接口(如果需要),这样可以很好对数据访问对象的基本操作功能和扩展操作功能实现分离,并且有很好的扩展性。
    在这里插入图片描述
    不过由于基类采用了泛型的封装,在构建对象的时候,属于强类型的对象,智能提示也比较好。数据访问基类BaseDAL的代码设计所示。

    /// 
        /// 数据访问层的基类
        /// 
        public abstract class BaseDAL<T> : IBaseDAL<T> where T : BaseEntity, new()
        { 
        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    BaseDAL基类封装了各种数据库操作方法(几乎能满足各种要求的方法集合),因此具体的数据库访问对象,基本上不需要做数据访问的代码编写了,如果需要额外的数据访问接口,也只需要做一些扩展就可以了。

    6.3.3. 操作对象创建逻辑
    对象构造及接口调用的序列图如下图所示。

    在这里插入图片描述

  • 相关阅读:
    数位DP day45
    Hive (十) --------- 企业级调优
    STM32单片机学习3--STM32控制键盘
    GZ035 5G组网与运维赛题第2套
    线上bug-接口速度慢
    搭建私人图床结合内网穿透实现公网访问,让您的摄影作品连接世界
    Android中依赖版本统一管理
    Electron自动更新
    java通过zookeeper 高可用方式连接hiveserver2
    【MYSQ精炼系列篇】【MySQL使用】
  • 原文地址:https://blog.csdn.net/kalvin_y_liu/article/details/127575426