分布式消息总线,基于.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 | 三层架构 | 中间件 | 云计算 | 平台 | 应答 | 报表 | 权限 | 框架 | 模块 | 用户 | 负载均衡 | 通信框架

拉风的应用程序服务器监控工具,随便掌握服务器动态,AgileEAS.NET SOA 中间件应用程序服务器监控工具集介绍

by 魏琼东 2013.12.19 21:55
一、前言      AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台。用于帮助中小型软件企业建立一条适合市场快速变化的开发团队,以达到节省开发成本、缩短开发时间,快速适应市场变化的目的。      AgileEAS.NET SOA中间件平台提供了敏捷快速开发软件工程的最佳实践,通过提供大量的基础支撑功能如IOC、ORM、SOA、分布式体系及敏捷并发开发方法所支撑的插件开发体系,以及提供了大量的实体、数据模型设计生成工具、代码生成工具,用于帮助中小软件开发商快速成长。      AgileEAS.NET平台充分把握目前软件行业快速发展的新趋势,基于敏捷并行开发、快速适应市场这样淳朴的软件工程实践,采用业界广泛使用的Microsoft .Net构件(组件)开发技术实践了这种开发思想,帮助软件企业实现“敏捷变化、快速适合”的目标,从而帮助软件企业在激烈的市场竞争中赢得先机并获得更高的回报。 二、AgileEAS.NET SOA中间件的分布式结构      AgileEAS.NET SOA中间件平台吸吸引人的一个特色就是其分布式架构体系,其可以基于高层的WCF协议和底层的.NET Socket通信建设统一一致的分布式通信服务,如下图所示的分布式结构:        系统中所有的客户端业务处理请求都经由AppServer处理之后返回结果给客户端,这个一个极其经典的SOA架构的分布式结构。      当系统的业务运行量大到一台AppServer无法满足情况下,那么我们就要考虑纵向扩展或者横向扩展以满足系统性能和业务响应的问题,最常用的选择是横向扩展,使用负载均衡机制以确保业务请求由多台AppServer完成;以及对系统的可靠性要求很高的时候,因为只有一台AppServer如果AppServer宕机了,那么整个系统都无法运行。我们就必须的考虑整个系统的故障切换能力,以确定系统的高可用性,系统的架构就会衍生为以下结构:      可以对比发布,前面架构图之中的AppServer已经由一台NlbServer和多台AppServer组成的服务器组合替换,系统之中不再存在当AppServer宕机之后系统无法服务的问题,也解决了随着业务量增加动态扩容的问题。 三、AgileEAS.NET SOA平台服务监控工具      为了方便系统维护人员,我们为AgileEAS.NET SOA中间件平台应用程序服务AppServer和负载均衡服务NlbServer提供了强大的可视化远程监控工具,让系统维护人员可以方便的通过远程监控工作进行监控。      应用程序服务监控工具为EAS.SOA.Monitor.exe应用程序:      其主要提供以下监控参数:      服务器资源监控:服务器CPU、内存、磁盘读取、网络通信等重要的服务器资料的实时监控及历史监控曲线图,如上图。      Socket服务监控:监控AppServer的Socket通信服务参数的各种状态,包括并发连接数、数据发送和接收速度:      WCF服务监控:监控AppServer的WCF通信服务参数的各种状态,包括实时服务调用、最大并发、服务实例、累计服务调用次数等:      应用服务监控,监控AgileEAS.NET SOA服务的并发调用和累计调用:     负载均衡服务监控工具为EAS.NLB.Monitor.exe应用程序:      其提供的监控功能和监控参数同应用程序服务监控工作提供的类型,都提供了服务器资源监控、WCF服务监控、Socket通信监控,不一样的是负载均衡服务提供了对负载简单应用程序服务器的状态监控: 四、如何操作服务监控      不管是应用程序服务监控还是负载均衡服务监控,启动监控程序之前都需要使用监控客户端连接到用程序服务或者负载均衡服务。          初始的监控程序需要通过服务连接登录界面新建一个服务监控连接,弹出新建连接对话框:     监控连接参数主要由服务器的IP地址及所开放的端口决定,WCF或者Socket,应用程序服务监控工作提供WCF和Socket的连接,而负载均衡服务监控仅提供WCF形式的连接。     当创建好监控连接之后,下一次使用的时候就不需要再次配置监控连接信息了,只需要在服务连接下拉列表框中选择合适的的连接信息即可:     我们计划为监控程序提供一个动态的连接密钥或者证书验证机制,以便阻止非授权的监控连接请求,但是目前还没有启动连接密钥或者安全证书,在稍后的不久我们将会为大家提供这方面的功能。 五、联系我们      为完善、改进和推广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。

如何使用Lua脚本语言开发出高扩展性的系统,AgileEAS.NET SOA中间件平台Lua脚本引擎介绍

