本系统文章将详细阐述客户端应用程序的设计理念,实现方法。

本系列文章以  SailingEase WinForm Framework 为基础进行设计并实现,但其中的设计理念及方法,亦适用于任何类型的客户端应用程序的设计与开发。

目录:

http://www.cnblogs.com/sheng_chao/p/6084144.html

前言:

可能是接触计算机比较早,从96年左右386开始,到 Trubo C,以及后来的Foxpro、VB、Delphi,一直以来似乎都有一种客户端程序情节,喜欢写客户端程序。

在 .Net 出现以后,投入了许多时间在研究 .Net 编程上,在客户端领域早年基本以 WinForm 为主,近几年逐渐转向了 WPF。

除了日常工作中的项目开发,业余时间使用 WinForm 写过许多东西,比较成型的大概有两个

1)SailingEase WinForm Designer IDE (2007~2010 暂停开发)

    http://www.cnblogs.com/sheng_chao/p/4387249.html

高度实现的 IDE 开发环境,完整实现了 WinForm Designer,可通过可视化配置的方法,定义界面和业务逻辑,并使用 XML 进行描述。

这个项目一开始的设想,心很大,企图做一个让不懂编程的人,也能拖拖画画加上配置,来生成企业所需的管理软件。投入了大概两年多的业余时间,这期间应该是我自己开发能力和设计能力增涨最快的时期,开始做这个项目的时候,有太多的问题超出能力范围,只好到处找书看、找资料学习。在每天回家的路上看完了《设计模式》,平时的碎片时间看完了《代码大全2》,另外阅读了 SharpDevelop 的许多源代码,也有一部分的实现是参考了它的思路和代码。

2010年左右由于时间和精力有限,加上对于软件项目有了一些新的认识和想法,这个项目就暂停至今。其它几个小规模的 WinForm 项目,和本系列文章的主角:SailingEase WinForm Framework,均脱胎于此项目。

2)SailingEase .NET Resources Tool

http://www.cnblogs.com/sheng_chao/p/5958846.html

  一款辅助多国语言软件开发的实用工具,目的在于通过生成接口来约束不同语言资源的实现,使开发人员可以基于接口调用资源。 此外,提供方便开发人员使用的各种实用功能,如多项目并行编辑,资源导入,Excel 导入、导出等。

  这个项目源自于上面的 IDE 项目,由于做 IDE 时心太大,希望能够支持多国语言,但是慢慢发现从工程角度来说,这是一件非常麻烦,容易不可控的事情。就花了结时间,想了一个办法,用接口来约束不同的资源。

最后祭出本系列文章的主角:SailingEase WinForm Framework。

其实这是从 IDE 项目中提取出来的一个纯开发框架,它没有用户管理、权限管理之类的现成功能,而是提供纯开发角度的开发框架,概括来说提供了以下几方面的功能:

a.宿主程序(壳)与功能模块(插件)的加载、调度、通信等实现;

b.不同插件之间在完全接耦合的基础上,同步/异步调用、状态响应等机制的实现;

c.插件之间在代码层面完全没有互相引用关系,可以实现在缺少任意插件的情况下启动应用,即使他们在UI层有交集;

d.支持模块间的依存关系定义;

d.事件聚合器,用于在完全解耦的条件下,发布及订阅事件;

d.宿主程序提供了统一的主菜单及右键菜单的注册/吊销/状态控制机制;

e.宿主程序提供了统一的窗口调度/加载/销毁功能;

f.宿主程序提供了统一的日志记录、异常捕获,Web页面互操作等功能;

g.基于 GDI+ 自行实现的控件包,提供了高度的可扩展性;

h.基于zip格式的文件包管理器(基于zip的自定义文件格式,读取或写入指定的流);

i.对http、xml、磁盘io、反射、加解密等操作的增强与封装;

j.其它……

第一章节:客户端软件的架构设计概述

本章节将概述基于 SailingEase Winform Framework 框架的客户端应用程序的架构设计。

时常有朋友或者客户会问:“你这个软件是不是三层架构设计”。

实际上客户端软件的架构并不是这么划分设计的,也远远比所谓的三层架构要复杂的多,与 Web 程序在不同的页面间无状态跳转不同,客户端程序更加成一个整体,单页面 Web 应用有一些方面与之类似,不过亦有许多不同。

我们通过一个简单的设计图初步了解基于 SailingEase Winform Framework 的客户端程序架构:

 SailingEase WinForm Framework 的核心,就是模块化。

基于 SailingEase WinForm Framework 框架的应用程序由运行时动态加载的松散耦合模块组成,模块包含代表系统不同功能的可视和非可视组件,可视组件(视图)被组合在一个外壳中(主窗口)。

