分布式消息总线,基于.NET Socket Tcp的发布-订阅框架之离线支持,附代码下载

by 魏琼东 2014.8.21 11:24
一、分布式消息总线以及基于Socket的实现      在前面的分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载一文之中给大家分享和介绍了一个极其简单也非常容易上的基于.NET Socket Tcp 技术实现的分布消息总线,也是一个简单的发布订阅框架:     并且以案例的形式为大家演示了如何使用这个分布式消息总线架构发布订阅架构模式的应用程序,在得到各位同仁的反馈的同时,大家也非常想了解订阅者离线的情况,即支持离线构发布订阅框架。 二、离线架构      不同于订阅者、发布者都同时在线的情况,支持订阅者离线,架构将有所变化,如下图所示:      也会比原先的结构将更加复杂,其中需要处理以下两个关键点:      1)订阅者的持久化存储。      2)订阅者离线之后其所订阅消息的持久存储。 三、解决方案      为解决消息总线的离线支持机制,我们在Socket 框架之中增加了一个接口ISubscribeStorager: 1: using System; 2: using System.Collections.Generic; 3: using System.Linq; 4: using System.Text; 5:  6: namespace EAS.Messages 7: { 8: /// <summary> 9: /// 消息订阅存储接口。 10: /// </summary> 11: public interface ISubscribeStorager 12: { 13: /// <summary> 14: /// 持久化订阅。 15: /// </summary> 16: /// <param name="subscriber">订阅者。</param> 17: /// <param name="topic">消息主题。</param> 18: void Subscribe(string subscriber, string topic); 19:  20: /// <summary> 21: /// 持久化退订。 22: /// </summary> 23: /// <param name="subscriber">订阅者。</param> 24: /// <param name="topic">消息主题。</param> 25: void Unsubscribe(string subscriber, string topic); 26:  27: /// <summary> 28: /// 装载订阅信息。 29: /// </summary> 30: /// <returns>系统之中的订阅清单。</returns> 31: List<SubscribeItem> LoadSubscribes(); 32:  33: /// <summary> 34: /// 写入消息。 35: /// </summary> 36: /// <param name="subscriber">订阅者。</param> 37: /// <param name="message">消息对象。</param> 38: void Write(string subscriber, QueueMessage message); 39:  40: /// <summary> 41: /// 读消息。 42: /// </summary> 43: /// <param name="subscriber">订阅者。</param> 44: /// <param name="message">消息对象。</param> 45: /// <returns>成功读取返回true,否则返回false。</returns> 46: bool Read(string subscriber, out QueueMessage message); 47: } 48: }      ISubscribeStorager共提供持久化订阅持久化消息存储共五个函数,其中:      LoadSubscribes:服务端初始化时读取所有的离线订阅关系,即那个订阅都订阅那那个主题。      Subscribe:持久化订阅者,当订阅才上线订阅消息时,持久化订阅关系,供离线检测之用。      Unsubscribe:持久化取消订阅,当订阅者退订消息时,从持久化订阅关系之中删除。      Write:当订阅者离线时,把订阅消息写入持久化存储。      Read:当离线订阅者上线时,从持久存储之中读取一条消息向其发送。      ISubscribeStorager:可以选择自己实现这个接口,以建立满足自己规则的离线存储机制,当然在AgileEAS.NET SOA 中间件之中提供了两种离线存储机制,存储于数据库和存储于MSMQ,下面向大家介绍一下这两种内置实现。 四、两种内置离线存储机制      在AgileEAS.NET SOA 中间件平台之中提供了两个ISubscribeStorager的实现,基于数据库的离线订阅存储实现EAS.Messages.DbSubscribeStorager和基于MSMQ的离线订阅存储实现EAS.Messages.MsmqSubscribeStorager。      EAS.Messages.DbSubscribeStorager:存储订阅关系在messageSubscribe.Config文件之中,消息存储在关系数据库SOA_SUBSCRIBEEVENTS表之中,使用前必须要建立相应的表结构,以下是SQL Server的DDL脚本: 1: CREATE TABLE [SOA_SUBSCRIBEEVENT]( 2: [GUID] [varchar](36) NOT NULL, 3: [SUBSCRIBER] [nvarchar](128) NOT NULL, 4: [TOPIC] [nvarchar](128) NOT NULL, 5: [BODY] [image] NULL, 6: [FCTIME] [datetime] NOT NULL, 7: CONSTRAINT [PK_SOA_SUBSCRIBEEVENT] PRIMARY KEY CLUSTERED 8: ( 9: [GUID] ASC 10: ) 11: )       目前理论上支持SQLServer 、Mysql、ORACLE、Sqlite四种数据库结构,具体建表脚本请自行参考相应资料书写,也可以使用AgileEAS.NET SOA中间件所提供的数据库初始化工具创建。       EAS.Messages.MsmqSubscribeStorager:存储订阅关系在messageSubscribe.Config文件之中,消息存储Msmq消息队列之中,使用之前请确保机器上安装了MSMQ消息对列。 五、关于自定义实现ISubscribeStorager      有兴趣的朋友可以自定义实现接口ISubscribeStorager,这样就可以按自己的规则进行存储,比如把离线消息存储到mongodb、Redis、或者直接存储在文件之中,或者其他更多的实现规则,在此就不一一介绍,如有相关兴趣,请联系作者,如确有必要需要给在家介绍一下如何实现,将会另开一文本介绍如何自定义实现ISubscribeStorager接口。 六、改进在线例子支持离线      还是跟上次一样,以案例为在家展示一下怎么进行离线消息,就不重新开始例子,对原有例子做一些改进,改进后例子如下:      其中在原有项目的基础上增加了:Demo.Subscriber1和Demo.Subscriber2项目,其项目配置代码、配置文件基本上同Demo.Subscriber一样,其中唯一的差别在于,Demo.Subscriber1和Demo.Subscriber2向服务器提交订阅的时候都增加一个另friendName参数,其使用IMessageBus接口的以下订阅函数: 1: /// <summary> 2: /// 订阅消息。 3: /// </summary> 4: /// <param name="subscriber">订阅者。</param> 5: /// <param name="friendName">订阅者名称,用于处理离线订阅。</param> 6: /// <param name="topic">主题。</param> 7: /// <param name="notifyHandler">订阅通知。</param> 8: void Subscribe(object subscriber,string friendName ,string topic, MessageNotifyHandler notifyHandler);                 Demo.Publisher项目为发布者代码。                 Demo.Subscriber项目为订阅者代码。                 Demo.Server项目为服务端代码。      Demo.Subscriber1项目之中,其Program.cs代码如下: 1: using System; 2: using System.Collections.Generic; 3: using System.Linq; 4: using System.Windows.Forms; 5: using EAS.Messages; 6:  7: namespace Demo.Subscriber1 8: { 9: class Program 10: { 11: static void Main(string[] args) 12: { 13: var container = EAS.Objects.ContainerBuilder.BuilderDefault(); 14: var bus = container.GetComponentInstance("MessageBus") as IMessageBus; 15: System.Console.WriteLine("Subscriber1"); 16:  17: bus.Subscribe(new Program(), "Subscriber1", Demo.Messages.Topics.DEMO_TOPIC, MessageNotify); 18: System.Console.ReadLine(); 19: } 20:  21: static void MessageNotify(object m) 22: { 23: Demo.Messages.Message message = m as Demo.Messages.Message; 24: System.Console.WriteLine(string.Format("Subscribe:{0}", message.ID)); 25: } 26: } 27: }      其中bus.Subscribe(new Program(), "Subscriber1", Demo.Messages.Topics.DEMO_TOPIC, MessageNotify);在订阅消息的时候给了一个friendName为Subscriber1,Demo.Subscriber2与Demo.Subscriber1项目的唯一的差别就是此处为Subscriber2.      我们使用内置的EAS.Messages.DbSubscribeStorager,则不需要修改服务端的代码,只需要修改服务端的配置文件如下: 1: <?xml version="1.0" encoding="utf-8"?> 2: <configuration> 3: <configSections> 4: <section name="eas" type="EAS.ConfigHandler,EAS.MicroKernel" /> 5: </configSections> 6: <startup useLegacyV2RuntimeActivationPolicy="true"> 7: <supportedRuntime version="v4.0"/> 8: </startup> 9: <eas> 10: <objects> 11: <!--数据库连接--> 12: <object name="DbProvider" assembly="EAS.Data" type="EAS.Data.Access.SqlClientDbProvider" LifestyleType="Thread"> 13: <property name="ConnectionString" type="string" value="Data Source=.;Initial Catalog=eas_db;Integrated Security=SSPI;Connect Timeout=30" /> 14: </object> 15: <!--数据访问器--> 16: <object name="DataAccessor" assembly="EAS.Data" type="EAS.Data.Access.DataAccessor" LifestyleType="Thread"> 17: <property name="DbProvider" type="object" value="DbProvider"/> 18: <property name="Language" type="object" value="TSqlLanguage"/> 19: </object> 20: <!--ORM访问器--> 21: <object name="OrmAccessor" assembly="EAS.Data" type="EAS.Data.ORM.OrmAccessor" LifestyleType="Thread"> 22: <property name="DataAccessor" type="object" value="DataAccessor"/> 23: </object> 24: <!--查询语言--> 25: <object name="TSqlLanguage" assembly="EAS.Data" type="EAS.Data.Linq.TSqlLanguage" LifestyleType="Thread"/> 26: <!--消息持久化--> 27: <object name="SubscribeStorager" assembly="EAS.SOA.BootStrap" type="EAS.Messages.DbSubscribeStorager" LifestyleType="Singleton"/> 28: <!--日志管理--> 29: <object name="Logger" assembly="EAS.MicroKernel" type="EAS.Loggers.TextLogger" LifestyleType="Singleton"> 30: <property name="RootPath" type="string" value="G:\App.Work\Pub_Sub\Offline\Publish\logs" /> 31: </object> 32: </objects> 33: </eas> 34: </configuration>      在配置文件的IOC配置之中我们配置了消息存储对象以及其所依赖的数据库访问对象、Linq查询语言表达式,另外需要说明的是,我们需要把配置文件之中所涉及的EAS.Data.dll、EAS.SOA.BootStrap.dll复制到编译输出Publish,这两个文件可以从AgileEAS.NET SOA 中间件平台发布包之中寻找,本案例的下载压碎包之中会包括这两个文件。      有关于基于Msmq的配置,只需要修改配置文件如下: 1: <?xml version="1.0" encoding="utf-8"?> 2: <configuration> 3: <configSections> 4: <section name="eas" type="EAS.ConfigHandler,EAS.MicroKernel" /> 5: </configSections> 6: <startup useLegacyV2RuntimeActivationPolicy="true"> 7: <supportedRuntime version="v4.0"/> 8: </startup> 9: <eas> 10: <objects> 11: <!--消息持久化--> 12: <object name="SubscribeStorager" assembly="EAS.SOA.BootStrap" type="EAS.Messages.MsmqSubscribeStorager" LifestyleType="Singleton"/> 13: <!--日志管理--> 14: <object name="Logger" assembly="EAS.MicroKernel" type="EAS.Loggers.TextLogger" LifestyleType="Singleton"> 15: <property name="RootPath" type="string" value="G:\App.Work\Pub_Sub\Offline\Publish\logs" /> 16: </object> 17: </objects> 18: </eas> 19: </configuration>      到此为止,所有代码均已完成,是不是很简单,接下来,我们跑起来验证一下效果。 七、验证效果      我们在编译输入目录Publish下先启动Demo.Server.exe,再各启动Demo.Subscriber.exe、Demo.Subscriber1.exe、Demo.Subscriber2.exe,再启动一个Demo.Publisher.exe,在Demo.Publisher.exe控制台按回车键: 目前程序三个订阅者都是在线的,Demo.Publisher发布了三条消息,三个订阅者都收到了三条消息,那么我们关闭Demo.Subscriber2之后再由Demo.Publisher发布两条消息: 然后我们再启动Demo.Subscriber2,看是否还能收到其离线之后由Demo.Publisher发布的两条消息: OK,到此为止。 八、源代码下载      本程序的源代码已上传到服务器,请通过http://112.74.66.105/downloads/eas/Demo.Pub_Sub_Offline.rar进行下载,如果在开发过程之中想要了解更多有关Socket通信框架以及更多AgileEAS.NET SOA中间件平台的技术资源,请通过AgileEAS.NET SOA 网站:http://www.smarteas.net的最新下载栏目进行下载。   九、问题反馈      麻烦大家在通过视频进行学习的时候能及时把问题反馈给楼主,或者有什么需要改进的一些建议都请向楼主直接反馈,以下是联系方式: AgileEAS.NET SOA 网站: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人 邮件:james@agilelab.cn,mail.james@qq.com, 电话:18629261335。

Tags:

C# | ESB | Socket | 通信框架 | 消息中间件 | 中间件

分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载

by 魏琼东 2014.8.14 15:26
在很多MIS项目之中都有这样的需求,需要一个及时、高效的的通知机制,即比如当使用者A完成了任务X,就需要立即告知使用者B任务X已经完成,在通常的情况下,开发人中都是在使用者B所使用的程序之中写数据库轮循代码,这样就会产品一个很严重的两个问题,第一个问题是延迟,轮循机制要定时执行,必须会引起延迟,第二个问题是数据库压力过大,当进行高频度的轮循会生产大量的数据库查询,并且如果有大量的使用者进行轮循,那数据库的压力就更大了。 [更多...]

Tags:

.NET | C# | ESB | SOA | Socket | 消息中间件

零基础30分钟开启你的AgileEAS.NET SOA 中间件平台开发之旅

by 魏琼东 2014.4.25 11:20
接触AgileEAS.NET SOA 中间件平台(以下简称EAS.NET平台)有4个多月时间,经过试用认为可以把它作为一个开发的基础平台,开发团队可以把开发的重点放在需求的把控和项目的交付上,从而节省大量的时间,提高项目的开发、交付效率,降低对项目团队的深层技术要求,更重要的一点是EAS.NET平台的开发团队持续不断地维护和改进平台以及对反馈问题的快速反应,使我对平台的持续发展充满信心。

由于EAS.NET平台的资料比较多,需要花费较多的时间才能够初步了解平台并能够使用平台开始开发,所以,在此,我把学习EAS.NET平台的过程总结了一下,形成本篇短文,希望能够让初次接触EAS.NET平台的朋友能够用30分钟时间,跟着本文案例实际操作一遍,对EAS.NET平台有一个真实的体验,节省大家的时间,也算对EAS.NET平台的一点回报,希望有更多的人了解它的优势并真正用好它,为EAS.NET平台的使用者带来价值,也为EAS.NET平台的开发者带来效益,最终实现合作共赢的美好结局。 [更多...]

Tags:

.NET | C# | ESB | SOA | Socket | WCF | 三层架构 | 中间件 | 云计算 | 平台 | 应答 | 报表 | 权限 | 框架 | 模块 | 用户 | 负载均衡 | 通信框架

3小时搞定一个简单的MIS系统案例Northwind,有视频、有源代码下载、有真相

by 魏琼东 2014.4.14 14:09
一、瞎扯框架、架构      楼主自从1998年从C语言、MASM、Foxbase开始学计算机开始接触这个行当16年以来,2001年干第一份与程序、软件、然后是各种屌的东西开始,差不多干了13年了,这13年来,用过VF\VC\VB\C#搞过N多N多的项目,记得在2002年、2003年那个疯狂并且操蛋的年代,在整天VB代码与各种SQL、各种Bug、各种需求敲打、各种吐血的需求变更、各种大半夜还坐在医院的小板凳的加班与折磨之中,慢慢的学会去思考,他妈的这是为什么,写了程序那么的折磨人,从那时开始,就接触各种软件工程相关的东西,思考着是否可以发现能解决或者改变这种现关的东西,记得那个时间好像挺流行一本书,叫《银弹》,在那个年龄,也尝试对需求、变更进行控制和管理,但是在野蛮生长的中国软件业,用户这个上帝才是帮一位的,我们也尝试使用VB+COM/COM+进行加载和框架的提练,进行某些代码和架构级别的规范,试图使用那些技术去实现分布式架构的应用,以及通过插件机制去实现对需求的小范围控制,只是基于那些机制的先天不足和营养不良的环境,对项目与企业的现状改变不是多少。      在厌烦了VB开发之后,楼主也接触了Java,只是接触,没有做过多少开发,能大概看明白什么个意思,总体上来说,不是很喜欢基于Java开发,其中的原因第一是楼主在那个年代做的是CS类的MIS类应用,其实就是一直在做医疗行业的应用,Java做CS简直是弱爆了,再一个java IDE也直接太弱爆了,楼主是懒惰的一个人,不喜欢用记事本那种比较装的干法去写高深的代码。      2004年接触VS2003之后发现简直是找到了自己喜欢的东西了,VS2003配置.net1.1,也提供了简单的WebService和.NET Remoting技术,简直让以前在VB时候梦寐以求却难以搞定的机制就非常简单的实现了,.net所提供的反射机制可以实现很简单的插件开发,从那个时间起,楼主就写出了AgileEAS.NET SOA中间件平台的最初始版本,一个简单的winfrom插件平台。      从2004年到2014年,差不多快10年的时间,楼主也像所有的程序员一样,把AgileEAS.NET SOA当自己的宝贝一样的,升级、增加新的东西,早期关注各种IOC、各种AOP、各种ORM、各种通信等基础类的东西,2010年底专职从事咨询服务工具,为各种规模、各种业务的软件商提供框架定义、技术咨询服务、医疗行业业务咨询服务等服务。      也是自2011年之后对什么框架、什么架构、什么应用商店、各种云架构有了更简单的认识,整天没事扯架构、扯框架的人,或许压根就不知道什么是框架、什么是架构,架构、框架不是各种空泛的理论和各种看似华丽的词汇,架构或者框架、平台应该是一类能帮助开发人员、开发商提高效能的东西,好的框架一定是简单好用的,那怕是功能不是很强,也比较单一,但一定要好用,另外一个,框架或者架构一定要配合相应的工具,就比如.NET的种类库如果没有VS开发环境的配合,估计就是一堆废柴。      在很多人看来,能写框架、平台、架构的人都是牛人,实际上这是一个误导,写框架的人不一定是技术上的牛人,一个框架、平台、架构上没有什么多少高深的技术,比如做插件框架的,就一个简单的反射技术,相信一个C#程序员,用一周时间足够搞的很清楚了,再比如ORM框架,也没有什么高深的技术,动态拼接SQL加上动态反射创建实体,所以说从技术层面上来讲,写一个框架、类库不需要多少技术,因为这些东西都 是现成的并且可以你很容易找到。      但是一个好的框架或者平台,一定会有其配合很好的工具,比如对象建模工具、界面设计工具、文档生成工具、代码生成工具,以及相关的配置、管理、通信、监控工具,一个平台或者一个架构的生产力一方面体现在框架所提供的那引起基础类库所建立的规范,另一个很重要的原因是其配置工具所提供的快速开发能力是极其重要的,或者说一个框架是否能被应用的广泛,工具所带来的用处远远大于基础类库所提供的功能。      能写好一个优秀的框架并能提供大量、可用、好用的框架开发才不一定是技术上的牛人,但一定是对软件工程管理、企业软件生产组织模型或者某一业务领域的业务经验一定有其独到的理解,其框架之中所倾注的业务与软件工程管理经验才是框架作者最宝贵的财富,经验需要日积月累,可不是一天两天能练成的,不管在任何行业、经验都是非常值钱的东西。 二、3小时完成一个Northwind案例      在最近的一段时间之内,群里的好多朋友都希望我能给大家通过视频展示一下AgileEAS.NET SOA 中间件快速开发的相关技术,以便让更多的朋友学习和参考,但是一直忙于客户的各种项目、各种咨询服务以及家中的一些杂事,给大家拖了好久,拖的实在我都有点不好意思了,所以在上周做了一点准备,原本是想在原DrugShop的案例上进行,但是有朋友建议,在原项目基础上做,可以不一定让大家从头了解和从头开始学习、配置和如何从一个空白建立一个新的项目。      经过一些了解之后我们决定从SQLServer数据库所提供的案例Northwind基础上做一些简化和改动,为什么要使用Northwind案例呢,主要原因是其设计比较规范,了解和熟悉的人也非常的多,便于大于理解其业务需求。      楼主对Northwind做了一些简单的改进,主要是那方面的改进呢:        1)原来的Northwind主要重点再于客户和销售的管理,对采购入库业务处理的不是很好。        2)原来的Northwind对库存管理做的比较弱。        3)简化了原Northwind的客户、和销售管理,删除了对销售订单的区域等参数。        修改完成的Northwind主要提供了以下两大业务模型,采购入库业务:        销售订单业务:      Northwind的设计准备是前一天做好的,然后楼主通过YY为大家提供现场的快速开发培训,边讲角边做开发,从生成代码到第一个手工完成业务模块“商品分类”、“商品字典”、使用界面生成器生成了两个业务模块“员工管理”、“客户管理”,一直做到“采购入库”、“采购入库查询”、“库存查询”、“销售订单业务”一共8个模块,涉及数据查询、界面编辑、分层业务模型、输入字典、报表设计、检点控件挑战、输入焦点变色、文本输入验证等大量的工具、控件及相关技术,理论上已经完成了Northwind案例的所有业务,当然如果要完美的话可以增加“收支报表”、“销售订单查询”、以及界面的美化,界面验证的完善。      希望群里和各位朋友Northwind例没有完成的工具去做一做,把他做完,这一定是一个非常不错的项目模板,以下是几个做好的界面: 三、源代码、视频下载      在培训过程之中,楼主全程开启录相,录了大概。2.1G的高清视屏,目前已经全部上传在百度网盘和我们的服务器,源代码已经上传到我们的SVN服务器和下载服务器,请大家下载视频和源代码,视频时长4小时,请大家耐性观看。      视频下载地址,百度云:http://pan.baidu.com/s/1qW79ack      官网服务器:1.AgileEASNET SOA 5平台配置.avi                      2.AgileEAS.NET SOA 5元数据设计器.avi                      3.Northwind.WinForm案例.第1段.avi                      4.Northwind.WinForm案例.第2段.avi                      5.Northwind.WinForm案例.第3段.avi                      6.Northwind.WinForm案例.第4段.avi      源代码下载,源代码请通过AgileEAS.NET SOA 中间件平台官方网站下载,或者通过以下方式下载:      直接下载:AgileEAS.NET SOA  案例(Northwind)源码下载,http://112.74.66.105/downloads/eas/Northwind.rar。      SVN更新:https://112.74.66.105/svn/Northwind,登录用户:eas,密码eas. 四、问题反馈      麻烦大家在通过视频进行学习的时候能及时把问题反馈给楼主,或者有什么需要改进的一些建议都请向楼主直接反馈,以下是联系方式: AgileEAS.NET SOA 网站: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人 邮件:james@agilelab.cn,mail.james@qq.com, 电话:18629261335。      另外,楼主将会不定期的通过YY举办类似本次活动的培训,所以麻烦大家都关注一下YY频道:65011880,也可以加一下楼主YY号:537601972。

Tags:

SOA | ActiveX | AgileEAS.NET | 三层架构 | C# | AppServer | 角色 | 设计模式 | 通信框架 | 框架

AgileEAS.NET SOA中间件平台简易入门,除加小案例下载

by 魏琼东 2014.1.15 11:25
本入门例子由网友狗头军师提供,感谢他的努力,以下是转自CSDN的原地址:http://blog.csdn.net/xueshaoyu/article/details/18304647?reload 首先说明此平台来自魏琼东大神,可被商业使用,但是不开源的哈。 AgileEAS.NET SOA中间件平台 下载 闲话少说,直接步入正题。 一、数据库的配置打开\agileeas.net.5.0\bin\dotnet\目录下的EAS.DbInitializer.exe文件进行数据连接配置如图。 点击下一步 点击完成,弹出的框选择是(如果原来数据库中有重要数据,记得先备份一下,以免失策…)。,数据库配置完成。 二、插件开发:打开\agileeas.net.5.0\bin\dotnet\目录下的EAS.OrmDesigner文件: ,配置解决方案如图: 打开刚才生成的工程文件。 可能需要引用两个文件(EAS.DATA, EAS.MicroKernel,在bin目录下找到并引用它), 基本的增删改查已经被封装好,下面我们编写界面                    这三个控件应该都了解撒,里面的逻辑代码,随后的附件中有。 Main.cs里面有最关键的两个特性: 完成之后,点击生成,ok,插件搞定。 三、插件安装: 运行\agileeas.net.5.0\bin\dotnet目录下的EAS.WinClient.Start.exe 账号Administrator,密码sa,注意大小写 登陆进去后,系统管理-〉模块管理-〉安装,选择刚才项目生成的程序集 点击安装,安装完成。在列表中查看 找到刚才安装的模块,右键-〉打开 。 整个插件开发搞定(后附源码),第一次写教程,如有不足,敬请谅解,如有不明之处,欢迎留言。 Demo源码下载

Tags:

.NET | AgileEAS.NET | BI | C# | ESB | NLB | SOA | WCF | 三层架构 | 平台 | 消息中间件 | 框架

犀利的功能权限系统,AgileEAS.NET SOA中间件平台按钮级权限实践

by 魏琼东 2013.12.18 22:29
一、前言      AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台。用于帮助中小型软件企业建立一条适合市场快速变化的开发团队,以达到节省开发成本、缩短开发时间,快速适应市场变化的目的。      AgileEAS.NET SOA中间件平台提供了敏捷快速开发软件工程的最佳实践,通过提供大量的基础支撑功能如IOC、ORM、SOA、分布式体系及敏捷并发开发方法所支撑的插件开发体系,以及提供了大量的实体、数据模型设计生成工具、代码生成工具,用于帮助中小软件开发商快速成长。      AgileEAS.NET平台充分把握目前软件行业快速发展的新趋势,基于敏捷并行开发、快速适应市场这样淳朴的软件工程实践,采用业界广泛使用的Microsoft .Net构件(组件)开发技术实践了这种开发思想,帮助软件企业实现“敏捷变化、快速适合”的目标,从而帮助软件企业在激烈的市场竞争中赢得先机并获得更高的回报。 二、关于按钮级权限      在AgileEAS.NET SOA5.0版本之中,AgileEAS.NET SOA平台仅提供了基于模块的权限管理体系,也没有提供按钮/子功能级别的权限控制体系。      有很多很多的使用者基于AgileEAS.NET SOA 中间件平台进行应用开发的过程之中都提到这个问题,我们也给大家提供了一些解决思路和方案,但是一直没有在平台之中集成和实现一套标准的按钮/子功能权限管理功能和标准的API。      在AgileEAS.NET SOA5.0版本发布之前我们实现一套按钮/子功能级别的权限控制体系,提供了一个用于实现按钮级权限管理功能的管理模块及一给API接口。 三、按钮级权限管理      在AgileEAS.NET SOA5.0版本之中,AgileEAS.NET SOA平台仅提供了基于模块的权限管理体系,也没有提供按钮/子功能级别的权限控制体系。      使用管理员登录AgileEAS.NET SOA平台WinClient容器,就会在系统管理导航组之中看到有一个“函数管理”模块:      列表之中是所有的按钮权限项目,存储在模块信息表之中,如果需要增加一个新的“按钮/函数/权限项目”,使用添加功能,打开添加界面:      以上界面的操作会增加一个名称为“药品字典打印”字的按钮级别的权限,其权限ID为“6a185217-34de-4fe7-9ed5-c2cc49ba432c”。      双击选中的按钮级别的权限项,会打开“函数属性”对话框可以针对此函数/权限项进行授权:        授权方式同模块级权限一模一样,你也可以通过账号管理和角色管理模块进行授权。 四、API及如何使用      光提供一个管理功能还是不够的,还必须要提供一组API以供开发人员使用,AgileEAS.NET SOA中间件平台在应用程序对象(EAS.Application类的单例对象EAS.Application.Instance)上定义一个验证权限的API: 1: // 2: // 摘要: 3: // 验证权限,验证当前系统登录人员是否具有某个构件的访问权限。 4: // 5: // 参数: 6: // component: 7: // 构件Guid。 8: // 9: // 返回结果: 10: // 验证通过返回True,否则返回False。 11: bool Demand(Guid component);      Demand方法需要传入按钮级别权限项/函数的定义ID,其他由交由平台完成。      接下来我们在DrugShop案例案例之中的药品字典模块之中增加对“打印”按钮的权限控制,Visual Studio打开DrugShop解决方案打开“药品字典”模块插件的代码文件DrugDictList.cs,修改打印按钮的事件如下: 1: private void tsbPrint_Click(object sender, EventArgs e) 2: { 3: //验证按钮级别权限。 4: if (!EAS.Application.Instance.Demand(new Guid("6a185217-34de-4fe7-9ed5-c2cc49ba432c"))) 5: return; 6:  7: if (this.dictList != null) 8: { 9: EAS.GReport.Controls.PrintViewDialog ViewDialog = new EAS.GReport.Controls.PrintViewDialog(); 10: ViewDialog.ReportID = new Guid("F29C4C91-0791-4116-BE26-3A2A88F30A2A"); 11: ViewDialog.DataObject = this.dictList; 12: ViewDialog.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; 13: ViewDialog.WindowState = System.Windows.Forms.FormWindowState.Maximized; 14: ViewDialog.ShowDialog(); 15: } 16: }      这样就完成了对本权限项的调用验证。 四、执行验证      我们编译并且启动DrugShop.Main.exe,使用0001密码sa登录,打开“药品字典”模块,查询数据之后点击“打印”按钮:      0001不具有这个按钮级权限项的权限,所以会提供没有权限,我们换0002登录并且执行同样的操作:      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。

Tags:

C# | ORM | SOA | .NET | 中间件 | 分布式 | 消息中间件 | 权限 | 模块 | 账号 | 用户 | 角色

犀利的报表系统2,为项目实施人员、维护人员提供的强大自定义报表系统,AgileEAS.NET SOA中间件平台动态报表系统使用指南

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。

Tags:

.NET | BI | AgileEAS.NET | ActiveX | C# | ORM | SAAS | SOA | 中间件 | 云计算 | 分布式 | 框架 | 报表 | 消息中间件

犀利的报表系统,AgileEAS.NET SOA中间件平台GReport使用指南

by 魏琼东 2013.12.18 17:43
一、前言      AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台。用于帮助中小型软件企业建立一条适合市场快速变化的开发团队,以达到节省开发成本、缩短开发时间,快速适应市场变化的目的。      AgileEAS.NET SOA中间件平台提供了敏捷快速开发软件工程的最佳实践,通过提供大量的基础支撑功能如IOC、ORM、SOA、分布式体系及敏捷并发开发方法所支撑的插件开发体系,以及提供了大量的实体、数据模型设计生成工具、代码生成工具,用于帮助中小软件开发商快速成长。      AgileEAS.NET平台充分把握目前软件行业快速发展的新趋势,基于敏捷并行开发、快速适应市场这样淳朴的软件工程实践,采用业界广泛使用的Microsoft .Net构件(组件)开发技术实践了这种开发思想,帮助软件企业实现“敏捷变化、快速适合”的目标,从而帮助软件企业在激烈的市场竞争中赢得先机并获得更高的回报。 二、关于GReport、Grid++报表系统      AgileEAS.NET SOA中间件平台目前集成两套优秀的报表系统,一套是开源的fyireporting报表系统3.96版本,其始于2007年AgileEAS.NET SOA中间件平台3.0版本之时就集成入平台的一套报表系统,其快速方便的条带式报表非常适合用于MIS系统的报表展示,我们在fyireporting基础上做了大是的汉化、改动并且与AgileEAS.NET SOA中间件平台进行紧密的集成。      但是对于市场在国内的大多数软件企业都会遇到客户的很多近似于变态的报表需求,fyireporting有也其不足的地方,其在处理中国式的票据、和一个特殊报表时无能无为,之后我们考虑集成一套更好的中国式报表系统,在和几家行业医疗供应商合作的两个年头之中,我们集成广州锐浪的Grid++报表系统并与AgileEAS.NET SOA中间件进行融合,称之为GReport。      AgileEAS.NET SOA中间件平台的报表管理体系并设计为集中式的报表管理、设计与报表浏览、打印相协调的可集中管理的报表体系,极大的简化和方便报表的开发、部署和管理。      在AgileEAS.NET中间件平台之中提供了一个用于管理、和设计GRport的功能模块“GR报表”:      系统之中的所有报表都是可管理的,当在系统的任何一个客户端修改了报表定义之后,不需要重新部署程序,即可让报表的修改通过所有的使用者。即时生效。      在GR报表模块之中,直接双击选中的报表即可进行报表设计界面,进行报表的设计:      GR报表的设计器界面是基于Grid++报表所提供的设计器控件实现的,其使用方法同Grid++原始的报表设计工作,具体的使用方法请参考Grid++官方帮助。      本设计器与官方的原生设计器之间的差别主要是新建报表与原生不同,原生的报表系统只能基于数据库连接和SQL语句创建报表,而本设计器提供了除通过书写SQL创建报表(不用提供连接信息,以当前连接为准)之外还提供了基于AgileEAS.NET SOA中间件平台的ORM实体创建报表:        数据报表即为基于SQL语句创建报表,对象报表基于ORM实体对象创建报表:      当基于实体创建报表时确定报表对应的实体对象之后,系统会自动的从ORM定义信息之中读出实体的属性定义信息并且自动的转换为报表的数据列。 三、GReport组件      AgileEAS.NET SOA中间件平台为开发人员提供了三个有关于GReport报表的控件,包括打印预览对话框、报表数据显示控件、报表打印控件,这三个控件都由EAS.GReport.Controls.dll程序集承载,使用这三个组件之前都需要先引用EAS.GReport.Controls.dll程序集或者把这三个组件加载到Visual Studio的工具箱之中。      打印预览对话框: EAS.GReport.Controls.PrintViewDialog,用于打开一个新的窗口并且预览打印报表。      报表查询显示控件: EAS.GReport.Controls.GDisplayViewer,以查询模式显示报表及报表数据的一个控件。      报表预览显示控件: EAS.GReport.Controls.GPrintViewer,以打印模式显示报表及报表数据的一个控件。      以上三个控件都提供相同的报表API: 1: // 2: // 摘要: 3: // 报表ID。 4: [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 5: [Browsable(false)] 6: public Guid ReportID { get; set; }      属性ReportID:其意思为报表ID,其取值为GR报表模块之中设计好的报表ID号,用于实现与系统报表管理的绑定。 1: // 2: // 摘要: 3: // 数据源对象。 4: [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 5: [Browsable(false)] 6: public object DataObject { get; set; }      属性DataObject:其意义为报表的数据对象,即控件要显示或者打印的数据源,DataObject的值必须为DataTable或者为ORM实体的List<T>集合。      程序之中调用报表的流程即为设计这两个属性即可,首先设计ReportID为要显示、打印的报表ID,然后向控件设置报表的显示数据源DataObject即可完成对报表系统的调用。 四、报表开发实例      我们下面以DrugShop案例之中的药品字典模块的字打印实例如何进行GReport报表开发:      首先我们需要在GR报表模块之中增加一个名称为“药品字典明细报表”的报表项目。      报表名称必须要填写并且不能重名,别名可以选择填写,缓存间隔默认为15分种,最小1分种,自由设定,原则上在系统开发测试阶段设小一些,在稳定运行阶段设大一些。      其他参数,如“报表模块,把报表做为独立模块发布”、查询语句、查询参数可以不去理会,这些参数为动态报表提供,关于动态报表我们会在后面的文章之中进行专门的介绍。      然后我们点“确定”按钮保存报表进行下一步的报表设计工作。      双击我们刚才添加的“药品字典明细报表”进入报表设计界面,我们可以看到这是一个空报表:      选择“文件”菜单之中的“新建”=》“对象报表”:        切换到数据定义Tab页,进行实体类型的选择:      我们浏览选择程序集DrugShop.Entitties.dll,然后在对象下拉列表框中选择DrugShop.Entitties.PIn,即药品入库ORM对象,我们基于DrugShop.Entitties.PIn创建报表,点击“确定”完成报表的新建。      系统会自动的更具新建导向生成一个初始报表,如果需要对报表的显示、格式进行调用,请参考Grid++设计手册进行学习。      修改完成之后,点击“保存”图标、或者“文件=》保存”菜单项保存报表的格式定义,这样就完成了报表的定义。      接下来我们需要把刚才定义、设计好的报表挂在程序之中,使用Visual Studio 打开DrugShop解决方案,打开DrugShop.WinUI项目之中的药品字典模块DrugDictList.cs:      双击“打印”按钮写以下打印代码: 1: private void tsbPrint_Click(object sender, EventArgs e) 2: { 3: if (this.dictList != null) 4: { 5: EAS.GReport.Controls.PrintViewDialog ViewDialog = new EAS.GReport.Controls.PrintViewDialog(); 6: ViewDialog.ReportID = new Guid("F29C4C91-0791-4116-BE26-3A2A88F30A2A"); 7: ViewDialog.DataObject = this.dictList; 8: ViewDialog.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; 9: ViewDialog.WindowState = System.Windows.Forms.FormWindowState.Maximized; 10: ViewDialog.ShowDialog(); 11: } 12: }      这样我们就完成了对报表的调用,另外,在DrugShop案例之中,药品入库查询和药品销售查询两个模块之中分别使用了GReport报表,请大家在开发过程之中参考。 五、执行验证      我们编译并且启动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。

Tags:

.NET | AgileEAS.NET | C# | ORM | SOA | Socket | 分布式 | 企业服务总线 | 企业应用架构 | 框架 | 消息中间件 | 通信框架 | 报表 | BI

MIS系统开发利器,快速的字典录入解决方案,另类的、可管理的.NET DataWindow

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。

Tags:

.NET | AgileEAS.NET | C# | ESB | ORM | SAAS | SOA | Socket | 中间件 | 云计算 | 分布式 | 消息中间件 | 框架

基于AgileEAS.NET SOA 平台SAAS架构技术的开源分销ERP系统-SmartERP.NET下载配置说明

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。

Tags:

.NET | ActiveX | AgileEAS.NET | ESB | C# | ORM | SOA | SAAS | 中间件 | 分布式 | 企业应用架构 | 企业服务总线 | 框架 | 消息中间件

最新评论

声明

本博所有网友评论不代表本博立场,版权归其作者所有。

© Copyright 2011