by 魏琼东 2013.12.19 11:38
一、前言      AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台。用于帮助中小型软件企业建立一条适合市场快速变化的开发团队,以达到节省开发成本、缩短开发时间,快速适应市场变化的目的。      AgileEAS.NET SOA中间件平台提供了敏捷快速开发软件工程的最佳实践,通过提供大量的基础支撑功能如IOC、ORM、SOA、分布式体系及敏捷并发开发方法所支撑的插件开发体系,以及提供了大量的实体、数据模型设计生成工具、代码生成工具,用于帮助中小软件开发商快速成长。      AgileEAS.NET平台充分把握目前软件行业快速发展的新趋势,基于敏捷并行开发、快速适应市场这样淳朴的软件工程实践,采用业界广泛使用的Microsoft .Net构件(组件)开发技术实践了这种开发思想,帮助软件企业实现“敏捷变化、快速适合”的目标,从而帮助软件企业在激烈的市场竞争中赢得先机并获得更高的回报。 二、关于Lua语言      Lua 是一个小巧的脚本语言。是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo所组成并于1993年开发。 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。      Lua语言目前应用最广泛的领域是游戏编程领域,最早接触和认识Lua也是因为在2008年玩金山的剑网3,通过解包读过其中的一些游戏脚本,慢慢也看过一些其他游戏的Lua脚本,在我们开发自己的电子病历系统的过程之中,引入了Lua脚本语言实现那些可变性非常高的场景。     .NET通过LuaInterface开源项目类库实现对Lua的脚本调用以及Lua与C#的相互绑定,有关于这此方面的内容请大家搜索相关文章以获得帮助。      在AgileEAS.NET SOA5.0版本之中,我们决定把在开发过程之中形成的Lua脚本引擎一并集成入AgileEAS.NET SOA中间件平台,目前Lua脚本语言被我们广泛的应用电子病历系统这中的病案自动评分、短信系统之中的交互式应答、和一些计划任系统之中的计划任务定义。 三、AgileEAS.NET SOA平台Lua引擎      AgileEAS.NET SOA5.0平台目前使用的是Lua5.1版本,使用LuaInterface实现C#与Lua的相互绑定处理,平台已经对其进行了二次封装以提供统一的API支持,目前由EAS.LuaScript.dll程序集承载所有业务。      AgileEAS.NET SOA平台Lua引擎提供了以下接口或类型的API:      ILuaEngine,定义为一个Lua脚本引擎: 1: using System; 2:  3: namespace EAS.LuaScript 4: { 5: /// <summary> 6: /// Lua脚本解析引擎。 7: /// </summary> 8: /// <remarks> 9: /// 用于完成程序之中嵌入的动态Lua脚本,Lua脚本在AgileEAS.NET SOA 中间件之中主要用于环境的各种参数的动态解析处理之中。 10: /// </remarks> 11: public interface ILuaEngine:IDisposable 12: { 13: /// <summary> 14: /// 脚本路径。 15: /// </summary> 16: string ScriptDirectory 17: { 18: get; 19: set; 20: } 21:  22: /// <summary> 23: /// 输出重定向方法/用于调试。 24: /// </summary> 25: Action<object> OutAction 26: { 27: get; 28: set; 29: } 30:  31: /// <summary> 32: /// 注册lua函数,实现Lua绑定。 33: /// </summary> 34: /// <param name="luaAPIClass">lua函数类</param> 35: void BindLuaFunctions(object luaAPIClass); 36:  37: /// <summary> 38: /// 执行lua脚本文件。 39: /// </summary> 40: /// <param name="luaFileName">脚本文件名。</param> 41: /// <returns>lua脚本执行结果。</returns> 42: object[] DoFile(string luaFileName); 43:  44: /// <summary> 45: /// 执行lua脚本文本。 46: /// </summary> 47: /// <param name="chunk">lua指令。</param> 48: /// <returns>lua脚本执行结果。</returns> 49: object[] DoString(string chunk); 50:  51: /// <summary> 52: /// 调用Lua函数。 53: /// </summary> 54: /// <param name="luaFunction">函数名称。</param> 55: /// <param name="args">调用参数。</param> 56: /// <returns>lua脚本执行结果。</returns> 57: object[] Invoke(string luaFunction, params object[] args); 58: } 59: }      其中脚本路径ScriptDirectory指示Lua脚本文件的存储位置,在DoFile执行脚本文过程之中如果传入为相关路径则可以自动在ScriptDirectory之中寻址,ScriptDirectory默认为当前程序目录。      DoFile:执行脚本文件并且返回执行结果。      DoString:执行脚本代码并且返回执行结果。      Invoke:执行指定的脚本函数。       LuaFunctionAttribute,Lua脚本函数特性: 1: using System; 2: using System.Collections.Generic; 3: using System.Linq; 4: using System.Text; 5:  6: namespace EAS.LuaScript 7: { 8: /// <summary> 9: /// Lua函数描述特性。 10: /// </summary> 11: /// <remarks> 12: /// 用于标记Lua接口方法。 13: /// </remarks> 14: [AttributeUsage(AttributeTargets.Method, 15: Inherited = false, AllowMultiple = false)] 16: [Serializable] 17: public class LuaFunctionAttribute : Attribute 18: { 19: /// <summary> 20: /// 初始化LuaFunctionAttribute对象实例。 21: /// </summary> 22: /// <param name="name">函数名称。</param> 23: public LuaFunctionAttribute(string name) 24: : this(name, string.Empty) 25: { 26:  27: } 28:  29: /// <summary> 30: /// 初始化LuaFunctionAttribute对象实例。 31: /// </summary> 32: /// <param name="name">函数名称。</param> 33: /// <param name="description">函数描述。</param> 34: public LuaFunctionAttribute(string name, string description) 35: : this(name, description,null) 36: { 37:  38: } 39:  40: /// <summary> 41: /// 初始化LuaFunctionAttribute对象实例。 42: /// </summary> 43: /// <param name="name">函数名称。</param> 44: /// <param name="description">函数描述。</param> 45: /// <param name="funcParams">参数说明。</param> 46: public LuaFunctionAttribute(string name, string description, params string[] funcParams) 47: { 48: this.Name = name; 49: this.Description = description; 50: this.Params = funcParams; 51: } 52:  53: /// <summary> 54: /// 函数名称。 55: /// </summary> 56: public string Name 57: { 58: get; 59: internal set; 60: } 61:  62: /// <summary> 63: /// 函数描述。 64: /// </summary> 65: public string Description 66: { 67: get; 68: internal set; 69: } 70:  71: /// <summary> 72: /// 参数说明。 73: /// </summary> 74: public string[] Params 75: { 76: get; 77: internal set; 78: } 79: } 80: }      用于C#向Lua暴露函数接口,实现C#方法与Lua脚本函数的绑定,也可以实现为把C#的方法暴露给Lua脚本调用,如以下代码: 1: /// <summary> 2: /// 执行指定的非查询命令。 3: /// </summary> 4: /// <param name="commandText">要执行的命令语句。该语句必须是标准的数据库语句。</param> 5: /// <returns>返回命令影响的行数。</returns> 6: [LuaFunction("ExecuteSql", "执行指定的非查询命令,返回执行所影响的行数。", "要执行的SQL语句")] 7: public int Execute(string commandText) 8: { 9: IDataAccessor da = this.GetComponent(); 10: if (da != null) 11: { 12: return da.Execute(commandText); 13: } 14: else 15: { 16: return -1; 17: } 18: }      其目标早实现C#方法Execute与Lua脚本函数ExecuteSql之间的绑定,当在Lua教本之中调用ExecuteSql,即会执行Execute方法。      LuaFramework,Lua框架,为Lua脚本引用最重要的API: 1: #region 程序集 EAS.LuaScript.dll, v4.0.30319 2: // G:\Health.Work\AgileEMR4.0\Publish\EAS.LuaScript.dll 3: #endregion 4:  5: using System; 6:  7: namespace EAS.LuaScript 8: { 9: // 摘要: 10: // Lua脚本执行框架/上下文。 11: // 12: // 备注: 13: // 应用系统之中调用Lua脚本的入口。 14: public sealed class LuaFramework 15: { 16: // 摘要: 17: // LuaFramework对象的唯一实例。 18: public static LuaFramework Instance { get; } 19:  20: // 摘要: 21: // 注册lua函数,实现Lua绑定。 22: // 23: // 参数: 24: // luaAPIClass: 25: // lua函数类 26: public static void BindLuaFunctions(object luaAPIClass); 27: // 28: // 摘要: 29: // 从应用程序上下文环境之中获取指定名称的对象实例。 30: // 31: // 参数: 32: // componentKey: 33: // 组件名称。 34: // 35: // 返回结果: 36: // 对象实例。 37: public object GetComponent(string componentKey); 38: // 39: // 摘要: 40: // Lua脚本引擎。 41: public static ILuaEngine GetLuaEngine(); 42: // 43: // 摘要: 44: // Lua脚本引擎。 45: public static ILuaEngine GetLuaEngine(string scriptDirectory); 46: // 47: // 摘要: 48: // 取系统时间。 49: [LuaFunction("GetTime", "取系统时间")] 50: public DateTime GetTime(); 51: } 52: }      其中BindLuaFunctions方法实现C#方法与Lua函数的绑定注册,调用时传入需要注册方法所在的C#类对象实例即可。      GetLuaEngine获取一个ILuaEngine,为之后的执行脚本作准备,调用GetLuaEngine可选传入scriptDirectory参数,scriptDirectory为Lua脚本存储目录。      AgileEAS.NET SOA中间件已经为大家提供了少数的几个预定义API绑定: 1: helpcmd(cmdName) - Show help for a given command or package 2: help() - List available commands. 3: Include(luaFileName) - 预加载指定的脚本文件 4: echo(message) - 显示Lua调试信息,用于Lua的动态调试。 5: Echo(message) - 显示Lua调试信息,用于Lua的动态调试。 6: WriteLog(message) - 写日志记录,用于Lua脚本的动态调试。 7: GetTime() - 取系统时间 8: GetComponent(componentKey) - 从应用程序上下文环境之中获取指定名称的对象实例 9: GetAccount() - 求当前账户信息 10: ExecuteSql(commandText) - 执行指定的非查询命令,返回执行所影响的行数。 11: QuerySql(commandText, resultType) - 执行给定的数据库查询命令,返回执行结果,返回结果由resultType参数决定。 12: QuerySqlScalar(commandText) - 执行给定的数据库查询命令,仅返回第一行第一列结果 13: QuerySqlMatrix(commandText) - 执行给定的数据库查询命令,返回第一个查询结果Matrix 14: QuerySqlDictionary(commandText) - 执行给定的数据库查询命令,返回第一行的Key-Value 15: QuerySqlList(commandText) - 执行给定的数据库查询命令,返回第一行的Key-Value 16: QuerySqlDataSet(commandText) - 执行给定的数据库查询命令,返回查询结果集 17: QuerySqlDataTable(commandText) - 执行给定的数据库查询命令,返回查询结果集的第一个DataTable 18: GetDataSet() - 求当前系统的帐套信息      大家也可以基于AgileEAS.NET SOA 平台Lua引擎扩展自己的LuaAPI。 四、AgileEAS.NET SOA平台Lua引擎应用案例      在我12年的医疗行业开发之中,做过多年的电子病历,开发、指导开发过多套电子病历系统,在电子病历系统之中,有以下几个问题一直得不到好的解决方案:      在电子病历质控之中有一个自动质控评分,其由程序自动的预先为某个病案打出一个得分:      在没有使用Lua教本之前呢,也是能实现这种自动评分,但是为了实现这样的功能,系统设计之中就会要增加一些辅助的表和大量的辅助设计以帮助完成这样的功能,因为毕竟不存在统一的评分规则,所以这个设计会极其的复杂,以致于很难把这样的功能做好,或者说在成本和效益估量之中,得不偿失。      另外还有比较简单的例子就是电子病历之间的宏替换问题,在书写电子病历的过程之中需要动态的插入如病人基本信息、医院名称这样的东西进入病历,但是因为其数据源并不是唯一确定的,如果不使用动态脚本设计,那么其程序这中就会存在大量的硬编码,并且如果想要在后期实施阶段增加宏,那么则必须要修改程序才能完成。      下面我们就以自动评分案例向大家讲解一下是如何实现功能的呢:      首先,系统之中必须管理和维护用于自动评分的所有评分规则:      这里与其他很多开发者的做法不一样的是,对于每个缺陷项目,我们都为其提供了一个评分规则的脚本的设计,例如对于缺陷“*缺入院记录”的评分脚本如下: 1: ----------------------------------------------------------------------------------------------- 2: -- 创建人 : 魏琼东 3: -- 创建时间 : 2013-09-05 4: -- 效果备注 : *缺入院记录评分脚本。 5: -- GetErrorNumber,求缺陷数量,由脚本计算出本缺陷数量 6: ---------------------------------------------------------------------------------------------- 7: ------------------------不怎么华丽的分割线-------------------------------------- 8: function GetErrorNumber(patient,errorItem) 9:  10: --调用C#,求监控项目 11: local monitorItem = GetMonitorItem("B01") 12: --监控表达式,无表达式返回0 13: local script = monitorItem.Expression 14: if script == nil then 15: return 0 16: elseif script == "" then 17: return 0 18: end 19: 20: --加载监控脚本 21: ExecuteScript(script) 22: --执行监控函数NeedWrite,如果需要写则预标存在此缺陷 23: local need = NeedWrite(patient,monitorItem) 24: 25: if need == 1 then 26: return 1 27: else 28: return 0 29: end 30:  31: end 这样的设计的目标是将缺陷的评分动作都由Lua脚本实现,而在应用程序之中并不存在针对缺陷制定不同的评分规则的情况,只有调用脚本进行评分的代码: 1: /// <summary> 2: /// 求指定患者、指定缺陷的缺陷数。 3: /// </summary> 4: /// <param name="pRoot"></param> 5: /// <param name="errorItem"></param> 6: /// <returns></returns> 7: public static int GetErrorNumber(ILuaEngine m_Lua, PatientRoot pRoot, ErrorDict errorItem) 8: { 9: if (string.IsNullOrEmpty(errorItem.Expression)) //无评分脚本 10: { 11: return 0; 12: } 13:  14: string m_file = System.IO.Path.Combine(LuaEx.ScriptDirectory, string.Format("emr\\error\\{0}.lua", errorItem.ErrorCode)); 15: if (!System.IO.File.Exists(m_file)) 16: { 17: return 0; 18: } 19:  20: try 21: { 22: m_Lua.DoFile(m_file); //加载脚本 23:  24: object[] vs = m_Lua.Invoke("GetErrorNumber", pRoot, errorItem); //执行函数。 25: if (vs != null && vs.Length > 0) 26: { 27: return int.Parse(vs[0].ToString()); 28: } 29: else 30: { 31: return 0; 32: } 33: } 34: catch 35: { 36: return 0; 37: } 38: } 这样的好处在于,主体程序变的极其的简单一致,不需要各种判断和各种规则,并且灵活自动,可以做到政策变化或者客户需求变化导到的各种评分规则的修改,则会灵活自如。      实践证明,使用动态脚本语言扩展现在系统的系统是一种低投入高产出的工作,对于应对这种高扩展性和高定制性的项目是一个非常好的选择,这个可以解释游戏编程之中大量使用Lua语言的事实,针对NPC、剧情书写相关的处理脚本,让游戏的后期变更,调整变得简单可行。 四、联系我们      为完善、改进和推广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 | SOA | Socket | 中间件 | 云计算 | 分布式 | 设计模式 | 消息中间件 | 框架 | Lua | 动态脚本 | EMR | 平台 | 电子病历

犀利的报表系统,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 中间件平台5.2版本下载、配置学习(四):开源的Silverlight运行容器的编译、配置

