by 魏琼东
2013.12.18 20:23
一、前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台。用于帮助中小型软件企业建立一条适合市场快速变化的开发团队,以达到节省开发成本、缩短开发时间,快速适应市场变化的目的。 AgileEAS.NET SOA中间件平台提供了敏捷快速开发软件工程的最佳实践,通过提供大量的基础支撑功能如IOC、ORM、SOA、分布式体系及敏捷并发开发方法所支撑的插件开发体系,以及提供了大量的实体、数据模型设计生成工具、代码生成工具,用于帮助中小软件开发商快速成长。 AgileEAS.NET平台充分把握目前软件行业快速发展的新趋势,基于敏捷并行开发、快速适应市场这样淳朴的软件工程实践,采用业界广泛使用的Microsoft .Net构件(组件)开发技术实践了这种开发思想,帮助软件企业实现“敏捷变化、快速适合”的目标,从而帮助软件企业在激烈的市场竞争中赢得先机并获得更高的回报。 二、关于动态报表系统 在之前的犀利的报表系统,AgileEAS.NET SOA中间件平台GReport使用指南一文之中我们为大家介绍和实例演示了如何使用AgleEAS.NET SOA中间件平台的GReport报表系统。 但是,在之前提供的报表系统之中,不管是fyireporting报表系统还是GReport报表系统,都是预定义报表系统,即需要在程序开发过程之中进行预定义,虽然留给项目实施人员和维护人员极大的自定义功能,但是必竟是有所限制的,比如不能修改报表的ReportID,不能变更报表依赖的ORM实体对象。 而在现实项目之中,特别是偏重于数据查询、统计分析的MIS类系统,项目后期需要大量的统计分析报表,而在项目开发过程之中,毕竟不可能把所有的报表都开发出来,因为其需求并不是在开发阶段所提供的,而是在系统运行过程之中,随着对系统应用的深入会有越来越多的报表需求,那么在这个时间,再由开发人员重新定义报表,显然有些不能接受,一是项目的成果会明细的提高,二是因为开发人员的流动和其他一些因素,比如开发企业的售后服务响应周期较长,不能及时的响应这种需求。 为解决此问题,AgileEAS.NET SOA中是件平台创新的提出了动态报表的思路,即我们系统的报表进行了大致的划分,开发前提能明确确定的业务票据和业务报表由开发人员在开发过程之中实现,而对于因为不同的企业、用户的不同管理需求而导致变化的那些可变化报表系统,则交由项目实施人员或者系统应用者的维护人员进行实现。 这样做,可以为开发企业和系统使用者都能提出更大的便利,对于开发企业来讲,把一部分报表后置交由实施人员根据客户的具体情况在项目实施周期之内完成,一是可以节省前提开发成本,减少返工带来的高成本,二是可以把产品做成稳定的基础部分+动态定义的报表系统,便于对软件系统的定型和维护,而对于系统使用者也是也极大的便利,比如一些急需的或者特别的报表系统,则可以直接由自己的实施人员搞定,并且随便可以增加和修改,减少需要的实现周期。 AgileEAS.NET SOA中间件平台的动态报表系统其本质是定义一个依赖于一个动态SQL查询的数据报表以及对这个报表的模块转换发布两个功能实现。 AgileEAS.NET SOA中间件平台没有为“动态报表”提供单独的定义和管理功能,其管理功能集成于“GR报表”和“报表管理”两个模块之中。 和犀利的报表系统,AgileEAS.NET SOA中间件平台GReport使用指南一文之中定义普通报表不一样的地方是,动态报表在定义过程之中必须要选中“报表模块、把报表做为独立模块发布”复选框,并且必须要填写报表的“查询语句”,如果“查询语句”是一个带参数的动态查询语言,则必须要定义“查询参数”。 以下对几个重要参数做一下说明: “报表模块、把报表做为独立模块发布”:动态报表必须要中此项,选中本选项之后,系统会自动把这个报表发布为一个“报表模块”,即让报表充当系统之中的模块插件,一个报表即为一个模块插件,可以对于进行权限和导航部署,系统之中对此报表具体权限的账号登录系统之中就会以普通模块一样的方式打开报表并且使用。 “查询语句”:动态报表的查询语句是报表工作过程之中抓取报表数据的动态查询语句,报表的绑定数据来自于本查询语句与查询参数动态组合而成的目标查询结果: 查询语句之中以$符号起始的单词即为动态查询参数,此查询条件会根据最终用户的输入进行替换,如果查询语句之中定义了动态查动态查询参数,则必须定义报表的“查询参数”。 “查询参数”:查询参数用于详细定义解释报表动态查询语句之中的动态参数,比如参数的显示标题、参数数据类型、参数默认值,参数是否与某输入字典相关联等,下图的查询参数与上图你动态查询语句相匹配: 数据类型,目前支持“字符”、“日期”、“日期时间”、“整数”、“小数”。 查询参数被用于在打开报表自动生成的查询UI界面上输入预值的参数值,以便于动态生成报表数据。 三、动态报表实践 开发动态报表不需要进行C#或者VB.NET编程,但是需要掌握系统的数据库结构、会设计、制作报表和熟练的使用AgileEAS.NET SOA中间件平台的系统管理功能,符合这种条件的人员主要是系统实施人员和系统维护人员。 下面我们就是GReport动态报表一步一步的学习和演示一下处理过程。 首先,我们需要打开平台的“GR报表”模块,并且增加一个新的报表: 必须选中“报表模块、把报表做为独立模块发布”,然后切换到“查询语句”Tab页并且写入如下SQL语句: 这个SQL语句之中带了两个动态参数:$StartTime和$EndTime两个参数,我们的目标是统计LMTIME在这两个参数区间的模块,并且以程序集为分组汇总条件。 然后我们切换到“查询语句”Tab页,我们可以看到: 系统自动的从“查询语句”之中提取StartTime和EndTime,但是显示标题、数据类型、迷人值还需要我们手动修改和填写,填写完成如下图: 这样就完成了“查询参数”的定义,点“确定”按钮这后保存报表。 接下来双击刚添加的动态报表,系统会打开设计界面,自动加载初始样式: 请根据情况自己修改报表,最后保存,我们修改为以下样式: 这样报表的设计工作就完成了,接下来我们为动态报表进行使用者授权和导航分组部署,首先我们打开“角色管理”并且选中一个角色(我们选择“平台演示”角色),然后双击打开: 双击“添加”按钮,打开“模块选择界面”: 选择“搜索报表”复选框,输入检索条件,点“搜索”按钮之后选中刚才加载的模块,点击确定,返回“角色”属性设定界面。 点击“确定”完成对动态报表的访问授权。 接下来我们设置导航分组的部署,打开“导航分组”选择要部署动态报表的分组,如果没有分组请添加一个新的分组,有关于如何添加 一个新的导航分组的使用说明请参考《AgileEAS.NET SOA中间件系统管理使用教程 V5.0》。 选中一个分组,然后后右边空白区域右键打开快捷菜单,选择“添加”打开“模块选择窗口”: 选择动态报表然后单击“确定”按钮,完成对动态报表的导航分组部署。 四、执行验证 我们编译并且启动DrugShop.Main.exe,使用0001密码sa登录,我们就会在“统计报表”分组之中看到模块“模块程序集统计报表”: 打开这个模块: 设置开始时间和结束时间,点击“提取数据”按钮: OK,动态报表演示完成。 DrugShop案例之中同步提供了本例子的报表定义和导航、权限配置,请大家通过AgileEAS.NET SOA中间件官方网站的最新下载栏目进行下载。 五、联系我们 为完善、改进和推广AgileEAS.NET而成立了敏捷软件工程实验室,是一家研究、推广和发展新技术,并致力于提供具有自主知识产权的业务基础平台软件,以及基于业务基础平台开发的管理软件的专业软件提供商。主要业务是为客户提供软件企业研发管理解决方案、企业管理软件开发,以及相关的技术支持,管理及技术咨询与培训业务。 AgileEAS.NET SOA中间件平台自2004年秋呱呱落地一来,我就一直在逐步完善和改进,也被应用于保险、医疗、电子商务、房地产、铁路、教育等多个应用,但一直都是以我个人在推广,2010年因为我辞职休息,我就想到把AgileEAS.NET推向市场,让更多的人使用。 我的技术团队成员都是合作多年的老朋友,因为这个平台是免费的,所以也没有什么收入,都是由程序员的那种理想与信念坚持,在此我感谢一起奋斗的朋友。 团队网站:http://www.agilelab.cn, AgileEAS.NET网站:http://www.smarteas.net 官方博客:http://eastjade.cnblogs.com QQ:47920381,AgileEAS.NET QQ群:113723486(AgileEAS SOA 平台)/上限1000人 199463175(AgileEAS SOA 交流)/上限1000人 212867943(AgileEAS.NET研究)/上限500人 147168308(AgileEAS.NET应用)/上限500人 172060626(深度AgileEAS.NET平台)/上限500人 116773358(AgileEAS.NET 平台)/上限500人 125643764(AgileEAS.NET探讨)/上限500人 193486983(AgileEAS.NET 平台)/上限500人 邮件:james@agilelab.cn,mail.james@qq.com, 电话:18629261335。
by 魏琼东
2013.12.18 13:37
一、前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台。用于帮助中小型软件企业建立一条适合市场快速变化的开发团队,以达到节省开发成本、缩短开发时间,快速适应市场变化的目的。 AgileEAS.NET SOA中间件平台提供了敏捷快速开发软件工程的最佳实践,通过提供大量的基础支撑功能如IOC、ORM、SOA、分布式体系及敏捷并发开发方法所支撑的插件开发体系,以及提供了大量的实体、数据模型设计生成工具、代码生成工具,用于帮助中小软件开发商快速成长。 AgileEAS.NET平台充分把握目前软件行业快速发展的新趋势,基于敏捷并行开发、快速适应市场这样淳朴的软件工程实践,采用业界广泛使用的Microsoft .Net构件(组件)开发技术实践了这种开发思想,帮助软件企业实现“敏捷变化、快速适合”的目标,从而帮助软件企业在激烈的市场竞争中赢得先机并获得更高的回报。 二、管理信息系统开发之中的字典选择录入问题 AgileEAS.NET SOA中间件平台被广泛的应用于MIS类系统之中,可以说基于AgileEAS.NET SOA中间件开发MIS类真是得天读后,能大大的降低系统的开发难度和开发工作量。 有管理信息系统开发之中有很大一部分工作是实现界面的数据选择录入,比如商品进销存之中的根据输入码、拼音码、检索码查出某部分字典数据并且选择录入,如下图: 这是一个典型的字典选择输入应用,此类应用大量应用于比如像采购入库、采购申请之中的选择要采购的商品信息,商品信息存储在商品字典,本案例是选择药品字典信息,选择录入药品字典信息以便于进行药品入库业务处理。 在传统的此类应用开发过程之中我们需要自己处理当输入焦点在检索文本框之中进行输入的输入事件以及大量的界面、数据检索处理工具,费时费力,如果一个界面之中多出这样几个此类的应用场景,那么这个插件的代码的70%或者以上都用于应对此类场景,就形成了一种代码超长、界面控件、输入控件的事件处理麻烦的境界,如以下这个界面: 这个界面之中有五处此类场景的应用,当然,在一些应用之中可能有十个或者更多的这种场景,整个模块在应对此类情况的代码极其之中,也会慢慢的导致代码的可读性,可维护性越来越差。 三、TextBoxAutoComplete组件 AgileEAS.NET SOA中间件平台在经过多年痛苦的开发应用之中,从各种客户的反馈和开发应用的经验之中积累了一套解决此问题的方案,并创造性的实现了一个基于输入文本框的扩展解决方案,TextBoxAutoComplete组件及其之后的InputDict(输入字典)管理体系。 TextBoxAutoComplete组件:根据其名称我们可以简单的理解为TextBox的自动完成组件,那么其功能就是类似于baidu、google的搜索文本框功能: TextBox控件配合TextBoxAutoComplete完成类似上图你的自动完成检索功能,只不过baidu、google的搜索文本框展示的是搜搜索关键字,而AgileEAS.NET SOA中间件平台之中的TextBoxAutoComplete展现的是各种字典的录入选择表格,如下图: TextBox控件配合TextBoxAutoComplete可以完成对任意类型的字典信息的检索录入和自动完成功能。 四、输入字典管理 如果说要实现对任意类型的字典信息的检索录入和自动完成功能,仅TextBoxAutoComplete组件是不够的,为什么呢, 这会涉及到各类输入字典的录入数据规则、检索规则、数据窗口(DataWindow)的数据显示、排序规则、以及对数据源的过滤规则等等。 那么如何解决此问题呢,AgileEAS.NET SOA中间件平台提供了一个字典管理功能“输入字典”: 系统中维护着一组用于控制TextBoxAutoComplete组件的数据检索、显示的各项参数,其中包括如下重要信息: 字典编码:字典编码是一个Guid类型的值,其值必须是唯一的,也早用于控制TextBoxAutoComplete进行重要的重要依据,也是维系TextBox控件与TextBoxAutoComplete的唯一纽带。 数据类型:TextBoxAutoComplete组件工作是所依赖的AgileEAS.NET SOA中间件ORM实体对象类型,即输入字典的数据检索、显示必须依赖于ORM实体对象。 显示参数:数据窗口(DataWindow)的宽度、高度和每次可显示的记录行数。 是否启用缓存:即输入字典的检索行为是基于数据缓存进行的还是基于数据库检索进行的,因为我们的处理很多不常见化的字典信息,比如民族、省份这样的信息不会经常发生变化,AgileEAS.NET SOA中间件平台设计一套基于时间戳的实体缓存体系,如果选择启去缓存,只自动完成的检索不会请求数据库操作,以减少通信和数据库原因,如果选择启用了缓存,则必须要设定缓存属性。 缓存属性:用于控件缓存的增量更新的一个日期时间型字段/实体数据,并且必须在ORM实体的这个属性上面加上CacheUpdated标记: 1: /// <;summary>
2: /// 最后更新时间 。
3: /// <;/summary>
4: [Column("LMTime", "最后更新时间"),CacheUpdated]
5: [DisplayName("最后更新时间")]
6: public DateTime LMTime
7: {
8: get;
9: set;
10: }
并且需要在对就的字典管理/维护程序这中,当增加、修改某一行字典记录之后需要把对应的字段时间更新为最新的修改时间,那么缓存系统就会在一定的延迟规则之后获得这一更新记录。
显示属性:当TextBoxAutoComplete组件完成选择录入之后,显示在关联文本框内的值对应的ORM属性。
缓存间隔:输入字典记录本身的缓存间隔,即TextBoxAutoComplete引擎从数据库中更新对应的字典定义的周期,最小为0分钟,即TextBoxAutoComplete直接读取数据库中的字典记录。
码值属性:当TextBoxAutoComplete组件完成选择录入之后,用于执行其他业务的字典编码属性,一般情况下为字典的主键属性。
显示设置:用于设置DataWindow(数据窗口)之中显示的列信息记录,包括显示那些列、列标题、显示顺序等:
数据源筛选:在数据根据输入的条件检索之前的数据筛选功能:
上图的筛选条件表示仅选择Icd10bksn值为“B”的记录。
搜索条件:用于定制TextBoxAutoComplete组件在经过筛选之后的数据源上的检索行为,例如本文第二张图上的输入的“ys”之后的数据源检索行为:
目前倒提供基于字符串字段的三种检索条件:StartsWith(like ‘ys%’)、EndsWith(like ‘%ys’)和Contains(like ‘%ys%’),基本上能满足99的应用。
五、开发过程
首先我们要有规划,定将好数据实体、在必须的实体上定将好缓存更新标记,最新版本的ORM设计器提供了支持,我们就以DrugShop案例之中的药品字典实体以及在药品入库的录入检索为例进行说明。
药品字典我们考虑使用缓存,即把药品字典缓存在本地,以减少对服务器的请求和通信压力,以下是药品字典人的定义:
其中LMTime为最后更新时间,用于控制缓存的增量更新。
当然需要注意的是,并不是所有的输入字典信息都需要从缓存之中读取,对于实时可变的录入信息,如高品库存信息必须要进行实时读取,就没有必要使用缓存,因为对于这些实时数据,实体缓存的准确率非常之低。
设计好ORM实体模型并且生成代码、编译实体程序集之后,我们使用AgileEAS.NET平台的输入字典创建一个新的输入字典:
打上启用缓存复选框、选择设置缓存属性、码值属性、显示属性如下:
选择显示属性如下:
设置搜索条件如下:
复制下字典的编码,并且保存这个字典设置,接下来我们使用VS打开程序,在药品入库功能之中使用刚才定义好的字典,首页我们概引用平台的EAS.Data.Controls.dll程序集,并且在工具栏之中添加选择项=》选择EAS.Data.Controls.dll程序集,确保把TextBoxAutoComplete组件加载到工具箱之中:
然后我们像界面拖入TextBoxAutoComplete组件,完成后如下:
然后我们设计检索文本框txtSeach的属性如下:
这地方最重要的就是设计TextBox基于TextBoxAutoComplete1组件扩展出来的属性MetadateID,即扩展录入元数据ID,关联自我们定义好的输入字典。
是不是很简单,定义一个输入字典,程序代码之中只需要拖入一个组件,设计一个ID,即完成了需要大量编码才能完成的工具,名至实归的快速开发利器。
六、执行验证
我们编译并且启动DrugShop.Main.exe,使用0001密码sa登录,打开药品入库功能,来试一下是否能够执行自动完成:
OK,使用正常,没有任何问题。
DrugShop案例之中同步提供了本例子的字典定义和使用代码,请大家通过AgileEAS.NET SOA中间件官方网站的最新下载栏目进行下载。
七、联系我们
为完善、改进和推广AgileEAS.NET而成立了敏捷软件工程实验室,是一家研究、推广和发展新技术,并致力于提供具有自主知识产权的业务基础平台软件,以及基于业务基础平台开发的管理软件的专业软件提供商。主要业务是为客户提供软件企业研发管理解决方案、企业管理软件开发,以及相关的技术支持,管理及技术咨询与培训业务。
AgileEAS.NET SOA中间件平台自2004年秋呱呱落地一来,我就一直在逐步完善和改进,也被应用于保险、医疗、电子商务、房地产、铁路、教育等多个应用,但一直都是以我个人在推广,2010年因为我辞职休息,我就想到把AgileEAS.NET推向市场,让更多的人使用。
我的技术团队成员都是合作多年的老朋友,因为这个平台是免费的,所以也没有什么收入,都是由程序员的那种理想与信念坚持,在此我感谢一起奋斗的朋友。
团队网站:http://www.agilelab.cn,
AgileEAS.NET网站:http://www.smarteas.net
官方博客:http://eastjade.cnblogs.com
QQ:47920381,AgileEAS.NET
QQ群:113723486(AgileEAS SOA 平台)/上限1000人
199463175(AgileEAS SOA 交流)/上限1000人
212867943(AgileEAS.NET研究)/上限500人
147168308(AgileEAS.NET应用)/上限500人
172060626(深度AgileEAS.NET平台)/上限500人
116773358(AgileEAS.NET 平台)/上限500人
125643764(AgileEAS.NET探讨)/上限500人
193486983(AgileEAS.NET 平台)/上限500人
邮件:james@agilelab.cn,mail.james@qq.com,
电话:18629261335。
by 魏琼东
2013.12.17 18:11
一、前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台。用于帮助中小型软件企业建立一条适合市场快速变化的开发团队,以达到节省开发成本、缩短开发时间,快速适应市场变化的目的。 AgileEAS.NET SOA中间件平台提供了敏捷快速开发软件工程的最佳实践,通过提供大量的基础支撑功能如IOC、ORM、SOA、分布式体系及敏捷并发开发方法所支撑的插件开发体系,以及提供了大量的实体、数据模型设计生成工具、代码生成工具,用于帮助中小软件开发商快速成长。 AgileEAS.NET平台充分把握目前软件行业快速发展的新趋势,基于敏捷并行开发、快速适应市场这样淳朴的软件工程实践,采用业界广泛使用的Microsoft .Net构件(组件)开发技术实践了这种开发思想,帮助软件企业实现“敏捷变化、快速适合”的目标,从而帮助软件企业在激烈的市场竞争中赢得先机并获得更高的回报。 二、关于WinClient的外挂资源体系介绍 最初版本的AgileEAS.NET SOA中间件平台的运行容器/外壳是没有界面替换体系,最初只是提供了替换关键部分的图片、文字的功能,随着AgileEAS.NET SOA中间件被众多的客户应用到各行各业之后,我们从客户的应用反馈之中进行了大量的重构,其中运行容器也越来越开放,从最初令开放替换部分图片到慢慢开放可以自由修改其他的导航栏、Banner、状态栏、菜单、登录界面、关于界面,发生了很大的变化,同步我们也提供了Desktop、MDI、Dockable等多种界面风格,可以说客户有更我的选择了。 随着更多软件企业或组织加入应用AgileEAS.NET SOA中间件行业,有许多的客户已经不能满足于在这几种风格之中进行选择,希望能给自己最大的自定义空间和范围,提供了更换主界面的需求,我们积极的响应这种需求,并且提出了相关的解决方案,并且在2012年AgileEAS.NET SOA 5.0版本的时间向大家提供。 主界面替换被某一些我们服务于的客户所使用,但是对于广大的关心AgileEAS.NET SOA中间件的朋友来说,并不能得到我们细致并且一对一的服务,因为我们还没有变此部分内容给大家做过介绍和在公开的案例之中提供,所以对于社区之中的很多朋友来说,还能灵活的应用本部分内容。 下图是一个典型的AgileEAS.NET SOA中间件平台WinClient容器的主界面: 其中包含以下组成部分: 主菜单:界面最上部的主菜单,系统、视图和帮助。 导航菜单:通过菜单之中的菜单项可以打开指点的功能模块。 导航栏:同系统导航菜单、以树形或者其他形式展示。 状态栏:显示系统的一些状态信息,如操作消息、当前登录信息等。 内容区:除以上项目外的界面空白区域为业务工作区,即模块插件的工作区域,新打开的模块在经区域显示和工作。 启始页:特指工作区之中第一个打开的模块,当系统登录完成之后会自动打开一个模块,此模块称为起始页模块。 三、IResource接口 AgileEAS.NET SOA 中间件平台为了应用对运行容器的各个部分进行自定义和扩展,提供了一个资源接口IResource: 1: using System;
2:
3: namespace EAS.Explorer
4: {
5: /// <summary>
6: /// 运行容器的外壳资源。
7: /// </summary>
8: public interface IResource
9: {
10: /// <summary>
11: /// 获取应用系统的图标,用于替换主界面的图标。
12: /// </summary>
13: System.Drawing.Icon GetMainIcon();
14:
15: /// <summary>
16: /// 获取默认的模块图标,用于简约、经典风格的Tab页图标显示,也用于Desktop模式的桌面图标显示。
17: /// </summary>
18: System.Drawing.Image GetModuleIcon();
19:
20: /// <summary>
21: /// 获取桌面背景图像,用于Desktop模式的桌面模块。
22: /// </summary>
23: System.Drawing.Image GetDesktopImage();
24:
25: /// <summary>
26: /// 获取应用系统的导航控件,用于替换平台的导航控件。
27: /// </summary>
28: /// <returns>WinForm/WPF用户控件。</returns>
29: object GetNavigationControl();
30:
31: /// <summary>
32: /// 获取应用系统的Banner控件,用于替换平台的Banner条。
33: /// </summary>
34: /// <returns>WinForm/WPF用户控件。</returns>
35: object GetBannerControl();
36:
37: /// <summary>
38: /// 获取应用系统的Bottom控件,用于替换平台的状态栏。
39: /// </summary>
40: /// <returns>WinForm/WPF用户控件。</returns>
41: object GetBottomControl();
42:
43: /// <summary>
44: /// 获取WinForm/WPF容器的关于对话框,用于替换平台的关于对话框。
45: /// </summary>
46: /// <returns>WinForm/WPF窗体。</returns>
47: object GetAboutForm();
48:
49: /// <summary>
50: /// 获取WinForm/WPF容器的主界面,用于替换平台的主界面。
51: /// </summary>
52: /// <returns>WinForm/WPF窗体。</returns>
53: object GetMainShell();
54:
55: /// <summary>
56: /// 获取WinForm/WPF/Silverlight容器的登录对话框,用于替换平台的登录对话框。
57: /// </summary>
58: /// <returns>WinForm/WPF/Silverlight窗体。</returns>
59: ILoginForm GetLoginForm();
60:
61: /// <summary>
62: /// 获取WinForm/WPF容器的起始页/初始模块,用于替换平台的起始页。
63: /// </summary>
64: /// <returns>WinForm/WPF用户控件。</returns>
65: object GetStartModule();
66:
67: /// <summary>
68: /// 获取系统的名称,显示在运行环境的导航栏。
69: /// </summary>
70: /// <returns>应用系统名称。</returns>
71: string GetApplicationName();
72:
73: /// <summary>
74: /// 获取系统的标题,显示在运行环境的主窗口之上。
75: /// </summary>
76: /// <returns>应用系统名称。</returns>
77: string GetApplicationTitle();
78:
79: /// <summary>
80: /// 是否显示主菜单。
81: /// </summary>
82: bool DisplayMainMenu
83: {
84: get;
85: }
86:
87: /// <summary>
88: /// 是否显示导航工具条。
89: /// </summary>
90: bool DisplayNavigationTool
91: {
92: get;
93: }
94: }
95: }
实现AgileEAS.NET SOA 平台的资源替换即是实现IResource接口的过程,在我们DrugShop、SmartERP案例之中都有对应的实现项目DrugShop.Res和SmartERP.Res。
当然,光实现IResource还不购,还需要修改系统的配置文件,以便让资源生效:
1: <;!--资源-->
2: <object name="EAS.Explorer.Resource" assembly="DrugShop.Res" type="DrugShop.Res.Resources" LifestyleType="Singleton"/>
需要注意的是在EAS.Explorer.dll程序集之中还定义了以下两个接口,INavigation接口:
1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Text;
5: using System.Text.RegularExpressions;
6:
7: namespace EAS.Explorer
8: {
9: /// <;summary>
10: /// 导航控件接口。
11: /// <;/summary>
12: public interface INavigation
13: {
14: /// <;summary>
15: /// 初始化导航。
16: /// <;/summary>
17: /// <;param name="m_GroupList">导航清单。</param>
18: /// <;param name="m_ModuleList">模块清单。</param>
19: void Initialize(IList<;INavigateGroup> m_GroupList, IList<INavigateModule> m_ModuleList);
20: }
21: }
ILoginForm接口:
1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Text;
5:
6: namespace EAS.Explorer
7: {
8: /// <;summary>
9: /// 定义登记对话框接口,用于实现自定义登录。
10: /// <;/summary>
11: public interface ILoginForm
12: {
13: /// <;summary>
14: /// 是否已经通过登录验证。
15: /// <;/summary>
16: bool Passed { get; }
17: }
18: }
自定义的导航控件必须实现INavigation接口,以便于平台实现导航的初始化,方法Initialize由平台调用,传入当前系统登录人员所具有权限的模块清单及相关的导航清单。
自定我的登录界面必须实现ILoginForm,以便于系统判定登录界面是否完成了登录验证。
四、IMainShell接口和自定义主界面
第三节在介绍IResource接口的时候我们会发现其他有一个GetMainShell()方法,其用于获取资源实现之中的主界面定义,系统主界面必须是一个Form并且要实现IMainShell接口:
1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Text;
5:
6: namespace EAS.Explorer
7: {
8: /// <;summary>
9: /// 定义主界面接口,用于实现自定义主界面。
10: /// <;/summary>
11: public interface IMainShell
12: {
13: /// <;summary>
14: /// 初始化主界面,根据平台传入的模块清单和相关的导航分组初始化主界面。
15: /// <;/summary>
16: /// <;param name="m_GroupList">导航清单。</param>
17: /// <;param name="m_ModuleList">模块清单。</param>
18: void InitializeShell(IList<;INavigateGroup> m_GroupList, IList<INavigateModule> m_ModuleList);
19:
20: /// <;summary>
21: /// 加载/打开指定模块,响应系统的模块打开操作。
22: /// <;/summary>
23: /// <;param name="module">模块实例。</param>
24: void OpenModule(object module);
25:
26: /// <summary>
27: /// 关闭当前模块(活动的模块)。
28: /// <;/summary>
29: void CloseModule();
30:
31: /// <summary>
32: /// 关闭指定模块。
33: /// <;/summary>
34: /// <;param name="module">模块实例。</param>
35: void CloseModule(object module);
36:
37: /// <summary>
38: /// 切换导航,展开、隐藏导航,主界面没有导航的隐藏、展开需求可以不处理。
39: /// <;/summary>
40: void SwitchNavigation();
41:
42: /// <summary>
43: /// 当前活动插件/模块。
44: /// <;/summary>
45: object ActiveAddIn
46: {
47: get;
48: }
49:
50: /// <;summary>
51: /// 已打开的插件/模块集合。
52: /// <;/summary>
53: List<;object> AddIns
54: {
55: get;
56: }
57: }
58: }
其中InitializeShell方法:用于平台传入当前系统登录人员所具有权限的模块清单及相关的导航清单,由自定义界面实现界面的初始化。
OpenModule方法:用于实现对模块的打开,平台传入要打开的模块,由主界面进行处理,实现主界面对模块的动态加载。
CloseModule方法:用于关闭已经打开的模块,并对界面进行清理。
SwitchNavigation方法:切换导航,展开、隐藏导航,主界面没有导航的隐藏、展开需求可以不处理。
ActiveAddIn属性:向平台返回当前的活动模块。
AddIns属性:向平台返回已加载的模块清单。
四、自定义界面实例
近期 有朋友建议使用devcomponents或者DotNetBar为大家演示一下如何自定义平台的主体界面,参考了网有对devcomponents和DotNetBar相关的资料之后我们选择了较为轻量级的DotNetBar为大家演示如何替换系统的主界面。
我们使用DotNetBar所提供的一些控件实现了以下三种风格的主体界面:
第一种是Win7/Ribbon风格的主界面RibbonShell,如下图所示:
其对应代码为DrugShop案例之中的DrugShop.Res项目之中的RibbonShell.cs程序文件。
第二种为类似Visual Studio界面风格的DockableShell,其效果如下:
其对应代码为DrugShop案例之中的DrugShop.Res项目之中的DockableShell.cs程序文件。
第三种为不包含导航栏的简单MDI界面风格的TabShell,其效果如下:
其对应代码为DrugShop案例之中的DrugShop.Res项目之中的TabShell.cs程序文件。
五、关于代码
以上介绍了三种风格的自定义主界面的例子,例子不多,也不复杂,或许也不能满足所有人的美观度需求和功能需求,其目的在于抛砖引用,希望借此文让更多的开发者加入到我们的行列之中来,做出更加美观大方的界面。
关于以上三种风格自定义界面代码,我们已经合并到DrugShop案例和SmartEPR案例之中,请大家在AgileEAS.NET SOA中间件官方网站的最新下载栏目进行下载。
在启动自定义界面的过程之中切记要修改资源项目之中IResource的实现代码之中的GetMainShell方法代码:
1: public object GetMainShell()
2: {
3: return new RibbonShell(); //Ribbon风格自定义界面。
4: //return new DockableShell(); //Dockable风格自定义界面。
5: //return new TabShell(); //TabMdi风格自定义界面。
6: //return null; //使用AgileEAS.NET SOA平台自带界面。
7: }
本文所使用的是DotNetBar115版本,有关于DotNetBar115请通过http://112.74.66.105/downloads/DotNetBar115.rar下载。
六、联系我们
为完善、改进和推广AgileEAS.NET而成立了敏捷软件工程实验室,是一家研究、推广和发展新技术,并致力于提供具有自主知识产权的业务基础平台软件,以及基于业务基础平台开发的管理软件的专业软件提供商。主要业务是为客户提供软件企业研发管理解决方案、企业管理软件开发,以及相关的技术支持,管理及技术咨询与培训业务。
AgileEAS.NET SOA中间件平台自2004年秋呱呱落地一来,我就一直在逐步完善和改进,也被应用于保险、医疗、电子商务、房地产、铁路、教育等多个应用,但一直都是以我个人在推广,2010年因为我辞职休息,我就想到把AgileEAS.NET推向市场,让更多的人使用。
我的技术团队成员都是合作多年的老朋友,因为这个平台是免费的,所以也没有什么收入,都是由程序员的那种理想与信念坚持,在此我感谢一起奋斗的朋友。
团队网站:http://www.agilelab.cn,
AgileEAS.NET网站:http://www.smarteas.net
官方博客:http://eastjade.cnblogs.com
QQ:47920381,AgileEAS.NET
QQ群:113723486(AgileEAS SOA 平台)/上限1000人
199463175(AgileEAS SOA 交流)/上限1000人
212867943(AgileEAS.NET研究)/上限500人
147168308(AgileEAS.NET应用)/上限500人
172060626(深度AgileEAS.NET平台)/上限500人
116773358(AgileEAS.NET 平台)/上限500人
125643764(AgileEAS.NET探讨)/上限500人
193486983(AgileEAS.NET 平台)/上限500人
邮件:james@agilelab.cn,mail.james@qq.com,
电话:18629261335。
by 魏琼东
2013.11.11 13:38
一、前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台。用于帮助中小型软件企业建立一条适合市场快速变化的开发团队,以达到节省开发成本、缩短开发时间,快速适应市场变化的目的。 AgileEAS.NET SOA中间件平台提供了敏捷快速开发软件工程的最佳实践,通过提供大量的基础支撑功能如IOC、ORM、SOA、分布式体系及敏捷并发开发方法所支撑的插件开发体系,以及提供了大量的实体、数据模型设计生成工具、代码生成工具,用于帮助中小软件开发商快速成长。 AgileEAS.NET平台充分把握目前软件行业快速发展的新趋势,基于敏捷并行开发、快速适应市场这样淳朴的软件工程实践,采用业界广泛使用的Microsoft .Net构件(组件)开发技术实践了这种开发思想,帮助软件企业实现“敏捷变化、快速适合”的目标,从而帮助软件企业在激烈的市场竞争中赢得先机并获得更高的回报。 二、关于SmartERP.NET SmartERP.NET 是一套简单的电脑耗材分销ERP系统,其实说是ERP系统还有点夸张,但是最初的开发者都已经这么叫了,那么我们也就也就这么理解吧,SmartERP.NET 原本是我们的一个客户在2011年为其一个客户/朋友开发的一套软件,当时客户人员的开发都是以VB6.0进行开发,客户打算把开发语言换到C#上,基于我们平台进行技术预研,并且打算基于AgileEAS.NET SOA中间件平台进行应用开发,正好当然有一个朋友是做某品牌电脑大区经销的,双方双有所需,正好就基于我们AgileEAS.NET SOA中间件开发了这套简单的ERP系统,其目的有两个,一个是解决客户的需求、另一个是锻炼一下自己的开发人员。 以下是系统主界面: 什么是ERP: ERP是Enterprise Resource Planning(企业资源计划)的简称,是一种主要面向制造行业进行物质资源、资金资源和信息资源集成一体化管理的企业信息管理系统。 ERP是一个以管理会计 为核心可以提供跨地区、跨部门、甚至跨公司整合实时信息的企业管理软件。 参见百度百科: http://baike.baidu.com/subview/109408/7177679.htm SmartERP.NET货物采购入库流程 SmartERP.NET 货物销售流程 三、系统客户端及服务端配置 有关程序如何配置请参见 魏琼东的文章 AgileEAS.NET SOA 中间件平台 5.2 发布说明-包含Silverlight及报表系统的开源代码下载 AgileEAS.NET SOA 中间件平台5.2版本下载、配置学习(一):下载平台并基于直连环境运行 AgileEAS.NET SOA 中间件平台5.2版本下载、配置学习(二):配置WinClient分布式运行环境 AgileEAS.NET SOA 中间件平台5.2版本下载、配置学习(三):配置ActiveXForm运行环境 AgileEAS.NET SOA 中间件平台5.2版本下载、配置学习(四):开源的Silverlight运行容器的编译、配置 四、完整的应用-实现完整的ERP 本文我们将实现一个类似电脑城的货物ERP系统,主界面如下:(登录账户:erp-admin 密码为空) 五、下载源代码编译配置运行 本案例源代码请通AgileEAS.NET SOA中间件官方网站的最新下载中的栏目进行下载或者从SVN中获取最新版本的源代码: 下载或者SVN-OUT得到代码之后我们来看一下代码文建构: 一级目录 二级目录 说明 Code 程序源代码 SmartERP.Entities 实体(ORM)代码 SmartERP.BLL.Contracts 业务契约定义代码 SmartERP.BLL.Host 数据实现代码 SmartERP.Common 公用类库 SmartERP.WinUI 界面层代码 db 用户数据库文件,SQL Server数据库 Documents 文档,用户模型文档 Bin 引用程序集及编译输出 用VS2010或者VS2012打开Code目录之中的SmartERP.sln解决方案进行编译,编译成功之后我们开始进行配置。 打开Bin目录之中的SmartERP.Main.exe.config进行客户端配置: 修改红色部分连接字符串 六、统计报表 SmartERP示例中使用的是Gird++ 报表程序 开发管理 -- GR报表管理 数据报表就是写SQL语句查询数据库 获取结果 对象报表就是通过查询内存对象 获取结果 报表的制作:为了降低入门的难度,本编介绍的是用数据报表也就是写SQL语句查询数据库的方式,对象报表将在以后的文章中介绍。 1.新建-数据报表-查询语句中 写入要查询的报表sql语句 2.报表设计界面 3.设置要显示的是哪张报表,根据GUID 4.编写查询语句 并设置过滤条件 5. 报表预览效果 由于时间仓促,程序难免会有Bug,望大家谅解。 截止这里 我们的教程就已经写完了,表结构及相关说明请参阅SmartErp.NET下载包里面的相关文档。 最后感谢SmartErp.NET的原始作者陶虎刚同学,也感谢对原始代码、文档进行整理升级,以及本文的作者计文析同学。 七、联系我们 为完善、改进和推广AgileEAS.NET而成立了敏捷软件工程实验室,是一家研究、推广和发展新技术,并致力于提供具有自主知识产权的业务基础平台软件,以及基于业务基础平台开发的管理软件的专业软件提供商。主要业务是为客户提供软件企业研发管理解决方案、企业管理软件开发,以及相关的技术支持,管理及技术咨询与培训业务。 AgileEAS.NET SOA中间件平台自2004年秋呱呱落地一来,我就一直在逐步完善和改进,也被应用于保险、医疗、电子商务、房地产、铁路、教育等多个应用,但一直都是以我个人在推广,2010年因为我辞职休息,我就想到把AgileEAS.NET推向市场,让更多的人使用。 我的技术团队成员都是合作多年的老朋友,因为这个平台是免费的,所以也没有什么收入,都是由程序员的那种理想与信念坚持,在此我感谢一起奋斗的朋友。 团队网站:http://www.agilelab.cn, AgileEAS.NET网站:http://www.smarteas.net 官方博客:http://eastjade.cnblogs.com QQ:47920381,AgileEAS.NET QQ群:113723486(AgileEAS SOA 平台)/上限1000人 199463175(AgileEAS SOA 交流)/上限1000人 120661978(AgileEAS.NET 平台交流)/上限1000人 212867943(AgileEAS.NET研究)/上限500人 147168308(AgileEAS.NET应用)/上限500人 172060626(深度AgileEAS.NET平台)/上限500人 116773358(AgileEAS.NET 平台)/上限500人 125643764(AgileEAS.NET探讨)/上限500人 193486983(AgileEAS.NET 平台)/上限500人 邮件:james@agilelab.cn,mail.james@qq.com, 电话:18629261335。
by 魏琼东
2013.10.14 21:15
一、AgileEAS.NET SOA 中间件简介 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台。用于帮助中小型软件企业建立一条适合市场快速变化的开发团队,以达到节省开发成本、缩短开发时间,快速适应市场变化的目的。 AgileEAS.NET SOA中间件平台提供了敏捷快速开发软件工程的最佳实践,通过提供大量的基础支撑功能如IOC、ORM、SOA、分布式体系及敏捷并发开发方法所支撑的插件开发体系,以及提供了大量的实体、数据模型设计生成工具、代码生成工具,用于帮助中小软件开发商快速成长。 AgileEAS.NET平台充分把握目前软件行业快速发展的新趋势,基于敏捷并行开发、快速适应市场这样淳朴的软件工程实践,采用业界广泛使用的Microsoft .Net构件(组件)开发技术实践了这种开发思想,帮助软件企业实现“敏捷变化、快速适合”的目标,从而帮助软件企业在激烈的市场竞争中赢得先机并获得更高的回报。 二、下载 AgileEAS.NET SOA 中间件平台5.2 版本 打开AgileEAS.NET SOA 中间件平台官方网站最新下载栏目: 通过半年时间的客户反馈,我们对AgileEAS.NET SOA中间件进行了部分修改, 形成了5.2版本,相对于之前的5.1版本,我们做了以下的改动: 1).重新设计了ORM的缓存体系,增加了一套ORM对象的增量缓存体系。 2).为ORM体系提供了懒加载机制,懒加载可以从数据库也可以从缓存进行懒加载。 3).修改了一些Linq语言实现上的Bug。 4).对SOA服务、分布式体系进行了精简和整合,合并和裁减了几个有关于分布式通信的程序集。 5).增加了对SOA服务进行负载均衡的支持。 6).重构和简化了Sockt/Tcp通信框架。 7).SOA、分布式通信系统支持Socket通信模式。 8).SOA服务及NLB服务增加了对X64架构的支持。 9).集成对lua脚本语言引擎及配套的编码调试工具。 10).从资源管理平台BLL.Host之中分离了对BPM的支持到独立的程序集,以隔离工作流不能工作对管理功能的影响。 11).调整了Grid++报表系统的部分功能、增加对子报表的功能支持。 12).强化了数据初始化工具、系统配置工具。 13).增加了SOA服务、NLB服务的监控工具。 14).增加了WinForm开发中辅助扩展组件:字典快速录入、自动焦点跳转。 15).增加了DataGridView控件CRUD自动持久化组件,即只需要向DataGridView绑定一个数据源,只可以自动实现当DataGridView增加、删除、修改后数据自动写回功能。 16).调整了工作流部分的API设计。 17).调整了日志系统的部分设计。 18).调整了ActiveXForm运行容器、改变了ActiveXForm的组件升级方式、把原先独立一套的升级改变为使用平台统一的升级工具进行升级,运行服务器容器由原来的IIS环境该由AgileEAS.NET 平台SOA服务容器运行。 19).调整了Silverlight运行容器的设计、服务端运行容器由原来的IIS环境该由AgileEAS.NET 平台SOA服务容器运行。 总结一下就是,5.2与5.1之间没有对平台做过涉及结构上的重大调整,而是把重点放在了对系统稳定性、高性能、应用开发的简单性这些方面,即希望本平台能达到上手执容易、开发方便的目标。 三、AgileEAS.NET SOA 中间件平台5.2 版本发布内容 在AgileEAS.NET SOA 中间件2013第四季度发布计划一文之中曾经简单的向大家介绍了AgileEAS.NET SOA 5.2版本发布的大概时间及大概介绍,AgileEAS.NET SOA 中间件平台5.2版本最大的亮点是在发布平台的同时将会向大家发布部分平台的开源代码及三套平台的案例。 包括以下开发源代码: 1).AgileEAS.NET SOA 中间件平台Silverlight运行容器的源代码、Silverlight版本的工作流系统源代码。 2).AgileEAS.NET SOA 中间件平台采用的RDL 报表系统源代码,包括报表引擎、报表控件、报表设计器,已经过我们的汉化和改进,大量应用于医疗、物流、铁路、电力等行业。 同时,案例源代码由原来的一个增加为3个: 1).AgileEAS.NET SOA 中间件平台-药品商店管理信息系统(DrugShop)源代码,做了大量修改和优化,同步更新到AgileEAS.NET SOA 中间件最新平台。 2).新增加了一个-小型ERP系统(电脑分销)系统(SmartERP),本案例原为某客户为某电脑经销商所开发,后来贡献给我们做为例子之用。 3).AgileEAS.NET SOA 中间件平台Socket通信框架-在线聊天室系统(ChatRoom)源代码,为快速掌握AgileEAS.NET 中间件平台Socket消息通信框架所必备。 四、AgileEAS.NET SOA 中间件平台5.2 开发包介绍 4.1 目录结构 开发人员从AgileEAS.NET官方http://www.smarteas.net网站或者敏捷软件工程实验室网站http://www.agilelab.cn下载到的AgileEAS.NET开发包名称为AgileEAS.NET 5.0.rar。 解压后包含以下文件目录结构: 下面我把各目录做个简单的说明: Bin目录 Bin目录中包含着AgileEAS.NET平台中的所有程序集文件,插件定义、WinForm、SmartClient运行容器、基础类库、开发辅助、配置工具都在这里面。 AppServer目录 发布是其中只有Bin和xClient两个空目录,用于做为SOA服务的运行目录、自动升级的服务端目录。 documents目录 Document目录中包含着AgileEAS.NET SOA中间件平台的介绍、开发指南、使用说明书、类库参考手册等一系列的文档。 example目录 AgileEAS.NET SOA中间件平台提供的一组开发例子,我会用专门的文档对里面的例子介绍。 ActiveXForm.Web目录 ActiveXForm运行容器的部署站点,包含EAS.ActiveXForm的运行站点,以及ActiveXForm运行所必须的客户端IE扫描件、IE插件客户段运行所必须的X509根证书、AcriveXForm客户端运行所必须的配置文件。 Silverlight.src目录 AgileEAS.NET SOA中间件平台Silverlight运行容器的所有源代码,本部分已开源。 RDL Project 3.96目录 AgileEAS.NET SOA中间件平台所集成的RDL报表系统的所有源代码、本部分已开源。 4.2 程序集介绍 在AgileEAS.NET SOA中间件平台开发包的bin目录中提供了70个左右程序集,其涵盖了AgileEAS.NET SOA中间件平台的方方面面,下面我对程序集做一个简单的分类。 基础程序集: EAS.MicroKernel.dll 微内核程序集,包含接口契约、IOC、SL、及服务容器的定义。 EAS.Data.dll 提供统一的数据访问和ORM。 EAS.Web.dll Web开发扩展(针对应用程序和模块接口)。 EAS.Windows.dll WinForm/WFP开发扩展、及一些预定义控件。 资源管理平台: EAS.Explorer.dll 资源管理平台基础组件。 EAS.Explorer.Entities.dll 资源管理平台实体定义。 EAS.Explorer.BLL.Contracts.dll 资源管理平台业务/服务接口契约 EAS.Explorer.BLL.Host.dll 资源管理平台业务/服务实现 EAS.Explorer.Res.dll 外壳资源(可替换)。 EAS.Explorer.Web.dll 运行容器之Web基础。 EAS.Explorer.WinUI.dll 基于WinForm的平台管理功能实现。 EAS.WinClient.dll WinForm/WPF运行容器。 EAS.WinClient.Start.exe WinForm/WPF运行容器引导程序。 ActiveXForm: EAS.ActiveXForm.ClientClasp.dll 客户端钩子(包含IE中运行的三个ActiveX控件)。 EAS.ActiveXForm.ClientClasp.AddIn.dll 客户端插件。 智能升级: EAS.SmartUpdater.exe 智能升级引导程序。 EAS.SmartUpdate.Config.exe 智能升级配置程序。 分布式服务: EAS.Distributed.dll 分布式访问客户端。 EAS.Monitor.dll SOA服务、负载均衡服务监控定义。 EAS.SOA.Server.exe SOA服务主程序。 EAS.SOA.Server.X64.exe SOA服务64位主程序。 EAS.NLB.Server.exe 负载均衡服务主程序。 EAS.SOA.Monitor.exe SOA服务监控程序。 EAS.NLB.Monitor.exe 负载均衡服务监控程序。 报表系统: RdlEngine.dll RDL引擎(开源项目)。 RdlViewer.dll RDL展示组件(开源项目)。 RdlDesigner.dll RDL设计组件。 EAS.Report.Controls.dll 报表打印组件。 EAS.GReport.Controls.dll Grid++打印组件。 开发辅助: EAS.OrmDesigner.exe 数据对象(ORM)设计器。 EAS.FormDesigner.exe 快速界面设计器。 初始化、配置工具: EAS.DbInitializer.exe 平台数据库初始化工具。 EAS.Configure.exe 快速配置文件定义工具。 工作流平台: EAS.BPM.Activities.dll 工作流活动定义。 EAS.BPM.Host.dll 工作流服务实现。 EAS.BPM.WinUI.dll 工作流平台管理UI。 Silverlight平台: EAS.MicroKernel.dll 微内核。 EAS.Data.dll 数据访问、Linq。 EAS.Controls.dll 基础控件。 EAS.ReportViewer.dll 报表浏览控件。 其他: EAS.Data.Provider.dll 数据访问提供者扩展,通过扩展实现ORACLE、MySql、Sqlite数据库的支持。 第三方组件: System.Workflow.Activities.dll WF3.5基础组件。 System.Workflow.ComponentModel.dll WF3.5基础组件。 System.Workflow.Runtime.dll WF3.5基础组件。 EAS.ThirdParty.Controls.dll 第三方开源控件源代码 NetronGraphLib.dll 图像组件。 ICSharpCode.AvalonEdit.dll.dll Microsoft.Data.ConnectionUI.Dialog.dll Microsoft.Data.ConnectionUI.dll Microsoft.XmlNotepad.dll 4.3 文档部分 AgileEAS.NET SOA中间件平台是一个快速开发平台,是一组中间件,业主要目录的是提供开发人员的开发效率,要充分了解并且学习AgileEAS.NET平台的快速开发实践和充分的利用AgileEAS.NET平台所提供的快速开发工具。 如何快速去学习和理解AgileEAS.NET SOA中间件平台呢,我们提供了大量的文档和例程,文档是AgileEAS.NET SOA中间件平台的组成部分,更是程序员熟悉AgileEAS.NET SOA中间件平台的窗户。AgileEAS.NET平台开发包中提供了《AgileEAS.NET SOA中间件平台技术说明书 》、《AgileEAS.NET SOA中间件平台开发指南》、《AgileEAS.NET SOA中间件平台系统管理使用教程》、《AgileEAS.NET SOA中间件平台开发辅助工具使用教程》、《AgileEAS.NET SOA中间件平台安装说明书》、《AgileEAS.NET SOA中间件平台数据库设计说明书(SQLServer)》、《AgileEAS.NET SOA中间件平台数据库设计说明书(Oracle)》等文档以及AgileEAS.NET SOA中间件平台基础类库参考手册。 4.4 示例部分 AgileEAS.NET SOA中间件平台5.2版本将会发布三个应用案例,但是这三个案例都不会和AgileEAS.NET 5.2发布包打包在一进行下载,而是在AgileEAS.NET SOA 中间件平台官方网站最新下载栏目设有专门的下载链接进行下载。 五、学习和配置文档 AgileEAS.NET SOA 中间件平台5.2版本下载、配置学习(一):下载平台并基于直连环境运行 AgileEAS.NET SOA 中间件平台5.2版本下载、配置学习(二):配置WinClient分布式运行环境 AgileEAS.NET SOA 中间件平台5.2版本下载、配置学习(三):配置ActiveXForm运行环境 AgileEAS.NET SOA 中间件平台5.2版本下载、配置学习(四):开源的Silverlight运行容器的编译、配置 六、联系我们 为了完善、改进和推广AgileEAS.NET而成立了敏捷软件工程实验室,是一家研究、推广和发展新技术,并致力于提供具有自主知识产权的业务基础平台软件,以及基于业务基础平台了开发的管理软件的专业软件提供商。主要业务是为客户提供软件企业研发管理解决方案、企业管理软件开发,以及相关的技术支持,管理及技术咨询与培训业务。 AgileEAS.NET平台自2004年秋呱呱落地一来,我就一直在逐步完善和改进,也被应用于保险、医疗、电子商务、房地产、铁路、教育等多个应用,但一直都是以我个人在推广,2010年因为我辞职休息,我就想到把AgileEAS.NET推向市场,让更多的人使用。 技术团队成员都是合作多年的老朋友,因为这个平台是免费的,我们的营运开支主要靠为客户提供咨询服务所得,我们都是因为程序员的那种理想与信念坚持,在此我感谢一起奋斗的朋友和一直支持我们工作的客户、朋友。 团队网站:http://www.agilelab.cn, AgileEAS.NET网站:http://www.smarteas.net 官方博客:http://eastjade.cnblogs.com QQ:47920381 AgileEAS.NET QQ群: 113723486(AgileEAS SOA 平台)/上限1000人 199463175(AgileEAS SOA 交流)/上限1000人 120661978(AgileEAS.NET 平台交流)/上限1000人 212867943(AgileEAS.NET研究)/上限500人 147168308(AgileEAS.NET应用)/上限500人 172060626(深度AgileEAS.NET平台)/上限500人 116773358(AgileEAS.NET 平台)/上限500人 125643764(AgileEAS.NET探讨)/上限500人 193486983(AgileEAS.NET 平台)/上限500人 邮件:james@agilelab.cn,mail.james@qq.com, 电话:18629261335。
by 魏琼东
2013.10.11 16:11
一、前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台。用于帮助中小型软件企业建立一条适合市场快速变化的开发团队,以达到节省开发成本、缩短开发时间,快速适应市场变化的目的。 AgileEAS.NET SOA中间件平台提供了敏捷快速开发软件工程的最佳实践,通过提供大量的基础支撑功能如IOC、ORM、SOA、分布式体系及敏捷并发开发方法所支撑的插件开发体系,以及提供了大量的实体、数据模型设计生成工具、代码生成工具,用于帮助中小软件开发商快速成长。 AgileEAS.NET平台充分把握目前软件行业快速发展的新趋势,基于敏捷并行开发、快速适应市场这样淳朴的软件工程实践,采用业界广泛使用的Microsoft .Net构件(组件)开发技术实践了这种开发思想,帮助软件企业实现“敏捷变化、快速适合”的目标,从而帮助软件企业在激烈的市场竞争中赢得先机并获得更高的回报。 二、关于Socket/Tcp框架的需求 在AgileEAS.NET SOA 中间件平台在大量客户的使用过程之中,有的客户提出了一些基于“消息推”、和应用系统事件通知的需求,比如在“医院信息系统”、“电子病历系统‘、”区域公共卫生平台“、等系统之中就提供了这样的需求,比如当大夫为病人开立了医嘱之后、需要在相关护理人员即时提示,之前大家都使用数据库刷新,数据库的压力都比较大,所以迫切的提出了这样的需求。 另外一个原因是AgileEAS.NET SOA 中间件平台之前一直使用WCF、WS、Romotinig通信做为SOA分布式架构的通信基础,我们在考虑WS、WCF的某些协议并不能提供给我们非常高效的通信,所以我们也需要有一套直接基于Socket/TCP的通信体系用于支撑我们的SOA分布式服务业务体系。 三、AgileEAS.NET SOA 中间件Socket/Tcp框架结构 AgileEAS.NET SOA中间件需要的Socket/Tcp框架严格意思是需要的基于Socket的通信消息中件间,其所提供的功能本质是对消息的处理,所以其所提供的API有三大类、Socket框架本身、消息框架及消息处理框架,以下是AgileEAS.NET SOA中间件的Socket/Tcp的应用框架结构: 各上图我们可以看到AgileEAS.NET SOA中间件需要的Socket/Tcp框架实现了这么一件有意思的事,把原生的Socekt基于数据流的流式通信模式转换为基于消息的消息通信模式,让开发人员多复杂的系统Socket通信和数据流处理之中解放出来,转而关心高层通信消息的设计和消息处理的业务设计与实现。 三、AgileEAS.NET SOA 中间件Socket/Tcp框架重要的接口和类 AgileEAS.NET SOA中间件需要的Socket/Tcp框架严格意思是需要的基于Socket的通信消息中件间,其所提供的功能本质是对消息的处理,所以其所提供的API有三大类、Socket框架本身、消息框架及消息处理框架,以下是AgileEAS.NET SOA中间件的Socket/Tcp的应用框架结构: 其中ISocketCient接口为客户段功能封装,其定义大体如下: 1: /// <summary>
2: /// Tcp客户端接口。
3: /// </summary>
4: public interface ISocketClient : ISocketEngine
5: {
6: /// <summary>
7: /// 客户端状态。
8: /// </summary>
9: ClientState ClientState
10: {
11: get;
12: }
13:
14: /// <summary>
15: /// 连接Tcp服务器。
16: /// </summary>
17: bool Connect();
18:
19: /// <summary>
20: /// 关闭与服务器的连接。
21: /// </summary>
22: void Close();
23:
24: /// <summary>
25: /// 发送消息。
26: /// </summary>
27: /// <param name="message">消息。</param>
28: void Send(IMessage message);
29:
30: /// <summary>
31: /// 调用消息,用于服务器/客户端应用中的请示==》响应消息的应用。
32: /// </summary>
33: /// <param name="request">请示消息。</param>
34: /// <returns>服务器返回的响应消息。</returns>
35: IMessage Invoke(IMessage request);
36:
37: /// <summary>
38: /// 异步调用消息,用于服务器/客户端应用中的请示==》响应消息的应用。
39: /// </summary>
40: /// <param name="request">请示消息。</param>
41: /// <returns>包含响应消息的异步任务。</returns>
42: NetInvokeTask BeginInvoke(IMessage request);
43:
44: /// <summary>
45: /// 服务器发生错误时触发。
46: /// </summary>
47: event ErrorEventHandler Error;
48:
49: /// <summary>
50: /// 连接服务器后触发。
51: /// </summary>
52: event EventHandler Connected;
53:
54: /// <summary>
55: /// 断开服务器连接后触发。
56: /// </summary>
57: event EventHandler Closed;
58: }
其是最重要方法为void Send(IMessage message)方法,即发送一个消息到服务器,这个方法也是对使用者开放的最重要方法,在这里发送的不是字节流,而是一个实现了IMessage接口的消息对象,当服户段接收到IMessage对象之后会调用与其对应的消息处理器(IMessageHandler)对象进行消息处理,反之客户段收到IMessage也会调用与其相关的消息处理器(IMessageHandler)对象进行处理。
ISocketServer、ISocketServerBase接口:
1: /// <summary>
2: /// Socket服务器基类接口。
3: /// </summary>
4: public interface ISocketServerBase : ISocketEngine
5: {
6: /// <summary>
7: /// 客户端会话集合。
8: /// </summary>
9: IList<NetSession> Sessions
10: {
11: get;
12: }
13:
14: /// <summary>
15: /// 注册了一个新会话后发生。
16: /// </summary>
17: event NetSessionEventHandler SessionStarted;
18:
19: /// <summary>
20: /// 某一个会话结束后发生。
21: /// </summary>
22: event NetSessionEventHandler SessionAbandoned;
23:
24: /// <summary>
25: /// 发送消息。
26: /// </summary>
27: /// <param name="target">消息接收方ID(会话ID)。</param>
28: /// <param name="message">消息。</param>
29: void Send(Guid target, IMessage message);
30:
31: /// <summary>
32: /// 发送网络消息。
33: /// </summary>
34: /// <param name="target">消息接收方ID(会话ID)。</param>
35: /// <param name="netMessage">网络消息。</param>
36: void Send(Guid target, NetMessage netMessage);
37:
38: /// <summary>
39: /// 发送网络报文(仅网关模式有效)。
40: /// </summary>
41: /// <param name="target">消息接收方ID(会话ID)。</param>
42: /// <param name="netPacket">网络报文。</param>
43: void Send(Guid target, NetPacket netPacket);
44:
45: /// <summary>
46: /// 发送网络数据(仅网关模式有效)。
47: /// </summary>
48: /// <param name="target">消息接收方ID(会话ID)。</param>
49: /// <param name="buffer">网络数据。</param>
50: void Send(Guid target, byte[] buffer);
51: }
1: /// <summary>
2: /// Socket服务器接口。
3: /// </summary>
4: public interface ISocketServer : ISocketServerBase
5: {
6: /// <summary>
7: /// 客户端连接数。
8: /// </summary>
9: int ClientCount
10: {
11: get;
12: }
13:
14: /// <summary>
15: /// 服务器状态。
16: /// </summary>
17: ServerState ServerState
18: {
19: get;
20: }
21:
22: /// <summary>
23: /// 开始Tcp服务器。
24: /// </summary>
25: void StartServer();
26:
27: /// <summary>
28: /// 停止Tcp服务器。
29: /// </summary>
30: void StopServer();
31:
32: /// <summary>
33: /// 关闭指定客户的连接。
34: /// </summary>
35: /// <param name="client">客户Guid。</param>
36: void AbandonSession(System.Guid client);
37:
38: /// <summary>
39: /// 服务器发生错误时触发。
40: /// </summary>
41: event ServerErrorEventHandler ServerError;
42:
43: /// <summary>
44: /// 服务器启动后触发。
45: /// </summary>
46: event System.EventHandler ServerStarted;
47:
48: /// <summary>
49: /// 服务器停止后触发。
50: /// </summary>
51: event System.EventHandler ServerStopped;
52: }
这两个接口定义了SocketServer的一些行为和属性,其中最重要的方法还是void Send(Guid target, IMessage message),实现向某个特定客户段连接发送应用消息,别外定义了一个IList<NetSession> Sessions属性,表示目前连接到此SocketServer的所有客户端会话信息。
NetSession表示服务器的一个客户段连接会话,包括连接上下文信息和连接的Socket通信对象,当某个SocketClient发送给SocketServer的信息都会被与其应对的NetSession进行处理,NetSession定义两个重要的方法public void Reply(uint requestID, IMessage message)和public void Abandon(),其中Reply表示向客户端回复一个消息,Abandon表示服务器强制中止此会话。
在整个Socket/tcp框架之中进行通信的最基本单元都是IMessage,那么SocketClient、SocketServer接收到IMessage如何处理呢,答案是由与之配对的IMessageHandler进行处理,所以SocketClient、SocketServer都实现了一个基础接口ISocketEngine:
1: /// <summary>
2: /// Socket引擎,Socket网络通信基础类。
3: /// </summary>
4: public interface ISocketEngine : IDisposable
5: {
6: /// <summary>
7: /// 通信引擎的全局唯一标识符号。
8: /// </summary>
9: System.Guid Guid
10: {
11: get;
12: }
13:
14: /// <summary>
15: /// IP地址和端口号。
16: /// </summary>
17: IPEndPoint IPEndPoint
18: {
19: get;
20: set;
21: }
22:
23: /// <summary>
24: /// IP地址。
25: /// </summary>
26: string IPAddress
27: {
28: get;
29: set;
30: }
31:
32: /// <summary>
33: /// 端口号。
34: /// </summary>
35: int Port
36: {
37: get;
38: set;
39: }
40:
41: /// <summary>
42: /// 报文最大长度。
43: /// </summary>
44: int MessageMaxSize
45: {
46: get;
47: }
48:
49: /// <summary>
50: /// 注册消息处理器。
51: /// </summary>
52: /// <typeparam name="T">消息类型。</typeparam>
53: /// <param name="hander">消息处理器。</param>
54: void AddHander<T>(IMessageHandler<T> hander) where T : IMessage;
55:
56: /// <summary>
57: /// 通过Socket发送数据之后触发。
58: /// </summary>
59: event SocketDataHandler SocketDataSend;
60:
61: /// <summary>
62: /// 通过Socket接收数据之后触发。
63: /// </summary>
64: event SocketDataHandler SocketDataReceived;
65:
66: /// <summary>
67: /// 发送报文完成之后触发。
68: /// </summary>
69: event PacketHandler PacketSend;
70:
71: /// <summary>
72: /// 报文接收完成之后触发。
73: /// </summary>
74: event PacketHandler PacketReceived;
75:
76: /// <summary>
77: /// 载送完一个NetMessage之后触发。
78: /// </summary>
79: event NetMessageHandler NetMessageSend;
80:
81: /// <summary>
82: /// 接收完一个NetMessage之后触发。
83: /// </summary>
84: event NetMessageHandler NetMessageReceived;
85:
86: /// <summary>
87: /// 消息发送完成之后触发。
88: /// </summary>
89: event MessageHandler MessageSend;
90:
91: /// <summary>
92: /// 接收消息完成之后触发。
93: /// </summary>
94: event MessageHandler MessageReceived;
95: }
其中方法void AddHander<T>(IMessageHandler<T> hander) where T : IMessage实现对消息处理器的注册,以便收到IMessage之后选择合适的处理器进行处理。
四、消息和消息处理器
从以上的介绍我们可以明确的知道AgileEAS.NET SOA中间件Socket/Tcp框架是的一个基于消息对象的消息通信框架,那么其最核心的业务就是定义消息及消息的处理思路,我们称之为消息及消息处理器结构:
其中IMessage接口为Socket/Tcp框架中最重要的接口,所有高层的应用消息都需要实现本接口:
1: /// <summary>
2: /// 消息接口定义。
3: /// </summary>
4: /// <remarks>
5: /// 这里所说的消息是指业务处理的最小单元,而不是传输于网络之间的网络消息。
6: /// </remarks>
7: public interface IMessage
8: {
9: /// <summary>
10: /// 从指定的 MessageReader加载消息对象。
11: /// </summary>
12: /// <param name="reader">消息读取器。</param>
13: void Load(BufferReader reader);
14:
15: /// <summary>
16: /// 将消息对象保存到指定的MessageWriter。
17: /// </summary>
18: /// <param name="writer">消息编写器。</param>
19: void WriteTo(BufferWriter writer);
20: }
其中Load和WriteTo实现IMessage消息对象实例与字节流之间进行相互转换,Load消息用于从字节流之中读取并实例化消息、WriteTo把消息转换为流写入消息流之中,在应用开发过程之中必须实现这两个方法并且在消息类上打上MessageAttribute标记:
1: /// <summary>
2: /// 消息ID属性。
3: /// </summary>
4: /// <remarks>
5: /// 标记网络消息,确定其唯一的ID。
6: /// </remarks>
7: [AttributeUsage(AttributeTargets.Class)]
8: public class MessageAttribute : Attribute
9: {
10: /// <summary>
11: /// 初始化MessageAttribute对象实例。
12: /// </summary>
13: /// <param name="messageID">消息ID。</param>
14: public MessageAttribute(string messageID)
15: :this(messageID,string.Empty)
16: {
17:
18: }
19:
20: /// <summary>
21: /// 初始化MessageAttribute对象实例。
22: /// </summary>
23: /// <param name="messageID">消息ID。</param>
24: /// <param name="description">消息说明。</param>
25: public MessageAttribute(string messageID, string description)
26: {
27: this.MessageID = new Guid(messageID);
28: this.Description = description;
29: }
30:
31: /// <summary>
32: /// 消息ID。
33: /// </summary>
34: public Guid MessageID
35: {
36: get;
37: set;
38: }
39:
40: /// <summary>
41: /// 消息说明。
42: /// </summary>
43: public string Description
44: {
45: get;
46: set;
47: }
48: }
MessageAttribute标记用于向已实现IMessage接口的具体消息的消息ID与消息说明,即向Socket通信框架声音本消息的唯一性之用,其中MessageID为一个GUID对象,GUID对象理论上是唯一的,我们可以表示消息的唯一性,以下是一个具体的消息例子:
1: /// <summary>
2: /// 用户登录消息。
3: /// </summary>
4: [Message("F42433DF-2D4D-4514-9523-2FE911E63CAA", "登录消息")]
5: [Serializable]
6: public class LoginMessage : IMessage
7: {
8: /// <summary>
9: /// 用户名。
10: /// </summary>
11: public string LoginID
12: {
13: get;
14: set;
15: }
16:
17: /// <summary>
18: /// 密码。
19: /// </summary>
20: public string PassWord
21: {
22: get;
23: set;
24: }
25:
26: #region IMessage 成员
27:
28: /// <summary>
29: ///
30: /// </summary>
31: /// <param name="reader"></param>
32: public void Load(EAS.IO.BufferReader reader)
33: {
34: LoginID = reader.ReadString();
35: PassWord = reader.ReadString();
36: }
37:
38: /// <summary>
39: ///
40: /// </summary>
41: /// <param name="writer"></param>
42: public void WriteTo(EAS.IO.BufferWriter writer)
43: {
44: writer.Write(LoginID);
45: writer.Write(PassWord);
46: }
47:
48: #endregion
49: }
以上是一个具体消息的例子,其表明消息ID为“F42433DF-2D4D-4514-9523-2FE911E63CAA”,其作用是登录消息,用于实现类似登录业务。
五、可靠的消息中间件
AgileEAS.NET SOA中间件Socket/Tcp框架是一个可靠的消息中间件,在设计过程之初就选择了完成端口模型进行开发,以保证服务的高并发和吞吐量,在底层消息通信上,我们选择了不超过8K的可变大小通信报文,比如当一个高层的IMeesage只有512字节内容的时候,会取转成一个一个远小于8K的报文进行发送,如果一个高层IMeesage为66K时,会被分解成为9条消息报文进行通信,前8条消息报文长度为8K,最后一条不满足8K,接收文收到这9条报文后组合并转换为IMeesage对象之后交由消息处理器IMeeesgaHandler进行处理。
在进行消息报文收发过程之中,经过长期测试、验证、设计和选择了高性能的防粘包设计,避免应用开发者头疼的消息粘包问题。
六、AgileEAS.NET SOA中间件需要的Socket/Tcp框架下载
AgileEAS.NET SOA中间件Socket/Tcp框架包含在AgileEAS.NET SOA中间件平台之中,具体定义在EAS.MicroKernel.dll程序集之中,要使用AgileEAS.NET SOA中间件Socket/Tcp框架进行基于Socket的通信开发,请通过AgilleEAS.NET SOA 中站件平台官方网站的最新下载页面下载。
七、联系我们
为了完善、改进和推广AgileEAS.NET而成立了敏捷软件工程实验室,是一家研究、推广和发展新技术,并致力于提供具有自主知识产权的业务基础平台软件,以及基于业务基础平台了开发的管理软件的专业软件提供商。主要业务是为客户提供软件企业研发管理解决方案、企业管理软件开发,以及相关的技术支持,管理及技术咨询与培训业务。
AgileEAS.NET平台自2004年秋呱呱落地一来,我就一直在逐步完善和改进,也被应用于保险、医疗、电子商务、房地产、铁路、教育等多个应用,但一直都是以我个人在推广,2010年因为我辞职休息,我就想到把AgileEAS.NET推向市场,让更多的人使用。
我的技术团队成员都是合作多年的老朋友,因为这个平台是免费的,所以也没有什么收入,都是由程序员的那种理想与信念坚持,在此我感谢一起奋斗的朋友。
团队网站:http://www.agilelab.cn,
AgileEAS.NET网站:http://www.smarteas.net
官方博客:http://eastjade.cnblogs.com
QQ:47920381,AgileEAS.NET
QQ群:113723486(AgileEAS SOA 平台)/上限1000人
199463175(AgileEAS SOA 交流)/上限1000人
120661978(AgileEAS.NET 平台交流)/上限1000人
212867943(AgileEAS.NET研究)/上限500人
147168308(AgileEAS.NET应用)/上限500人
172060626(深度AgileEAS.NET平台)/上限500人
116773358(AgileEAS.NET 平台)/上限500人
125643764(AgileEAS.NET探讨)/上限500人
193486983(AgileEAS.NET 平台)/上限500人
邮件:james@agilelab.cn,mail.james@qq.com,
电话:18629261335。
by 魏琼东
2013.10.11 08:58
一、AgileEAS.NET应用开发简介 在4月份,callhot写过一系列的有关于AgileEAS.NET平台的开发应用的系列AgileEAS.NET平台开发Step By Step系列-药店系统-索引,他通过一个接近于实际应用的案例,从头到尾的向大家展示了AgileEAS.NET平台在企业信息系统开发中的应用及其应用开发的过程。 AgileEAS.NET平台是一套应用系统快速开发平台,用于帮助中小软件开发商快速构建自己的企业信息管理类开发团队,以达到节省开发成本、缩短开发时间,快速适应市场变化的目的,AgileEAS.NET应用开发平台包含基础类库、资源管理平台、运行容器、开发辅助工具等四大部分,资源管理平台为敏捷并行开发提供了设计、实现、测试等开发过程的并行。 AgileEAS.NET平台基于软件过程改进以及构件化快速开发两方面达到这方面的目标,在软件过程改进实践方面,提出了独有的“敏捷并行开发方法”开发方法,其目的是在软件的管理之中提出符合国内中小软件企业实际情况并且可操作的软件工程实践、软件过程改进思想、及相配套的项目管理系统。 在快速开发方面,AgileEAS.NET平台平台提供了企业应用开发所需的诸如ORM、IOC、分布式通信、插件与平台基础结构以及一系统的快速生成工具,涵盖开发过程中的设计、编码、集成、部署、运维等各个环节。 在callhot的AgileEAS.NET平台开发Step By Step系列-药店系统的系统之中,他详细的向大家展示了AgileEAS.NET平台在企业信息系统中提供的强大支持,在短短的一个月时间之向,向大家贡献了一个完整的案例及配套的几十篇渐进式教程,我相信大家通过他的教程,都能应用AgileEAS.NET平台中小型企业应用。 二、药店系统的SAAS部署 Callhot接手了新的工作,我在他留下的代码的基础之上,采用了最新的AgileEAS.NET平台进行了一个重构和裁剪,并且通过互联网以SAAS结构向大家发布了这个应用,其总体结构如下。 数据库和分布式应用层我部署在我的互联网服务器上,客户端我将提供一个msi包给大家下载,客户端和应用服务器可以通过webservice、WCF(http/TCP)进行数据通信,最终运行界面如下: 三、客户端下载及使用说明 客户软编译版本我打开了rar压缩包,请大家通过这里下载,下载解压缩后运行EAS.WinClient.exe文件。 大家可以使用0001(采购员),0002(销售员),0003(店长)三个账号登录药店系统,所有密码均为空,三个账户操作权限不同,请大家不要修改密码。 在下载包中的EAS.Winclient.exe.config文件之中记录应用程序服务器的通信设置。 <services> <service name="RMIService" service-type="WebService" singleton="true" url="http://www.agilelab.cn/xservice/rmiservice.asmx" /> <!--<service name="RMIService" service-type="WcfService" singleton="true" url="net.tcp://202.100.84.179:6688/EAS.RMIService" />--> </services>
系统默认使用WebService通信,连接至http://www.agilelab.cn/xservice/rmiservice.asmx,我在http://www.agileleab.cn/网站以iis宿住部署了webservice方式部署了通信服务,业务层寄宿在iis之中运行。
使用者也可以替换为wcf/tcp通信,连接至net.tcp://202.100.84.179:6688/EAS.RMIService,我在202.100.84.179部署了一套独立的基于wcf/tcp通信的应用服务程序。
友情提示一下,webservice通信较慢,特别是在登录界面之上,点了登录可能要等一会,因为使用的是SericeLocator动态调用技术,涉及编译webservice的代理类,请大家理解。
四、关于自动升级
在AgileEAS.NET平台本次重构过程之中,废弃了原有的基于插件的静默升级形式,替换了比较通过的独立升级程序,升级参数通过客户端目录中的update.ini文件升级。# AgileEAS.Net 平台升级控制文件 [config] allow = 1url = http://www.agilelab.cn/xservice/smartupdateservice.asmx#url = net.tcp://202.100.84.179:6688/EAS.SmartUpdateService
升级技术同样也可以采用ws技术也可采用wcf技术,目前,为了避免多点升级维护的麻烦,只提供于ws的升级,升级服务地址http://www.agilelab.cn/xservice/smartupdateservice.asmx。
五、案例源代码
本案例源代码结构重构之后更加合理,代码结构如下:
DrugShop.DAL为系统的数据访问层(充血模型),DrugShop.BLL为系统的业务层/服务层,DrugShop.WinUI为系统以WinForm为表现模式的UI层,DrugShop.Res为系统的可替换资源,包括自定义的登录、关于窗口、banner条和起始页模块,DrugShop.AssStart为开发过程中的平台插件容器调试环境的启动程序。
药店系统-案例的源代码、文档、数据库备份、最后发布都打进一个独立的Rar包中,其结构如下:
请大家从这里下载。
六、平台其他下载
有关于平台最新版本的最新发布版本的程序集、类库手册、相关资料,请大家从AgileEAS.NET平台的官网http://www.smarteas.net/进行下载,官网设有独立的下载页面,从这里下载:官网下载。
CallHot 写过一个系列的基于AgileEAS.NET平台的开发案例,请大家通过AgileEAS.NET平台开发Step By Step系列-药店系统-索引及AgileEAS.NET敏捷开发平台及案例下载(持续更新)-索引、AgileEAS.NET平台开发实例-药店系统-视频教程系列-索引一系列文章进行下载。
七、如何联系
我们为完善、改进和推广AgileEAS.NET而成立了敏捷软件工程实验室,是一家研究、推广和发展新技术,并致力于提供具有自主知识产权的业务基础平台软件,以及基于业务基础平台开发的管理软件的专业软件提供商。主要业务是为客户提供软件企业研发管理解决方案、企业管理软件开发,以及相关的技术支持,管理及技术咨询与培训业务。
AgileEAS.NET平台自2004年秋呱呱落地一来,我就一直在逐步完善和改进,也被应用于保险、医疗、电子商务、房地产、铁路、教育等多个应用,但一直都是以我个人在推广,2010年因为我辞职休息,我就想到把AgileEAS.NET推向市场,让更多的人使用。
我的技术团队成员都是合作多年的老朋友,因为这个平台是免费的,所以也没有什么收入,都是由程序员的那种理想与信念坚持,在此我感谢一起奋斗的朋友。
团队网站:http://www.agilelab.cn,
AgileEAS.NET网站:http://www.smarteas.net
官方博客:http://eastjade.cnblogs.com
QQ:47920381,AgileEAS.NET
QQ群:113723486(AgileEAS SOA 平台)/上限1000人
199463175(AgileEAS SOA 交流)/上限1000人
120661978(AgileEAS.NET 平台交流)/上限1000人
212867943(AgileEAS.NET研究)/上限500人
147168308(AgileEAS.NET应用)/上限500人
172060626(深度AgileEAS.NET平台)/上限500人
116773358(AgileEAS.NET 平台)/上限500人
125643764(AgileEAS.NET探讨)/上限500人
193486983(AgileEAS.NET 平台)/上限500人
邮件:james@agilelab.cn,mail.james@qq.com,
电话:18629261335。
链接
AgileEAS.NET平台开发指南-文章索引
AgileEAS.NET应用开发平台介绍-文章索引
AgileEAS.NET平台应用开发教程-案例计划
AgileEAS.NET平台开发Step By Step系列-药店系统-索引