宿主程序提供各种基础服务,并将这些模块级组件结合在一起;模块也可以提供与应用程序的特定功能相关的其他服务。

SailingEase Winform Framework 是“复合视图”设计模式的实现,此模式支持包含子项的视图递归结构。这些子项本身也是视图,这些视图通过某种机制组合起来(在运行时动态组合而非设计时静态组合)。

模块永远不会相互直接引用,也不会直接引用宿主。它们会利用服务、事件聚合等机制在彼此之间以及宿主之间进行通信,并响应用户操作。

使用模块来组成系统有很多好处。模块可聚合来自同一应用程序中不同后端系统的数据。此外,系统可随着时间的推移更加方便地发展演变。在系统需求发生变化而需要向系统中添加新模块时,与非模块化系统相比,模块化系统面临的冲突要少很多。而且还可以对现有模块进行独立性更强的改进,从而改善可测试性。

模块可由不同的团队开发、测试和维护。在小团队开发维护模块时,也不必加载编译整个应用程序解决方案,只需建立一个包含宿主和指定模块的精简解决方案即可。

在 SailingEase Winform Framework 中,可定义不同模块间的动态依存关系,有时一个完整的业务操作需要不同模块间协作完成,而其中有些环节不是必须的,此时我们可在缺失部分模块的情况下,正常执行完整个业务流程:

主动模式:

主动模式使用建造者模式进行实现,由业务或操作的发起模块主动控制流程,由其自身判断需要响应的模块和模块是否存在。

   

被动模式:

被动模式使用事件聚合器进行实现,业务或操作的发起模块完成自身操作后,向事件聚合器发送通知,在事件聚合器中注册过的模块会收到相应的通知和数据,从而响应业务操作,响应事件聚合器的不同模块可使用多线程技术并发处理。

在被动模式中,事件的发布模块,完全不关心有哪些模块会响应事件,也不关心事件的响应结果。对于响应事件的模块来说,它们也不关心事件是由谁发布的,只需处理好相应的业务即可。

视图级别的动态依存:

举例来说,当我在用户信息模块中的用户列表画面中选择用户时,画面底部需要显示用户最近一笔订单,而这个订单信息区域(View),需要由订单模块提供,但是当订单模块不存在,或没有加载时,用户画面依然可以正常显示及使用,只是显示订单信息的位置,被隐藏了。

当用户模块和订单模块同时存在时:

  选中用户列表中的用户,则在画面下方自动显示其最近订单。

显然用户模块与订单模块不仅有视图层面的融合,还有操作响应上的融合,而这些融合与调用,在 SailingEase Winform Framework 中是完全解耦合的,两个模块之间不存在任何互相引用关系。

当订单模块不存在或没有加载时,用户模块中的画面将自动调整,UI操作不会有任何影响:

模块化只是基础,除了模块化之外,作为宿主程序,通常会提供一系列的基本功能实现。

其中特别重要的有几点:主菜单/右键菜单/工具栏的融合与调度,窗口调度器、线程调度器、服务容器、事件聚合等等,我将在后续的文章中详细阐述。

一个典型的基于 SailingEase Winform Framework 的应用程序架构

以 SailingEase WinForm Designer IDE 为例:

  

运行时效果:

在下一章节中,我将对客户端应用程序的架构作更进一步的阐述,并详细说明基于 SailingEase Winform Framework 的模块化开发如何实现。

欢迎加我QQ交流探讨,共同学习:279060597,另外我在南京,有南京的朋友吗?