by 魏琼东 2013.10.17 10:58
一、前言      AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台。用于帮助中小型软件企业建立一条适合市场快速变化的开发团队,以达到节省开发成本、缩短开发时间,快速适应市场变化的目的。      AgileEAS.NET SOA中间件平台提供了敏捷快速开发软件工程的最佳实践,通过提供大量的基础支撑功能如IOC、ORM、SOA、分布式体系及敏捷并发开发方法所支撑的插件开发体系,以及提供了大量的实体、数据模型设计生成工具、代码生成工具,用于帮助中小软件开发商快速成长。      AgileEAS.NET平台充分把握目前软件行业快速发展的新趋势,基于敏捷并行开发、快速适应市场这样淳朴的软件工程实践,采用业界广泛使用的Microsoft .Net构件(组件)开发技术实践了这种开发思想,帮助软件企业实现“敏捷变化、快速适合”的目标,从而帮助软件企业在激烈的市场竞争中赢得先机并获得更高的回报。 二、关于Silverlight运行容器      在2011年秋天的的时候,曾经在Silverlight企业应用开发实践-AgileEAS.NET平台5.0 Silverlight支撑预览一文之中向大家介绍过AgileEAS.NET SOA中间件平台的Silverlight运行容器,其主要目的是当时有很多朋友希望我们能支撑Silverlight的应用开发,我们就基于我们AgileEAS.NET SOA中间件平台的“敏捷并行开发思想事件”、结合“插件开发&整合”思路、AgileEAS.NET SOA中间件平台的数据访问并结合AgleEAS.NET SOA中件的SOA分布式通信技术。      目前AgileEAS.NET SOA中间件Silverlight运行容器主要应用于医疗、物联网、ERP、CRM之类人企业内部应用之中。      AgileEAS.NET SOA 中间件平台Silverlight运行容器为开发人员带来如下好处:      1.)开发Silverlight应用同开发WinForm/WPF/WebForm/WebMVC应用一样可以使用AgileEAS.NET SOA提供的ORM和Linq技术。      2.)Silverlight应用同其他WinForm/WPF/WebForm/WebMVC应用使用同样的分布式服务端平台。      3.)Silverlight应用同其他WinForm/WPF/WebForm/WebMVC应用使用同样的服务端业务代码。      4.)为应用开发人员提供了类似在Silverlight客户段直接访问远程数据库的功能,提供了类似DataTable的数据结构Matrix。      5.)AgileEAS.NET SOA中间件平台已经实现了与WinForm/WPF运行环境同样的资源管理平台的系列功能(模块管理、权限、用户、角色)以及工作流系统绝大多数功能。      6.)AgileEAS.NET SOA中间件平台Silverlight运行容器源代码是以开源形式向大家提供的,大家可以在此基础上做一些在学大的调整。 三、学习Silverlight运行容器代码结构并进行编译      ActiveXForm运行容器的运行网站由在”Silverlight.src”目录之中以源代码形式向大家提供,我们用VS2010或者VS2012打开”Silverlight.src”目录之中的”AgileEAS.NET.Silverlight”解决方案:     ”AgileEAS.NET.Silverlight”解决方案之中共有九个项目:      EAS.BPM.SilverlightUI:为BPM工作流系统的界面元素文件,AgileEAS.NET SOA中间件的Silverlight运行环境的工作流支持管理功能功能都由这个项目提供。      EAS.Demo.Res:AgileEAS.NET SOA中间件的Silverlight运行环境的客户端演示资源插件,即用于替换AgileEAS.NET SOA中间件的Silverlight运行环境主界面,登录界面的界面定义代码的一个示例。      EAS.Explorer:AgileEAS.NET SOA中间件的Silverlight运行环境的一些接口定义,主要是资源替换接口的定义。      EAS.Explorer.Entities:AgileEAS.NET SOA中间件的Silverlight运行环境管理功能的数据实体定义,比如账号、角色、模块、报表等对象的定义。      EAS.Explorer.BLL.Contracts:AgileEAS.NET SOA中间件的Silverlight运行环境管理功能的服务契约定义,因为Silverlight是分布式运行的,即业务的实现在SOA服务之中运行,所以客户端只有业务契约,没有实现实体。      EAS.SilverlightClient:AgileEAS.NET SOA中间件的Silverlight运行环境主要程序,在这里面实现了一个可替换的插件应用环境。      EAS.SilverlightClient.AddIn:AgileEAS.NET SOA中间件的Silverlight运行环境管理功能的实现程序,主要实现了模块管理、角色账号、权限、组织机构等等。      EAS.SilverlightClient.AdminKit:辅助程序,本身没有多大意思,其功能是把EAS.SilverlightClient.AddIn和EAS.BPM.SilverlightUI打成一个EAS.SilverlightClient.AdminKit.xap包。      EAS.SilverlightClient.Web:AgileEAS.NET SOA中间件平台Silverlight运行容器的入口网站,即功能承载网站,包括一个首页及Silverlight XAP包的部署目录及客户端运行时所需要的配置文件和XAP包的自动升级配置。      了解了这九个项目的功能之后我们开始编译整个解决方案,保证所有项目编译通过:       了解了这八个项目的功能之后我们开始编译整个解决方案,保证所有项目编译通过: 四、配置并运行Silverlight运行容器     Silverlight应用是不直接连接数据库进行处理的,所以配置ActiveXForm运行容器/环境必须有一个先决条件,那就是Silverlight必须运行的AgileEAS.NET SOA 中间件的分布式环境下,即我们的SOA服务端必须运行,关于如何做这此工作,请参考前面的AgileEAS.NET SOA 中间件平台5.2版本下载、配置学习(二):配置WinClient分布式运行环境一文。      那么我们首先启动运行“AppServer\Bin”目录之中的“soaserver.start.bat”脚本,运行SOA服务:      接下来我们开始配置Silverlight运行容器的一些参数、以及Silverlight客户端XAP文件的升级配置,这些配置信息记录在项目”EAS.SilverlightClient.Web”的“ClientBin”目录之中,文件名称为“slconfig.xml”和“slUpdate.xml”。      其中“slconfig.xml”为Silverlight应用的系统配置文件,其内容如下: 1: <?xml version="1.0" encoding="utf-8"?> 2: <eas> 3: <configurations> 4: <item name="Key" value="Value" /> 5: <!--是否调试状态。--> 6: <item name="Debug" value="false" /> 7: <!--调试程序集。--> 8: <item name="Assembly" value="EAS.SilverlightClient.AddIn" /> 9: <!--外挂资源包。--> 10: <!--<item name="EAS.Explorer.Resource" value="EAS.Explorer.Res.xap,EAS.Explorer.Res.dll,EAS.Explorer.Res.Resources" />--> 11: </configurations> 12: <objects> 13: <!--分布式通信组件。--> 14: <object name="ServiceBridger" assembly="EAS.MicroKernel" type="EAS.Distributed.ServiceBridger" LifestyleType="Thread" > 15: <property name="ServiceUrl" type="string" value="http://localhost:6608/eas/services/EAS.RIAService" /> 16: </object> 17: <object name="DataAccessor" assembly="EAS.Data" type="EAS.Data.Access.DataAccessor" LifestyleType="Thread"> 18: <property name="ServiceBridger" type="object" value="ServiceBridger"/> 19: </object> 20: <object name="OrmAccessor" assembly="EAS.Data" type="EAS.Data.ORM.OrmAccessor" LifestyleType="Thread"> 21: <property name="ServiceBridger" type="object" value="ServiceBridger"/> 22: </object> 23: </objects> 24: </eas>      其中参数Debug表示系统是否为调试模式,即加载某一个Silverlight程序集并自动加载其中的插件进行调试运行,如果这个值为True,则系统会自动加载参数Assembly所指向的程序集,并加载其中的插件到系统导航之中,并跳过系统对登录账号的对所加载模块的权限检查,直接运行,如果这个参数为False,则Assembly参数无效,系统按照当前登录账号的权限加载导航,运行时也运行模块权限检测,一版情况下在开发过程之中我们都采用调试模式,这样可以省去安装配置插件的过程,而在生产过程,我们则使用非调试模式。      参数EAS.Explorer.Resource为外挂界面资源的配置,类似于WinClient的配置,我们不要修改他。     对像ServiceBridger的属性ServiceUrl配置了远程RIA服务的地址,即SOA服务实现之中的RIA服务的地址: 1: <object name="ServiceBridger" assembly="EAS.MicroKernel" type="EAS.Distributed.ServiceBridger" LifestyleType="Thread" > 2: <property name="ServiceUrl" type="string" value="http://localhost:6608/eas/services/EAS.RIAService" /> 3: </object>      一搬情况下,我们只需要修改IP地址或者域名即可,后面的不要做修改。      接下来我们打开升级配置“slUpdate.xml”: 1: <?xml version="1.0" encoding="utf-8"?> 2: <SmartConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 3: <URI>http://www.smarteas.net/</URI> 4: <Name>AgileEAS.NET升级配置文件</Name> 5: <Description>用于AgileEAS.NET平台SmartClient/ActiveX运行容器模块升级之用</Description> 6: <StartEx /> 7: <Time>2013-10-16T16:13:19.7125705+08:00</Time> 8: <Files> 9: <SmartFile> 10: <FileName>EAS.SilverlightClient.AdminKit.xap</FileName> 11: <Version>1.1.0.0</Version> 12: <Time>2013-10-16T09:54:19.7125705+08:00</Time> 13: </SmartFile> 14: <SmartFile> 15: <FileName>WF.Demo.SilverlightUI.xap</FileName> 16: <Version>1.1.0.0</Version> 17: <Time>2013-10-16T09:54:19.7125705+08:00</Time> 18: </SmartFile> 19: </Files> 20: </SmartConfig>     这个配置文件结构等同于前面的AgileEAS.NET SOA 中间件平台5.2版本下载、配置学习(二):配置WinClient分布式运行环境一文之中“EAS.SmartUpdateConfig.exe”工作所生成的文件,只不过,此处手工配置,而不是工具生成,我们需要把下载到客户端Silverlight环境之中的文件(主要是一些XAP包)以SmartFile配置信息形式记录在这个配置文件之中,需要多次注意的是,客户端会依据这个文件的最后时间进行更新。     OK,Silverlight环境的配置到这就可以了,接下来我们运行AgileEAS.NET SOA 中间件Silverlight运行容器看看。      按F5运行”EAS.SilverlightClient.Web”项目,打开浏览器:     输入用户名:Administrator,密码:sa然后点击登录,系统会有如下有“是否增加可用存储”的提示:     因为AgileEAS.NET SOA 中间件设置为支持Silverlight的本地存储文件,以缓存XAP包和某些业务数据,我们选择点击“是”,然后重新输入密码进行登录,将会打开系统主界面:     我们选择某个功能进行操作:     OK,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。

Tags:

.NET | C# | Silverlight | SOA | Socket | 分布式 | 框架 | 网站优化 | 下载 | 云计算 | 中间件

AgileEAS.NET SOA 中间件平台5.2版本下载、配置学习(三):配置ActiveXForm运行环境

by 魏琼东 2013.10.16 20:56
一、前言      AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台。用于帮助中小型软件企业建立一条适合市场快速变化的开发团队,以达到节省开发成本、缩短开发时间,快速适应市场变化的目的。      AgileEAS.NET SOA中间件平台提供了敏捷快速开发软件工程的最佳实践,通过提供大量的基础支撑功能如IOC、ORM、SOA、分布式体系及敏捷并发开发方法所支撑的插件开发体系,以及提供了大量的实体、数据模型设计生成工具、代码生成工具,用于帮助中小软件开发商快速成长。      AgileEAS.NET平台充分把握目前软件行业快速发展的新趋势,基于敏捷并行开发、快速适应市场这样淳朴的软件工程实践,采用业界广泛使用的Microsoft .Net构件(组件)开发技术实践了这种开发思想,帮助软件企业实现“敏捷变化、快速适合”的目标,从而帮助软件企业在激烈的市场竞争中赢得先机并获得更高的回报。 二、关于ActiveXForm运行容器      在我早期的博客园文章基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - ActiveXForm运行容器曾经向大家介绍过AgileEAS.NET SOA中间件平台的ActiveXForm运行容器,其主要用于把早期用WinForm开发的程序跑在IE浏览器之中,给用户造成一个BS项目的错觉,本来打算在4.0版本之中就给大家公开下载和发布的,但是鉴于之前直接在网上部署引用的一下配置问题的反馈我们并没有公开发布给大家。      如果是做互联网项目,使用ActiveXForm技术来做BS应用,那么我们很直接的告诉你,这事你是找抽,不靠谱,也不可取,但是在做内部管理信息系统的时候,比如财务、EPR、HIS、电子病历等这些项目,这东西又是一种可以去尝试的做法,我们虽然没有公开发布ActiveXForm但是我们一真在为使用ActiveXForm的软件企业提供技术帮助和升级。      AgileEAS.NET SOA 中间件平台所提供的功能都是比较实现的企业应用开发功能,在5.0发布之后就有很多企业希望能得到有关于ActiveXForm的发布包和技术支持资料,所以我们决定在AgileEAS.NET SOA中间件5.2版本之中提供ActiveXForm的内容,也在配置和使用上面提供一些文档资料。 三、配置ActiveXForm运行容器      配置ActiveXForm运行容器/环境必须有一个先决条件,那就是系统必须具有自动升级功能,即我们的SOA服务端必须运行并且配置好自动升级,关于如何做这此工作,请参考前面的AgileEAS.NET SOA 中间件平台5.2版本下载、配置学习(二):配置WinClient分布式运行环境一文。      那么我们首先启动运行“AppServer\Bin”目录之中的“soaserver.start.bat”脚本,运行SOA服务:      接下来我们开始配置ActiveXForm运行容器。      ActiveXForm运行容器的运行网站由在”ActiveXForm.Web”目录之中以源代码形式向大家提供,我们用VS2010或者VS2012打开”ActiveXForm.Web”目录之中的”EAS.ActiveXForm.Web”解决方案:      在”EAS.ActiveXForm.Web”项目之中,我们会看到如下结构:      首先我们修改”xClient\config”目录之中的文件”clientclasp.xml”和”activexForm.xml”两个配置文件,其中”clientclasp.xml”定义了ActiveXForm引擎/客户端钩子的定义,主要包括程序的升级定义,内容如下: 1: <?xml version="1.0" encoding="utf-8"?> 2: <ClientClasp> 3: <!--客户端钩子启动模块。--> 4: <item name="ClaspStart" value="EAS.ActiveXForm.ClaspStart,EAS.ActiveXForm.ClientClasp.AddIn" /> 5: <!--应用系统名称。--> 6: <item name="ApplicationName" value="AgileEAS.Net SOA中间件" /> 7: <!--是否开启升级。--> 8: <item name="AllowUpdate" value="true" /> 9: <!--升级服务地址。--> 10: <item name="UpdateUrl" value="net.tcp://localhost:6607/eas/services/eas.updateservice" /> 11: </ClientClasp>     其中配置项目”claspstart”为客户端初始化参数,这个不需要改变,”ApplicationName”为升级程序的标题显示,”AllowUpdate”是否开启升级,”UpdateUrl”为升级地址,关于具体的配置参数得参考AgileEAS.NET SOA 中间件平台5.2版本下载、配置学习(二):配置WinClient分布式运行环境一文中服务端的配置参数。     ”activexForm.xml”配置文件为ActiveXForm应用程序的运行配置,其内容和AgileEAS.NET SOA 中间件平台5.2版本下载、配置学习(二):配置WinClient分布式运行环境一文这是分布式环境情况下“EAS.WinClient.Start.exe.config”配置文件内容一模一样,我们可以把配置复制过来: 1: <?xml version="1.0" encoding="utf-8"?> 2: <configuration> 3: <configSections> 4: <section name="eas" type="EAS.ConfigHandler,EAS.MicroKernel" /> 5: </configSections> 6: <!--SQLite运行必需--> 7: <startup useLegacyV2RuntimeActivationPolicy="true"> 8: <supportedRuntime version="v4.0"/> 9: </startup> 10: <eas> 11: <configurations> 12: <item name="Key" value="Value" /> 13: </configurations> 14: <objects> 15: <!--分布式通信组件。--> 16: <object name="ServiceBridger" assembly="EAS.Distributed" type="EAS.Distributed.ServiceBridger" LifestyleType="Thread" > 17: <property name="ServiceName" type="string" value="EAS.RMI.Service" /> 18: </object> 19: <object name="DataAccessor" assembly="EAS.Distributed" type="EAS.Distributed.DataAccessor" LifestyleType="Thread" > 20: <property name="ServiceBridger" type="object" value="ServiceBridger" /> 21: </object> 22: <object name="OrmAccessor" assembly="EAS.Distributed" type="EAS.Distributed.OrmAccessor" LifestyleType="Thread" > 23: <property name="ServiceBridger" type="object" value="ServiceBridger" /> 24: <property name="DataAccessor" type="object" value="DataAccessor" /> 25: </object> 26: <!--日志管理--> 27: <object name="Logger" assembly="EAS.MicroKernel" type="EAS.Loggers.TextLogger" LifestyleType="Singleton" /> 28: <!--资源--> 29: <!--<object name="EAS.Explorer.Resource" assembly="EAS.Explorer.Res" type="EAS.Explorer.Res.Resources" LifestyleType="Singleton" />--> 30: </objects> 31: <services> 32: <service name="EAS.RMI.Service" service-type="WcfService" singleton="true" url="net.tcp://127.0.0.1:6607/eas/services/EAS.RMIService" /> 33: <service name="EAS.Storage.Service" service-type="WcfService" singleton="true" url="net.tcp://127.0.0.1:6607/eas/services/EAS.StorageService" /> 34: </services> 35: </eas> 36: </configuration>      接下来我们配置“Web.config”文件,因为ActiveXForm运行的登录验证需要访问验证服务,所以我们必须配置“Web.config”,其内容如下: 1: <?xml version="1.0" encoding="utf-8"?> 2: <configuration> 3:  4: <configSections> 5: <section name="eas" type="EAS.ConfigHandler,EAS.MicroKernel" /> 6: </configSections> 7: 8: <!--支持混合程序集--> 9: <startup useLegacyV2RuntimeActivationPolicy="true"> 10: <supportedRuntime version="v4.0"/> 11: </startup> 12: <eas> 13: <configurations> 14: <item name="Key" value="Value" /> 15: </configurations> 16: <objects> 17: <!--分布式通信组件。--> 18: <object name="ServiceBridger" assembly="EAS.Distributed" type="EAS.Distributed.ServiceBridger" LifestyleType="Thread" > 19: <property name="ServiceName" type="string" value="EAS.RMI.Service" /> 20: </object> 21: <object name="DataAccessor" assembly="EAS.Distributed" type="EAS.Distributed.DataAccessor" LifestyleType="Thread" > 22: <property name="ServiceBridger" type="object" value="ServiceBridger" /> 23: </object> 24: <object name="OrmAccessor" assembly="EAS.Distributed" type="EAS.Distributed.OrmAccessor" LifestyleType="Thread" > 25: <property name="ServiceBridger" type="object" value="ServiceBridger" /> 26: <property name="DataAccessor" type="object" value="DataAccessor" /> 27: </object> 28: <!--日志管理--> 29: <object name="Logger" assembly="EAS.MicroKernel" type="EAS.Loggers.TextLogger" LifestyleType="Singleton" /> 30: </objects> 31: <services> 32: <service name="EAS.RMI.Service" service-type="WcfService" url="net.tcp://localhost:6607/eas/services/EAS.RMIService" /> 33: </services> 34: </eas> 35: 36: <system.web> 37: <compilation debug="true" targetFramework="4.0" /> 38: <httpModules> 39: <add name="SecurityDemandModule" type="EAS.Explorer.Web.SecurityDemandModule, EAS.Explorer.Web"/> 40: </httpModules> 41: </system.web> 42:  43: </configuration>      在配置文件的“configuration/eas/objects”之中的内容同ActiveXForm.xml文件内容一致,但是没有“EAS.Explorer.Resource”,在ActieXForm.xml和Web.Config文件之中,重点是远程服务地址的配置: 1: <services> 2: <service name="EAS.RMI.Service" service-type="WcfService" singleton="true" url="net.tcp://127.0.0.1:6607/eas/services/EAS.RMIService" /> 3: </services>      ActiveXForm运行之前的配置到这就可以了,接下来看运行时的IE设置。 四、ActiveXForm运行时的IE设置      把“Default.aspx”设为起始页,然后按F5运行”EAS.ActiveXForm.Web”项目,打开IE浏览器,有如下界面:     很显然,IE的安全性阻止ActiveXForm的运行,我们按下面的提示点击“安装根证书”,会有如下提示:     选择打开,弹出如下窗口:     点击“安装证书”继续:     选择“下一步”:     选中“将所有的证书放入下列存储”,点击“浏览”:      选择“受信任的根证书颁发机构”,点击“确定”:      点击“下一步”:      点击“完成”进行证书安装,将会弹出证书安装确定:      点击“是”完成证书安装,然后我们重新打开“Default.aspx”页面:      在IE安全提示“?”处点鼠标邮:      选中“为计算机上的所有用户安装此加载项(A)”,将会弹出“ActiveXForm插件”安装对话框:      点击“安装”,IE会自动安装AgileEAS.NET SOA中间件ActiveXForm插件,安装完成后系统会有如下升级提示:      点击“确定”,打开自动升级程序进行升级:      升级完成之后点击“关闭”然后重新打开打开“Default.aspx”页面,发布不再提示脚本错误:      输入用户名:Administrator,密码:sa之后点击“登录”,系统将会为我们呈现出AgileEAS.NET SOA 中间件ActiveXForm运行容器的主界面:      我们随便打开个功能看看是否好用,比如打开模块管理,并查看某个模块的属性:       是否发现这界面似曾相似^_^ 五、如果配置不成功      如果按照第四节的配置还是不能运行成功运行,那么首先打开首页之后,把当前网站localhost加入到可信息站点:      然后再进行第四节的配置,如果还不行,那么打开首页之设置IE“可信站点”区域的安全性,选择自定义级别,启用“对未标记为可安全执行脚本的ActiveX控件初始化并且执行脚本:       然后再进行第四节的操作,如果还是不行,那么请打开首页之后:       即手机下载msi安装包文件”xClient/downloads/EAS.ActiveXForm.msi”安装项目,进行手工安装,安装完成之后重新打开“Default.aspx”页面。 六、ActiveXForm的特点与局限      AgileEAS.NET SOA中间件ActiveXForm运行容器的本质是通过一个浏览器插件,把原来基于AgileEAS.NET SOA中间件平台所开发的WinForm/WPF应用运行与IE浏览器之中,以达到通过Winform/WPF开发BS应用(此处需要说明一下应该是伪BS应用),非常适合没有BS开发能力的一些中小管理软件企业,基于某些原因,ActiveXForm这种方式的伪BS应用非常的广,比如企业内部的财务系统、医院的电子病历、区域公共卫生平台之中的医疗机构信息系统,企业内部使用的其他一些系统之中。      AgileEAS.NET SOA中间件ActiveXForm运行容器并不只能运行基于AgileEAS.NET SOA中间件开发的应用系统,理论上可以扩展为可以把任何用WinFrom/WPF开发的系统都能转换为这种ActiveXForm加载的BS应用。      当然了,AgileEAS.NET SOA中间件ActiveXForm这种模式的应用也是有很大的局限的,比如,非常不适合在互联网上运行,因为其所有客户端都需要安装.NET Framework ,也需要安装ActiveXForm插件、导入证书甚至设置安全性。 七、联系我们      为了完善、改进和推广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。

Tags:

.NET | ActiveX | ActiveXForm | AgileEAS.NET | C# | SOA | Socket | 分布式 | 框架 | 消息中间件 | 中间件

AgileEAS.NET SOA 中间件平台5.2版本下载、配置学习(二):配置WinClient分布式运行环境

by 魏琼东 2013.10.16 09:25
一、前言      AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台。用于帮助中小型软件企业建立一条适合市场快速变化的开发团队,以达到节省开发成本、缩短开发时间,快速适应市场变化的目的。      AgileEAS.NET SOA中间件平台提供了敏捷快速开发软件工程的最佳实践,通过提供大量的基础支撑功能如IOC、ORM、SOA、分布式体系及敏捷并发开发方法所支撑的插件开发体系,以及提供了大量的实体、数据模型设计生成工具、代码生成工具,用于帮助中小软件开发商快速成长。      AgileEAS.NET平台充分把握目前软件行业快速发展的新趋势,基于敏捷并行开发、快速适应市场这样淳朴的软件工程实践,采用业界广泛使用的Microsoft .Net构件(组件)开发技术实践了这种开发思想,帮助软件企业实现“敏捷变化、快速适合”的目标,从而帮助软件企业在激烈的市场竞争中赢得先机并获得更高的回报。 二、配置分布式方式运行WinClient运行容器      在前面的AgileEAS.NET SOA 中间件平台5.2版本下载、配置学习(一):下载平台并基于直连环境运行一文之中,为大家介绍了如何下载AgileEAS.NET SOA中间件平台,以及如何初始化数据库运行环境、配置以直连方式运行AgileEAS.NET SOA 中间件WinCleint以直接数据库方式运行。      本文我们将为大家讲解如何以配置以”SOA服务-分布式客户端”方向运行AgileEAS.ENT SOA中间件平台WinClient容器。 三、配置SOA分布式服务端      在配置服务端之湔我们抚运动一下下载包根目录之中的”EAS.Publisher.exe”应用程序:      ”EAS.Publisher.exe”控件台应用程序是一个用于帮助开发人员进行分布式部署时的分发程序,其本质是将发布包“bin\dotnet”之中的程序集复制到“SOA服务”运行的环境目录“AppServer”下面的各级目录,运行程序如下: 运行时自动调用“eas.publish.cmd”脚本,将文件分发到“AppServer”下面的各级目录,其脚本内容如下: 1: @rem 复制到下载目录 2: copy @RootDirectory\bin\dotnet\AgileIM.Client.exe @RootDirectory\appserver\xclient\files\AgileIM.Client.exe /y 3: copy @RootDirectory\bin\dotnet\AgileIM.Client.exe.config @RootDirectory\appserver\xclient\files\AgileIM.Client.exe.config /y 4: copy @RootDirectory\bin\dotnet\AgileIM.Contracts.dll @RootDirectory\appserver\xclient\files\AgileIM.Contracts.dll /y 5: copy @RootDirectory\bin\dotnet\AgileIM.Service.dll @RootDirectory\appserver\xclient\files\AgileIM.Service.dll /y 6: copy @RootDirectory\bin\dotnet\AxInterop.grdesLib.dll @RootDirectory\appserver\xclient\files\AxInterop.grdesLib.dll /y 7: copy @RootDirectory\bin\dotnet\AxInterop.grproLib.dll @RootDirectory\appserver\xclient\files\AxInterop.grproLib.dll /y 8: copy @RootDirectory\bin\dotnet\EAS.ActiveXForm.ClientClasp.AddIn.dll @RootDirectory\appserver\xclient\files\EAS.ActiveXForm.ClientClasp.AddIn.dll /y 9: copy @RootDirectory\bin\dotnet\EAS.BPM.Activities.dll @RootDirectory\appserver\xclient\files\EAS.BPM.Activities.dll /y 10: copy @RootDirectory\bin\dotnet\EAS.BPM.BLL.Host.dll @RootDirectory\appserver\xclient\files\EAS.BPM.BLL.Host.dll /y 11: copy @RootDirectory\bin\dotnet\EAS.BPM.WinUI.dll @RootDirectory\appserver\xclient\files\EAS.BPM.WinUI.dll /y 12: copy @RootDirectory\bin\dotnet\eas.client.ini @RootDirectory\appserver\xclient\files\eas.client.ini /y 13: copy @RootDirectory\bin\dotnet\EAS.Configure.exe @RootDirectory\appserver\xclient\files\EAS.Configure.exe /y 14: copy @RootDirectory\bin\dotnet\EAS.Configure.exe.config @RootDirectory\appserver\xclient\files\EAS.Configure.exe.config /y 15: copy @RootDirectory\bin\dotnet\EAS.Data.Controls.dll @RootDirectory\appserver\xclient\files\EAS.Data.Controls.dll /y 16: copy @RootDirectory\bin\dotnet\EAS.Data.dll @RootDirectory\appserver\xclient\files\EAS.Data.dll /y 17: copy @RootDirectory\bin\dotnet\EAS.Data.Provider.dll @RootDirectory\appserver\xclient\files\EAS.Data.Provider.dll /y 18: copy @RootDirectory\bin\dotnet\EAS.Distributed.dll @RootDirectory\appserver\xclient\files\EAS.Distributed.dll /y 19: copy @RootDirectory\bin\dotnet\EAS.Explorer.BLL.Contracts.dll @RootDirectory\appserver\xclient\files\EAS.Explorer.BLL.Contracts.dll /y 20: copy @RootDirectory\bin\dotnet\EAS.Explorer.BLL.Host.dll @RootDirectory\appserver\xclient\files\EAS.Explorer.BLL.Host.dll /y 21: copy @RootDirectory\bin\dotnet\EAS.Explorer.dll @RootDirectory\appserver\xclient\files\EAS.Explorer.dll /y 22: copy @RootDirectory\bin\dotnet\EAS.Explorer.Entities.dll @RootDirectory\appserver\xclient\files\EAS.Explorer.Entities.dll /y 23: copy @RootDirectory\bin\dotnet\EAS.Explorer.Res.dll @RootDirectory\appserver\xclient\files\EAS.Explorer.Res.dll /y 24: copy @RootDirectory\bin\dotnet\EAS.Explorer.WinUI.dll @RootDirectory\appserver\xclient\files\EAS.Explorer.WinUI.dll /y 25: copy @RootDirectory\bin\dotnet\EAS.FormDesigner.exe @RootDirectory\appserver\xclient\files\EAS.FormDesigner.exe /y 26: copy @RootDirectory\bin\dotnet\EAS.GReport.Controls.dll @RootDirectory\appserver\xclient\files\EAS.GReport.Controls.dll /y 27: copy @RootDirectory\bin\dotnet\EAS.MicroKernel.dll @RootDirectory\appserver\xclient\files\EAS.MicroKernel.dll /y 28: copy @RootDirectory\bin\dotnet\EAS.Monitor.dll @RootDirectory\appserver\xclient\files\EAS.Monitor.dll /y 29: copy @RootDirectory\bin\dotnet\EAS.NLB.Monitor.exe @RootDirectory\appserver\xclient\files\EAS.NLB.Monitor.exe /y 30: copy @RootDirectory\bin\dotnet\EAS.NLB.Server.exe @RootDirectory\appserver\xclient\files\EAS.NLB.Server.exe /y 31: copy @RootDirectory\bin\dotnet\EAS.OrmDesigner.exe @RootDirectory\appserver\xclient\files\EAS.OrmDesigner.exe /y 32: copy @RootDirectory\bin\dotnet\EAS.OrmDesigner.exe.config @RootDirectory\appserver\xclient\files\EAS.OrmDesigner.exe.config /y 33: copy @RootDirectory\bin\dotnet\EAS.Report.Controls.dll @RootDirectory\appserver\xclient\files\EAS.Report.Controls.dll /y 34: copy @RootDirectory\bin\dotnet\EAS.SmartUpdater.exe @RootDirectory\appserver\xclient\files\EAS.SmartUpdater.exe /y 35: copy @RootDirectory\bin\dotnet\EAS.SOA.Monitor.exe @RootDirectory\appserver\xclient\files\EAS.SOA.Monitor.exe /y 36: copy @RootDirectory\bin\dotnet\EAS.ThirdParty.Controls.dll @RootDirectory\appserver\xclient\files\EAS.ThirdParty.Controls.dll /y 37: copy @RootDirectory\bin\dotnet\EAS.WinClient.dll @RootDirectory\appserver\xclient\files\EAS.WinClient.dll /y 38: copy @RootDirectory\bin\dotnet\EAS.WinClient.Start.exe @RootDirectory\appserver\xclient\files\EAS.WinClient.Start.exe /y 39: copy @RootDirectory\bin\dotnet\EAS.WinClient.Start.exe.config @RootDirectory\appserver\xclient\files\EAS.WinClient.Start.exe.config /y 40: copy @RootDirectory\bin\dotnet\EAS.Windows.dll @RootDirectory\appserver\xclient\files\EAS.Windows.dll /y 41: copy @RootDirectory\bin\dotnet\EAS.Wpf.Controls.dll @RootDirectory\appserver\xclient\files\EAS.Wpf.Controls.dll /y 42: copy @RootDirectory\bin\dotnet\grdes50.dll @RootDirectory\appserver\xclient\files\grdes50.dll /y 43: copy @RootDirectory\bin\dotnet\gregn50.dll @RootDirectory\appserver\xclient\files\gregn50.dll /y 44: copy @RootDirectory\bin\dotnet\ICSharpCode.AvalonEdit.dll @RootDirectory\appserver\xclient\files\ICSharpCode.AvalonEdit.dll /y 45: copy @RootDirectory\bin\dotnet\Interop.grdesLib.dll @RootDirectory\appserver\xclient\files\Interop.grdesLib.dll /y 46: copy @RootDirectory\bin\dotnet\Interop.grproLib.dll @RootDirectory\appserver\xclient\files\Interop.grproLib.dll /y 47: copy @RootDirectory\bin\dotnet\itextsharp.dll @RootDirectory\appserver\xclient\files\itextsharp.dll /y 48: copy @RootDirectory\bin\dotnet\lua51.x64.dll @RootDirectory\appserver\xclient\files\lua51.x64.dll /y 49: copy @RootDirectory\bin\dotnet\lua51.x86.dll @RootDirectory\appserver\xclient\files\lua51.x86.dll /y 50: copy @RootDirectory\bin\dotnet\LuaInterface.x64.dll @RootDirectory\appserver\xclient\files\LuaInterface.x64.dll /y 51: copy @RootDirectory\bin\dotnet\LuaInterface.x86.dll @RootDirectory\appserver\xclient\files\LuaInterface.x86.dll /y 52: copy @RootDirectory\bin\dotnet\Microsoft.Data.ConnectionUI.Dialog.dll @RootDirectory\appserver\xclient\files\Microsoft.Data.ConnectionUI.Dialog.dll /y 53: copy @RootDirectory\bin\dotnet\Microsoft.Data.ConnectionUI.dll @RootDirectory\appserver\xclient\files\Microsoft.Data.ConnectionUI.dll /y 54: copy @RootDirectory\bin\dotnet\Microsoft.XmlNotepad.dll @RootDirectory\appserver\xclient\files\Microsoft.XmlNotepad.dll /y 55: copy @RootDirectory\bin\dotnet\MongoDB.dll @RootDirectory\appserver\xclient\files\MongoDB.dll /y 56: copy @RootDirectory\bin\dotnet\MySql.Data.dll @RootDirectory\appserver\xclient\files\MySql.Data.dll /y 57: copy @RootDirectory\bin\dotnet\NetronGraphLib.dll @RootDirectory\appserver\xclient\files\NetronGraphLib.dll /y 58: copy @RootDirectory\bin\dotnet\protobuf-net.xml @RootDirectory\appserver\xclient\files\protobuf-net.xml /y 59: copy @RootDirectory\bin\dotnet\RdlDesigner.dll @RootDirectory\appserver\xclient\files\RdlDesigner.dll /y 60: copy @RootDirectory\bin\dotnet\RdlEngine.dll @RootDirectory\appserver\xclient\files\RdlEngine.dll /y 61: copy @RootDirectory\bin\dotnet\RdlViewer.dll @RootDirectory\appserver\xclient\files\RdlViewer.dll /y 62: copy @RootDirectory\bin\dotnet\System.Data.SQLite.DLL @RootDirectory\appserver\xclient\files\System.Data.SQLite.DLL /y 63: copy @RootDirectory\bin\dotnet\System.Workflow.Activities.dll @RootDirectory\appserver\xclient\files\System.Workflow.Activities.dll /y 64: copy @RootDirectory\bin\dotnet\System.Workflow.ComponentModel.dll @RootDirectory\appserver\xclient\files\System.Workflow.ComponentModel.dll /y 65: copy @RootDirectory\bin\dotnet\System.Workflow.Runtime.dll @RootDirectory\appserver\xclient\files\System.Workflow.Runtime.dll /y 66: copy @RootDirectory\bin\dotnet\update.ini @RootDirectory\appserver\xclient\files\update.ini /y 67: copy @RootDirectory\bin\dotnet\WF.Demo.DAL.dll @RootDirectory\appserver\xclient\files\WF.Demo.DAL.dll /y 68: copy @RootDirectory\bin\dotnet\WF.Demo.UI.dll @RootDirectory\appserver\xclient\files\WF.Demo.UI.dll /y 69: @rem 复制到下载配置目录 70: copy @RootDirectory\bin\dotnet\EAS.SmartUpdateConfig.exe @RootDirectory\appserver\xclient\EAS.SmartUpdateConfig.exe /y 71: copy @RootDirectory\bin\dotnet\EAS.SmartUpdateConfig.exe.config @RootDirectory\appserver\xclient\EAS.SmartUpdateConfig.exe.config /y 72: @rem 复制到SOA服务Bin目录 73: copy @RootDirectory\bin\dotnet\AgileIM.Contracts.dll @RootDirectory\appserver\bin\AgileIM.Contracts.dll /y 74: copy @RootDirectory\bin\dotnet\AgileIM.Service.dll @RootDirectory\appserver\bin\AgileIM.Service.dll /y 75: copy @RootDirectory\bin\dotnet\EAS.BPM.Activities.dll @RootDirectory\appserver\bin\EAS.BPM.Activities.dll /y 76: copy @RootDirectory\bin\dotnet\EAS.BPM.BLL.Host.dll @RootDirectory\appserver\bin\EAS.BPM.BLL.Host.dll /y 77: copy @RootDirectory\bin\dotnet\EAS.Configure.exe @RootDirectory\appserver\bin\EAS.Configure.exe /y 78: copy @RootDirectory\bin\dotnet\EAS.Configure.exe.config @RootDirectory\appserver\bin\EAS.Configure.exe.config /y 79: copy @RootDirectory\bin\dotnet\EAS.Data.dll @RootDirectory\appserver\bin\EAS.Data.dll /y 80: copy @RootDirectory\bin\dotnet\EAS.Data.Provider.dll @RootDirectory\appserver\bin\EAS.Data.Provider.dll /y 81: copy @RootDirectory\bin\dotnet\EAS.Data.xml @RootDirectory\appserver\bin\EAS.Data.xml /y 82: copy @RootDirectory\bin\dotnet\EAS.DbInitializer.exe @RootDirectory\appserver\bin\EAS.DbInitializer.exe /y 83: copy @RootDirectory\bin\dotnet\EAS.DbInitializer.exe.config @RootDirectory\appserver\bin\EAS.DbInitializer.exe.config /y 84: copy @RootDirectory\bin\dotnet\EAS.Distributed.dll @RootDirectory\appserver\bin\EAS.Distributed.dll /y 85: copy @RootDirectory\bin\dotnet\EAS.Explorer.BLL.Contracts.dll @RootDirectory\appserver\bin\EAS.Explorer.BLL.Contracts.dll /y 86: copy @RootDirectory\bin\dotnet\EAS.Explorer.BLL.Host.dll @RootDirectory\appserver\bin\EAS.Explorer.BLL.Host.dll /y 87: copy @RootDirectory\bin\dotnet\EAS.Explorer.dll @RootDirectory\appserver\bin\EAS.Explorer.dll /y 88: copy @RootDirectory\bin\dotnet\EAS.Explorer.Entities.dll @RootDirectory\appserver\bin\EAS.Explorer.Entities.dll /y 89: copy @RootDirectory\bin\dotnet\EAS.MicroKernel.dll @RootDirectory\appserver\bin\EAS.MicroKernel.dll /y 90: copy @RootDirectory\bin\dotnet\EAS.Monitor.dll @RootDirectory\appserver\bin\EAS.Monitor.dll /y 91: copy @RootDirectory\bin\dotnet\EAS.NLB.Monitor.exe @RootDirectory\appserver\bin\EAS.NLB.Monitor.exe /y 92: copy @RootDirectory\bin\dotnet\EAS.NLB.Server.exe @RootDirectory\appserver\bin\EAS.NLB.Server.exe /y 93: copy @RootDirectory\bin\dotnet\EAS.NLB.Server.exe.config @RootDirectory\appserver\bin\EAS.NLB.Server.exe.config /y 94: copy @RootDirectory\bin\dotnet\EAS.NLB.Server.x64.exe @RootDirectory\appserver\bin\EAS.NLB.Server.x64.exe /y 95: copy @RootDirectory\bin\dotnet\EAS.SOA.Server.exe @RootDirectory\appserver\bin\EAS.SOA.Server.exe /y 96: copy @RootDirectory\bin\dotnet\EAS.SOA.Server.exe.config @RootDirectory\appserver\bin\EAS.SOA.Server.exe.config /y 97: copy @RootDirectory\bin\dotnet\EAS.SOA.Server.x64.exe @RootDirectory\appserver\bin\EAS.SOA.Server.x64.exe /y 98: copy @RootDirectory\bin\dotnet\EAS.SOA.Server.x64.exe.config @RootDirectory\appserver\bin\EAS.SOA.Server.x64.exe.config /y 99: copy @RootDirectory\bin\dotnet\lua51.x64.dll @RootDirectory\appserver\bin\lua51.x64.dll /y 100: copy @RootDirectory\bin\dotnet\lua51.x86.dll @RootDirectory\appserver\bin\lua51.x86.dll /y 101: copy @RootDirectory\bin\dotnet\LuaInterface.x64.dll @RootDirectory\appserver\bin\LuaInterface.x64.dll /y 102: copy @RootDirectory\bin\dotnet\LuaInterface.x86.dll @RootDirectory\appserver\bin\LuaInterface.x86.dll /y 103: copy @RootDirectory\bin\dotnet\MongoDB.dll @RootDirectory\appserver\bin\MongoDB.dll /y 104: copy @RootDirectory\bin\dotnet\MySql.Data.dll @RootDirectory\appserver\bin\MySql.Data.dll /y 105: copy @RootDirectory\bin\dotnet\RdlEngine.dll @RootDirectory\appserver\bin\RdlEngine.dll /y 106: copy @RootDirectory\bin\dotnet\RdlViewer.dll @RootDirectory\appserver\bin\RdlViewer.dll /y 107: copy @RootDirectory\bin\dotnet\soaserver.start.bat @RootDirectory\appserver\bin\soaserver.start.bat /y 108: copy @RootDirectory\bin\dotnet\soaserver.start.bat @RootDirectory\appserver\bin\install.bat /y 109: copy @RootDirectory\bin\dotnet\soaserver.start.bat @RootDirectory\appserver\bin\uinstall.bat /y 110: copy @RootDirectory\bin\dotnet\System.Data.SQLite.DLL @RootDirectory\appserver\bin\System.Data.SQLite.DLL /y 111: copy @RootDirectory\bin\dotnet\System.Workflow.Activities.dll @RootDirectory\appserver\bin\System.Workflow.Activities.dll /y 112: copy @RootDirectory\bin\dotnet\System.Workflow.ComponentModel.dll @RootDirectory\appserver\bin\System.Workflow.ComponentModel.dll /y 113: copy @RootDirectory\bin\dotnet\System.Workflow.Runtime.dll @RootDirectory\appserver\bin\System.Workflow.Runtime.dll /y 114: copy @RootDirectory\bin\dotnet\WF.Demo.DAL.dll @RootDirectory\appserver\bin\WF.Demo.DAL.dll /y 115:       其中@RootDirectory程序会根据运行时工作目录进行替换,注意:下载的AgileEAS.NET SOA中间件平台的解压目录路径之中最好不要带空格和中文。      接下来我们配置服务端,数据库我们将使用“AgileEAS.NET SOA 中间件平台5.2版本下载、配置学习(一):下载平台并基于直连环境运行一文所建立和初始化的”eas_demo”数据库。      我们运行“AppServer\Bin”目录之中的“EAS.Configure.exe”AgileEAS.NET SOA中间件配置文件生成工具生成服务端配置:      一定要选中“生成SOA分布式服务器配置”和“保存配置到AgileEAS.NET SOA 平台相关配置文件”然后点“下一步”:      填写WCF服务所需要的通信端口号(http和tcp各一个)、以及Socket通信服务的tcp的端口”以及数据库连接信息,然后点“下一步”:      界面上方是根据所设参数生成的配置信息,此处,可以改变配置信息的输出路径,默认为当前目录之中的“EAS.SOA.Server.exe.config”,点击“完成”输出配置:      至此,服务端的配置已经完成,接焉为我们以控件台方式运行一下SOA服务端,运行“AppServer\Bin”目录之中的“soaserver.start.bat”指处理文件:      “soaserver.start.bat”批处理文件是SOA服务的控制台运行脚本,即以控制台模式运行SOA服务端,我们运行如下:      “appServer\Binsoaserver.start.bat”批处理文件其内容如下: 1: EAS.soa.Server.exe -run 2: pause      其本质是“EAS.soa.Server.exe -run”这一旬,EAS.SOA.Server.exe带了一个启动参考 -run,即告诉EAS.SOA.Server.exe以控制台方式运行承载服务,除-run参数之外,EAS.SOA.Server.exe还支持以下参数:      -i 或者/i:向Windows服务控制器安装AgileEAS.NET SOA中间件平台SOA服务。      -u 或者/u:卸载已存在的AgileEAS.NET SOA中间件平台SOA服务。      /name=实例名:在安装、卸载AgileEAS.NET SOA中间件平台SOA服务的时候,告诉服务控制器,要安装什么实例的名称是什么,AgileEAS.NET SOA中间件的服务设计为可以多服务实例运行,即一台电脑上可以运行实例名称为”EAS”、“Demo”、“HIS”、“EMR”、“PACS”等不同的服务实例,类似于SQL的命名实现,当然这个参数是一个可选参考,如果不使用本参数,则安装和卸载默认实例,一台电脑只能安装一个默认实例,比如以下脚本:      “AppServer\Bin\install.bat”脚本 EAS.SOA.Server.exe /i /name=demo pause      表现安装一个实例名称为“demo”的AgileEAS.NET SOA中间件平台SOA服务实例,我们可以执行这个脚本:      我们打开系统管理工具之中的服务管理:      那以在生产环境之中我们就可以通过这种方式部署AgileEAS.NET SOA 中间件平台的SOA服务,服务安装之后会随计算机启动而自动启动,我们可以很方便的通过系统服务管理工具进行启动、停止服务,如果我们不使用这个服务了,我们可以使用以下脚本卸载这个服务:      “AppServer\Bin\uinstall.bat”脚本 1: EAS.SOA.Server.exe /u /name=demo 2: pause      执行脚本如下:      我们运行“appServer\Bin\soaserver.start.bat”启动服务进行下一步配置。 四、配置分布式WinClient客户段      在第三节中我们使用”EAS.Publisher.exe”分发程序分发文件,会自动把客户段运行文件复制到”appServer\xclient\files”之中,那么我们运行”appServer\xclient\files\EAS.Configure.exe”配置程序配置客户端:     选中“生成客户端配置(分布式访问结果)”和“保存配置到AgileEAS.NET SOA 平台相关配置文件”然后点击“下一步”:     这里需要注意的是端口号要根据选择的通信模式和第三节所设置的服务器参数进行决定,tcp对应第三节服务器设置之中的WCF服务之中的Tcp端口号,http对应WCF服务之中的http端口号,socket对应socket服务模式之中的tcp端口号。     点击“下一步”继续:     点击“完成”输出客户端配置到“EAS.WinClient.Start.exe.config”配置文件之中,内容如下: 1: <?xml version="1.0" encoding="utf-8"?> 2: <configuration> 3: <configSections> 4: <section name="eas" type="EAS.ConfigHandler,EAS.MicroKernel" /> 5: </configSections> 6: <!--SQLite运行必需--> 7: <startup useLegacyV2RuntimeActivationPolicy="true"> 8: <supportedRuntime version="v4.0"/> 9: </startup> 10: <eas> 11: <configurations> 12: <item name="Key" value="Value" /> 13: </configurations> 14: <objects> 15: <!--分布式通信组件。--> 16: <object name="ServiceBridger" assembly="EAS.Distributed" type="EAS.Distributed.ServiceBridger" LifestyleType="Thread" > 17: <property name="ServiceName" type="string" value="EAS.RMI.Service" /> 18: </object> 19: <object name="DataAccessor" assembly="EAS.Distributed" type="EAS.Distributed.DataAccessor" LifestyleType="Thread" > 20: <property name="ServiceBridger" type="object" value="ServiceBridger" /> 21: </object> 22: <object name="OrmAccessor" assembly="EAS.Distributed" type="EAS.Distributed.OrmAccessor" LifestyleType="Thread" > 23: <property name="ServiceBridger" type="object" value="ServiceBridger" /> 24: <property name="DataAccessor" type="object" value="DataAccessor" /> 25: </object> 26: <!--日志管理--> 27: <object name="Logger" assembly="EAS.MicroKernel" type="EAS.Loggers.TextLogger" LifestyleType="Singleton" /> 28: <!--资源--> 29: <!--<object name="EAS.Explorer.Resource" assembly="EAS.Explorer.Res" type="EAS.Explorer.Res.Resources" LifestyleType="Singleton" />--> 30: </objects> 31: <services> 32: <service name="EAS.RMI.Service" service-type="WcfService" singleton="true" url="net.tcp://127.0.0.1:6607/eas/services/EAS.RMIService" /> 33: <service name="EAS.Storage.Service" service-type="WcfService" singleton="true" url="net.tcp://127.0.0.1:6607/eas/services/EAS.StorageService" /> 34: </services> 35: </eas> 36: </configuration>     至此为止,我们完成了不带自动升级功能的分布式客户端配置,我们启动客户程序“EAS.WinClient.Start.exe”,并使用账号:Adminstrator,密码:sa登录,看到如下界面:      那么如何分辨程序是以分布式方式运行的呢,我们打开以控件台运行的SOA服务程序CMD窗口,就会看到其中一些消息通信记录: 五、配置自动升级      第四节我们在”appServer\xclient\files”目录之中成功配置了分布式客户端并且成功运行,那么我们”appServer\xclient\files”为基础配置一个自升级服务。      打开”appServer\xclient\files\update.ini”文件进行修改: 1: # AgileEAS.Net 平台升级控件文件。 2:  3: [config] 4:  5: allow = 0 6: application = EAS.WinClient.Start.exe 7: url = net.tcp://localhost:6607/eas/services/EAS.UpdateService     其中allow表示是否升级,url为升级服务地址,地址组成为wcf协议net.tcp://或http://+主机名称为IP+端口号+/eas/services/eas.updateservice,application表示升级完成之后启动运行的程序,我们根据第三节的配置修改如下: 1: # AgileEAS.Net 平台升级控件文件。 2:  3: [config] 4:  5: allow = 1 6: application = EAS.WinClient.Start.exe 7: url = net.tcp://localhost:6607/eas/services/EAS.UpdateService     然后我们删除目录里面的临时文件夹“Data”和“logs”,进行”appServer\xclient”,运行目录之中的”EAS.SmartUpdateConfig.exe“程序:      ”EAS.SmartUpdateConfig.exe“程序是AgileEAS.NET  SOA 中间件平台的升级配置程序,即当我们的应用的程序文件发生了新级和变更,需要把文件复制”appServer\xclient\files”目录之中,并且运行”EAS.SmartUpdateConfig.exe“程序以生成升级配置文件,升级配置文件存储在”appServer\xclient\conig”目录之中的”SmartUpdate.xml“文件之中,其内容如下: 1: <?xml version="1.0" encoding="utf-8"?> 2: <SmartConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 3: <URI>http://www.smarteas.net/</URI> 4: <Name>AgileEAS.NET SOA平台升级配置文件</Name> 5: <Description>用于AgileEAS.NET SOA平台SmartClient/ActiveX运行容器模块升级之用</Description> 6: <StartEx /> 7: <Time>2013-10-16T08:56:44.67765+08:00</Time> 8: <Files> 9: <SmartFile> 10: <FileName>AgileIM.Client.exe</FileName> 11: <Version>1.0.0.0</Version> 12: <Time>2013-10-15T16:59:23.5252+08:00</Time> 13: </SmartFile> 14: <SmartFile> 15: <FileName>AgileIM.Client.exe.config</FileName> 16: <Time>2013-08-27T12:10:12.0756571+08:00</Time> 17: </SmartFile> 18: <SmartFile> 19: <FileName>AgileIM.Contracts.dll</FileName> 20: <Version>1.0.0.0</Version> 21: <Time>2013-10-12T19:50:18.155+08:00</Time> 22: </SmartFile> 23: <SmartFile> 24: <FileName>AgileIM.Service.dll</FileName> 25: <Version>1.0.0.0</Version> 26: <Time>2013-10-15T16:59:24.5722599+08:00</Time> 27: </SmartFile> 28: <SmartFile> 29: <FileName>AxInterop.grdesLib.dll</FileName> 30: <Version>5.0.0.0</Version> 31: <Time>2013-10-12T19:50:02.442+08:00</Time> 32: </SmartFile> 33: <SmartFile> 34: <FileName>AxInterop.grproLib.dll</FileName> 35: <Version>5.0.0.0</Version> 36: <Time>2013-10-12T19:50:02.975+08:00</Time> 37: </SmartFile> 38: <SmartFile> 39: <FileName>EAS.ActiveXForm.ClientClasp.AddIn.dll</FileName> 40: <Version>1.0.0.0</Version> 41: <Time>2013-10-15T17:00:44.6468399+08:00</Time> 42: </SmartFile> 43: <SmartFile> 44: <FileName>EAS.BPM.Activities.dll</FileName> 45: <Version>1.1.0.0</Version> 46: <Time>2013-10-15T16:59:38.4650545+08:00</Time> 47: </SmartFile> 48: <SmartFile> 49: <FileName>EAS.BPM.BLL.Host.dll</FileName> 50: <Version>1.0.0.0</Version> 51: <Time>2013-10-15T17:00:41.6456682+08:00</Time> 52: </SmartFile> 53: <SmartFile> 54: <FileName>EAS.BPM.WinUI.dll</FileName> 55: <Version>2.0.0.0</Version> 56: <Time>2013-10-15T16:59:45.0194294+08:00</Time> 57: </SmartFile> 58: <SmartFile> 59: <FileName>eas.client.ini</FileName> 60: <Time>2013-10-15T21:22:56.5866492+08:00</Time> 61: </SmartFile> 62: <SmartFile> 63: <FileName>EAS.Configure.exe</FileName> 64: <Version>2.0.0.0</Version> 65: <Time>2013-10-15T16:59:27.6444356+08:00</Time> 66: </SmartFile> 67: <SmartFile> 68: <FileName>EAS.Configure.exe.config</FileName> 69: <Time>2013-04-15T19:59:09.4420283+08:00</Time> 70: </SmartFile> 71: <SmartFile> 72: <FileName>EAS.Data.Controls.dll</FileName> 73: <Version>1.0.0.0</Version> 74: <Time>2013-10-15T17:36:07.4252559+08:00</Time> 75: </SmartFile> 76: <SmartFile> 77: <FileName>EAS.Data.dll</FileName> 78: <Version>5.0.0.0</Version> 79: <Time>2013-10-15T16:59:34.241813+08:00</Time> 80: </SmartFile> 81: <SmartFile> 82: <FileName>EAS.Data.Provider.dll</FileName> 83: <Version>5.0.0.0</Version> 84: <Time>2013-10-15T16:59:59.6222646+08:00</Time> 85: </SmartFile> 86: <SmartFile> 87: <FileName>EAS.Distributed.dll</FileName> 88: <Version>5.0.0.0</Version> 89: <Time>2013-10-15T17:00:39.8145635+08:00</Time> 90: </SmartFile> 91: <SmartFile> 92: <FileName>EAS.Explorer.BLL.Contracts.dll</FileName> 93: <Version>5.0.0.0</Version> 94: <Time>2013-10-12T19:50:17.932+08:00</Time> 95: </SmartFile> 96: <SmartFile> 97: <FileName>EAS.Explorer.BLL.Host.dll</FileName> 98: <Version>5.0.0.0</Version> 99: <Time>2013-10-15T17:00:14.297104+08:00</Time> 100: </SmartFile> 101: <SmartFile> 102: <FileName>EAS.Explorer.dll</FileName> 103: <Version>5.0.0.0</Version> 104: <Time>2013-10-12T19:50:16.931+08:00</Time> 105: </SmartFile> 106: <SmartFile> 107: <FileName>EAS.Explorer.Entities.dll</FileName> 108: <Version>5.0.0.0</Version> 109: <Time>2013-10-15T17:00:16.9642565+08:00</Time> 110: </SmartFile> 111: <SmartFile> 112: <FileName>EAS.Explorer.Res.dll</FileName> 113: <Version>1.1.0.0</Version> 114: <Time>2013-10-12T19:50:50.7467432+08:00</Time> 115: </SmartFile> 116: <SmartFile> 117: <FileName>EAS.Explorer.WinUI.dll</FileName> 118: <Version>5.0.0.0</Version> 119: <Time>2013-10-15T16:59:56.5250875+08:00</Time> 120: </SmartFile> 121: <SmartFile> 122: <FileName>EAS.FormDesigner.exe</FileName> 123: <Version>5.0.0.0</Version> 124: <Time>2013-10-15T16:59:46.1954967+08:00</Time> 125: </SmartFile> 126: <SmartFile> 127: <FileName>EAS.GReport.Controls.dll</FileName> 128: <Version>1.0.0.0</Version> 129: <Time>2013-10-15T17:00:07.2997038+08:00</Time> 130: </SmartFile> 131: <SmartFile> 132: <FileName>EAS.MicroKernel.dll</FileName> 133: <Version>5.0.0.0</Version> 134: <Time>2013-10-15T16:59:29.7545563+08:00</Time> 135: </SmartFile> 136: <SmartFile> 137: <FileName>EAS.Monitor.dll</FileName> 138: <Version>1.0.0.0</Version> 139: <Time>2013-10-12T19:50:10.901+08:00</Time> 140: </SmartFile> 141: <SmartFile> 142: <FileName>EAS.NLB.Monitor.exe</FileName> 143: <Version>1.0.0.0</Version> 144: <Time>2013-10-15T17:00:08.143752+08:00</Time> 145: </SmartFile> 146: <SmartFile> 147: <FileName>EAS.NLB.Server.exe</FileName> 148: <Version>1.0.0.0</Version> 149: <Time>2013-10-15T17:00:16.3272201+08:00</Time> 150: </SmartFile> 151: <SmartFile> 152: <FileName>EAS.OrmDesigner.exe</FileName> 153: <Version>5.0.0.0</Version> 154: <Time>2013-10-15T16:58:10.8720445+08:00</Time> 155: </SmartFile> 156: <SmartFile> 157: <FileName>EAS.OrmDesigner.exe.config</FileName> 158: <Time>2012-01-07T11:28:39.2362631+08:00</Time> 159: </SmartFile> 160: <SmartFile> 161: <FileName>EAS.Report.Controls.dll</FileName> 162: <Version>3.0.0.0</Version> 163: <Time>2013-10-15T17:00:11.6179508+08:00</Time> 164: </SmartFile> 165: <SmartFile> 166: <FileName>EAS.SmartUpdater.exe</FileName> 167: <Version>1.0.0.0</Version> 168: <Time>2013-10-15T16:59:54.662981+08:00</Time> 169: </SmartFile> 170: <SmartFile> 171: <FileName>EAS.SOA.Monitor.exe</FileName> 172: <Version>1.0.0.0</Version> 173: <Time>2013-10-15T17:00:20.4044533+08:00</Time> 174: </SmartFile> 175: <SmartFile> 176: <FileName>EAS.ThirdParty.Controls.dll</FileName> 177: <Version>1.0.0.0</Version> 178: <Time>2013-10-12T19:49:55.311+08:00</Time> 179: </SmartFile> 180: <SmartFile> 181: <FileName>EAS.WinClient.dll</FileName> 182: <Version>5.1.0.0</Version> 183: <Time>2013-10-15T17:00:24.8407071+08:00</Time> 184: </SmartFile> 185: <SmartFile> 186: <FileName>EAS.WinClient.Start.exe</FileName> 187: <Version>5.0.0.0</Version> 188: <Time>2013-10-15T16:59:14.0236565+08:00</Time> 189: </SmartFile> 190: <SmartFile> 191: <FileName>EAS.WinClient.Start.exe.config</FileName> 192: <Time>2013-10-15T21:20:03.86277+08:00</Time> 193: </SmartFile> 194: <SmartFile> 195: <FileName>EAS.Windows.dll</FileName> 196: <Version>5.0.0.0</Version> 197: <Time>2013-10-15T17:00:30.9600571+08:00</Time> 198: </SmartFile> 199: <SmartFile> 200: <FileName>EAS.Wpf.Controls.dll</FileName> 201: <Version>1.0.0.0</Version> 202: <Time>2013-10-15T17:00:38.075464+08:00</Time> 203: </SmartFile> 204: <SmartFile> 205: <FileName>grdes50.dll</FileName> 206: <Version>5, 8, 13, 620</Version> 207: <Time>2013-06-24T23:11:32+08:00</Time> 208: </SmartFile> 209: <SmartFile> 210: <FileName>gregn50.dll</FileName> 211: <Version>5, 8, 13, 620</Version> 212: <Time>2013-06-24T23:10:26+08:00</Time> 213: </SmartFile> 214: <SmartFile> 215: <FileName>ICSharpCode.AvalonEdit.dll</FileName> 216: <Version>4.3.1.9429</Version> 217: <Time>2013-10-12T19:50:15.045+08:00</Time> 218: </SmartFile> 219: <SmartFile> 220: <FileName>Interop.grdesLib.dll</FileName> 221: <Version>5.0.0.0</Version> 222: <Time>2013-10-12T19:50:01.56+08:00</Time> 223: </SmartFile> 224: <SmartFile> 225: <FileName>Interop.grproLib.dll</FileName> 226: <Version>5.0.0.0</Version> 227: <Time>2013-10-12T19:50:02.088+08:00</Time> 228: </SmartFile> 229: <SmartFile> 230: <FileName>itextsharp.dll</FileName> 231: <Version>4.1.2.0</Version> 232: <Time>2011-04-19T10:03:14+08:00</Time> 233: </SmartFile> 234: <SmartFile> 235: <FileName>lua51.x64.dll</FileName> 236: <Time>2013-09-30T13:25:51.209+08:00</Time> 237: </SmartFile> 238: <SmartFile> 239: <FileName>lua51.x86.dll</FileName> 240: <Time>2013-09-30T13:27:36.369897+08:00</Time> 241: </SmartFile> 242: <SmartFile> 243: <FileName>LuaInterface.x64.dll</FileName> 244: <Version>2.0.4.24313</Version> 245: <Time>2013-09-30T13:30:27.8847071+08:00</Time> 246: </SmartFile> 247: <SmartFile> 248: <FileName>LuaInterface.x86.dll</FileName> 249: <Version>2.0.4.24313</Version> 250: <Time>2013-09-30T13:30:27.8937076+08:00</Time> 251: </SmartFile> 252: <SmartFile> 253: <FileName>Microsoft.Data.ConnectionUI.Dialog.dll</FileName> 254: <Version>8.0.50727.42 (RTM.050727-4200)</Version> 255: <Time>2011-04-19T14:03:22+08:00</Time> 256: </SmartFile> 257: <SmartFile> 258: <FileName>Microsoft.Data.ConnectionUI.dll</FileName> 259: <Version>8.0.50727.42 (RTM.050727-4200)</Version> 260: <Time>2011-04-19T14:03:22+08:00</Time> 261: </SmartFile> 262: <SmartFile> 263: <FileName>Microsoft.XmlNotepad.dll</FileName> 264: <Version>2.5.3145.19740</Version> 265: <Time>2008-08-11T11:58:04+08:00</Time> 266: </SmartFile> 267: <SmartFile> 268: <FileName>MongoDB.dll</FileName> 269: <Version>0.90.0.1</Version> 270: <Time>2012-03-16T19:11:12.6696083+08:00</Time> 271: </SmartFile> 272: <SmartFile> 273: <FileName>MySql.Data.dll</FileName> 274: <Version>5.0.9.0</Version> 275: <Time>2008-04-14T12:04:28+08:00</Time> 276: </SmartFile> 277: <SmartFile> 278: <FileName>NetronGraphLib.dll</FileName> 279: <Version>2.2.3328.30433</Version> 280: <Time>2009-02-10T16:54:28+08:00</Time> 281: </SmartFile> 282: <SmartFile> 283: <FileName>RdlDesigner.dll</FileName> 284: <Version>3.9.7.0</Version> 285: <Time>2013-10-12T19:50:00.225+08:00</Time> 286: </SmartFile> 287: <SmartFile> 288: <FileName>RdlEngine.dll</FileName> 289: <Version>3.9.7.0</Version> 290: <Time>2013-10-12T19:49:53.522+08:00</Time> 291: </SmartFile> 292: <SmartFile> 293: <FileName>RdlViewer.dll</FileName> 294: <Version>3.9.6.0</Version> 295: <Time>2013-10-12T19:49:56.182+08:00</Time> 296: </SmartFile> 297: <SmartFile> 298: <FileName>System.Data.SQLite.DLL</FileName> 299: <Version>1.0.66.0</Version> 300: <Time>2010-04-18T13:34:12+08:00</Time> 301: </SmartFile> 302: <SmartFile> 303: <FileName>System.Workflow.Activities.dll</FileName> 304: <Version>4.0.30319.1 (RTMRel.030319-0100)</Version> 305: <Time>2010-03-18T19:31:26+08:00</Time> 306: </SmartFile> 307: <SmartFile> 308: <FileName>System.Workflow.ComponentModel.dll</FileName> 309: <Version>4.0.30319.1 (RTMRel.030319-0100)</Version> 310: <Time>2010-03-18T19:31:26+08:00</Time> 311: </SmartFile> 312: <SmartFile> 313: <FileName>System.Workflow.Runtime.dll</FileName> 314: <Version>4.0.30319.1 (RTMRel.030319-0100)</Version> 315: <Time>2010-03-18T19:31:26+08:00</Time> 316: </SmartFile> 317: <SmartFile> 318: <FileName>update.ini</FileName> 319: <Time>2013-10-15T21:32:33.0976238+08:00</Time> 320: </SmartFile> 321: <SmartFile> 322: <FileName>WF.Demo.DAL.dll</FileName> 323: <Version>1.0.0.0</Version> 324: <Time>2013-10-12T19:49:57.9107211+08:00</Time> 325: </SmartFile> 326: <SmartFile> 327: <FileName>WF.Demo.UI.dll</FileName> 328: <Version>1.0.0.0</Version> 329: <Time>2013-10-12T19:50:49.1896541+08:00</Time> 330: </SmartFile> 331: </Files> 332: </SmartConfig>      ”SmartUpdate.xml“文件为平台的升级配置文件,其本质是存储一个文件及其最后修改时间的一个清单,客户端也持有这么一份清单,客户端会依据自己持有的清单与服务器上的清单比对以判定需要升级更新那些文件。       ”appServer\xclient”为AgileEAS.NET SOA 中间件的服务端升级目录,这个路径是不能更改的,在AgileEAS.NET SOA 中间件有服务设计之中更新了硬性的规定,其中”appServer\xclient\files”目录其本质就是客户端的最新复制。      当我们完成以上配置之后,我们来验证一个自动升级是否可以使用,我们把”appServer\xclient\files”复制到其他地方,比如我们复制到“D:\”并重命名为”d:\eas.client”,如下图:      然后我们运行“d:\eas.client\eas.winclient.start.exe”,系统有如下提示:      我们点击“确定”将会启动升级程序进行升级:      升级完成之后点击“关闭”,系统将会自己启动“d:\eas.client\eas.winclient.start.exe”,打开登录窗口:      输入用户:Administrator密码:sa,点击登录,打开主界面: 六、联系我们      为了完善、改进和推广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。

Tags:

.NET | AgileEAS.NET | C# | ORM | SOA | Socket | 中间件 | 企业应用架构 | 分布式 | 框架 | 消息中间件 | 设计模式 | 下载

最新评论

声明

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

© Copyright 2011