基于 SailingEase WinForm Framework 开发优秀的客户端应用程序(1:概述)的更多相关文章

  1. 基于 SailingEase WinForm Framework 开发优秀的客户端应用程序(目录)

    本系统文章将详细阐述客户端应用程序的设计理念,实现方法. 本系列文章以  SailingEase WinForm Framework 为基础进行设计并实现,但其中的设计理念及方法,亦适用于任何类型的客 ...

  2. 基于 SailingEase WinForm Framework 开发客户端程序(3:实现菜单/工具栏按钮的解耦及状态控制)

    本系列文章将详细阐述客户端应用程序的设计理念,实现方法. 本系列文章以  SailingEase WinForm Framework 为基础进行设计并实现,但其中的设计理念及方法,亦适用于任何类型的客 ...

  3. 基于Asterisk的VoIP开发指南——(2)Asterisk AGI程序编写指南

    原文:基于Asterisk的VoIP开发指南--(2)Asterisk AGI程序编写指南 5. Asterisk AGI程序编写指南 5.1概述 很多时候,我们需要在拨号方案中做某些业务逻辑的判断或 ...

  4. 基于.Net core3.0 开发的斗图小程序后端+斗图小程序

    为啥要写这么一个小程序? 作为互联网的原住民. 90后程序员的我,从高中开始发QQ小表情. 到之后的熊猫头,蘑菇头. 可以说表情包陪伴我从学校到社会,从青少年到中年.. 而且因为斗图厉害,还找到一个女 ...

  5. 基于Node.js+MySQL开发的开源微信小程序B2C商城(页面高仿网易严选)

    界面高仿网易严选商城(主要是2016年wap版) 测试数据采集自网易严选商城 功能和数据库参考ecshop 服务端api基于Node.js+ThinkJS+MySQL 计划添加基于Vue.js的后台管 ...

  6. 基于MUI框架+HTML5PLUS 开发 iOS和Android 应用程序(APP)

    目录 事前准备 创建项目 利用MUI写一个简单的页面 关于文件打包 事前准备 # 软件 HBuilder X Web开发IDE 下载地址:https://www.dcloud.io/hbuilderx ...

  7. 使用 SailingEase WinForm 框架构建复合式应用程序(插件式应用程序)

    对于一些较小的项目,具备一定经验的开发人员应该能够设计和构建出便于进行维护和扩展的应用程序.但是,随着功能模块数量(以及开发维护这些部件的人员)的不断增加,对项目实施控制的难度开始呈指数级增长. Sa ...

  8. Delphi 编写ActiveForm窗体工程知识和样例(开发浏览器客户端应用程序)(有详细步骤)

    一.基础知识介绍: 1.ActiveForm的基础知识介绍: 在Delphi中,ActiveForm是封装了Delphi Form的一种ActiveX控件.ActiveForm其实是一种标准的Delp ...

  9. 基于.Net C# 通信开发-串口调试助手

    基于.Net C# 通信开发-串口调试助手 1.概述 串口调试助手,广泛应用于工控领域的数据监控.数据采集.数据分析等工作,可以帮助串口应用设计.开发.测试人员检查所开发的串口应用软硬件的数据收发状况 ...

随机推荐

  1. Matlab数值计算示例: 牛顿插值法、LU分解法、拉格朗日插值法、牛顿插值法

    本文源于一次课题作业,部分自己写的,部分借用了网上的demo 牛顿迭代法(1) x=1:0.01:2; y=x.^3-x.^2+sin(x)-1; plot(x,y,'linewidth',2);gr ...

  2. 使用技术手段限制DBA的危险操作—Oracle Database Vault

    概述 众所周知,在业务高峰期,某些针对Oracle数据库的操作具有很高的风险,比如修改表结构.修改实例参数等等,如果没有充分评估和了解这些操作所带来的影响,这些操作很可能会导致故障,轻则导致应用错误, ...

  3. SELECT INTO 和 INSERT INTO SELECT 两种表复制语句

    Insert是T-sql中常用语句,Insert INTO table(field1,field2,...) values(value1,value2,...)这种形式的在应用程序开发中必不可少.但我 ...

  4. 高频交易算法研发心得--MACD指标算法及应用

    凤鸾宝帐景非常,尽是泥金巧样妆. 曲曲远山飞翠色:翩翩舞袖映霞裳. 梨花带雨争娇艳:芍药笼烟骋媚妆. 但得妖娆能举动,取回长乐侍君王. [摘自<封神演义>纣王在女娲宫上香时题的诗] 一首定 ...

  5. 【NLP】揭秘马尔可夫模型神秘面纱系列文章(一)

    初识马尔可夫和马尔可夫链 作者:白宁超 2016年7月10日20:34:20 摘要:最早接触马尔可夫模型的定义源于吴军先生<数学之美>一书,起初觉得深奥难懂且无什么用场.直到学习自然语言处 ...

  6. 设计模式之创建类模式大PK

                                        创建类模式大PK 创建类模式包括工厂方法模式.建造者模式.抽象工厂模式.单例模式和原型模式,他们能够提供对象的创建和管理职责.其 ...

  7. 那些年【深入.NET平台和C#编程】

    一.深入.NET框架 1..NET框架具有两个组件:CLR(公共语言运行时)和FCL(框架类库),CLR是.NET框架的基础 2.框架核心类库: System.Collections.Generic: ...

  8. Autofac - 生命周期

    实例生命周期决定在同一个服务的每个请求的实例是如何共享的. 当请求一个服务的时候,Autofac会返回一个单例 (single instance作用域), 一个新的对象 (per lifetime作用 ...

  9. Android SDK 与API版本对应关系

    Android SDK版本号 与 API Level 对应关系如下表: Code name Version API level   (no code name) 1.0 API level 1   ( ...

  10. Android Studio:Failed to resolve ***

    更换电脑后,也更新了所有的SDK的tool,仍然报错:Failed to resolve  各种jar包,出现这种问题主要是因为在Android studio中默认不允许在线更新,修改方法如下: