插件式架构设计实践:插件式系统架构设计简介

本系列博文将使用微软RIA技术解决方案Silverlight以及扩展性管理框架Managed Extensibility Framework(MEF),以插件式架构设计为导线,分享本人在从事基于微软Silverlight技术构建的RIA系统中实施插件式系统架构设计的相关技术和经验。鉴于本人能力有限,如有不妥之处请各位朋友指正,大家共同学习、进步,谢谢!

 

  软件的工业化使得软件复用已经从通用类库进化到了面向领域的应用框架。应用框架强调的是软件的设计重用性和系统的课扩展性,以缩短大型应用软件系统的开发周期,提高开发质量。应用软件开发的未来就在于提供一个开放的体系结构,以方便中间件的选择、组装和集成,应用框架的重用已成为软件开发生产中最有效的重用方式之一。面对这种发展趋势,呼之欲出的便是一种全新的、开放性的、高扩展性的架构体系,这里我将其命名为插件式架构(或许与别人口中的插件式架构有所区别)。

 

一、插件式架构设计概述

  插件式架构设计近年来非常流行,其中Eclipse起了推波助澜的作用,提到插件式就会不由自主的想到饿Eclipse。其实插件式设计并不是什么新事物,早在几十年前就有了。像X-Server就是基于插件式设计的,除了核心功能外,它所有的扩展功能和设备驱动都是以插件方式加入进来的。

 

  基于插件的设计好处很多,把扩展功能从框架中剥离出来,降低了框架的复杂度,让框架更容易实现。扩展功能与框架以一种很松的方式耦合,两者在保持接口不变的情况下,可以独立变化和发布。公开插件接口,让第三方有机会扩展应用程序的功能,有财大家一起发。另外,还可以让开源与闭源共存于一套软件,你的插件是开源还是闭源,完全由你自己决定。基于插件设计并不神秘,相反它比起一团泥的设计更简单,更容易理解。各种基于插件设计的架构都有自己的特色,但从总体架构上看,其模型都大同小异。

 

   插件式架构设计中主要包括:插件框架、插件契约(服务)以及插件组件三部分组成。

  1、插件框架:组织和管理系统插件的下载、装载、组合、实例化以及销毁,并提供整套完整的与后台服务通信的操作接口等。

  2、插件契约(服务):插件契约以服务接口的形式存在,系统的所有插件全部通过实现系统框架统一的接口规范,偏于有效的组织、管理插件对象。

  3、插件组件:插件组件既为具体的插件程序,实现了插件契约服务的一个独立的程序。

 

  对于插件式应用框架的开发,关键是要识别出框架中的通用点和扩展点。基于这个原则,对于开发插件式应用框架的方法和步骤主要分以下三点:

  1、分析并提取出框架中的通用点

  2、分析并提取出框架中的扩展点

  3、在应用框架的扩展点处根据系统配置信息动态加载实际需要的程序集(应用插件),动态创建实例对象并调用其服务。

 

二、插件式架构技术选型

  在RIA(Silverlight、Flex等)技术发热的现在,很多企业已经开始使用RIA技术解决方案进行企业管理系统建设,采用RIA技术进行系统建设的最大优点就是将后台处理服务程序和前台UI展现实现了完全分离,且后台实现也不受到任何技术活平台的限制,使系统的整体建设灵活性增强、以及提高对其他外部系统的集成能力。之所里选择微软RIA技术解决方案Silverlight技术来实现插件式系统架构,主要取决于以下优点:

  1、Silverlight发布的动态连接库(.dll)或程序包(.xap)更容易实现插件式架构。

  2、Silverlight支撑Socket的及时消息通信。

  3、Silverlight开发与Blend界面设计完美结合,更容易、快捷的实现UI风格。

  4、基于HttpService/WebService/WCF的分布式通信服务借口,提高多系统异构集成能力。

  5、应用统一的系统样式,更容易、方便的实现系统多UI风格。

  6、友好的全屏模式及独特的OOB(Out-Of-Browser)模式支持。

  7、更多......

 

 三、插件式架构设计的优点

  可以说任何形式的架构设计实践工作无非就是从负责、繁琐的的研发过程中寻找一种相对方便、灵活、稳定、高扩展性的以及更加简单的一种新型技术实现方式,从而提高项目的整体开发进度和质量,减少开发人员的工作压力,间接的提高整个项目团队的工作效率。

  采用插件式架构设计的优点主要体现在以下几个方面:

  1)、降低系统各模块之间的互依赖性

    在进行插件式开发中,任何一个系统功能模块、通用用户界面以及最小的图标等都可以插件的方式进行开发,从而提高了通用功能模块的重用性;各个功能进行独立开发,相互之间不存在互依赖性,使各个独立的功能都可以单独运行,也可以通过插件框架进行托管运行,从而提高了整个系统的灵活性;对于修改功能模块也不会影响到其他插件模块的正常运行,降低了系统的维护难度,提高了系统的可扩展性。 

  2)、系统模块独立开发、部署、维护

  每个功能模块都可以按照插件契约服务接口所定义的服务接口以及相关的元数据的形式当做一个插件进行独立开发,开发完成编译后可独立运行,也可通过插件框架进行托管运行。理论上插件组件是不应该可以单独运行的,按照插件式架构原理来说,必须是通过插件管家托管才能运行。实际的开发中或许会因为各种的业务需求不同而不同,具体应该如何对插件开发进行约束,还得结合实际项目需求而定。

 

  3)、根据需求动态的组装、分离系统

     每个功能模块都可以当做一个插件进行开发,通过统一的配置文件维护插件包的部署信息,插件框架可根据活动情况动态从服务器上下载相应的xap插件包或者是.dll的动态库文件到客户端进行插件初始化创建,插件到框架的组合等,插件框架能够灵活的管理各个插件实例以及插件之间的通信机制,也支持插件的卸载。

 

三、插件式架构组件(MEF)

  在MEF之前,人们已经提出了许多依赖注入框架来解决应用的扩展性问题,比如OSGI 实现以Spring 等等。在 Microsoft 的平台上,.NET Framework 自身内部包含组件模型和 System.Addin。同时存在若干种开源解决方案,包括 SharpDevelop 的 SODA 体系结构和“控制反转”容器(如 Castle Windsor、Structure Map、Spring.Net 以及Unity)。

  虽然.NET平台下,包括MS在内的各种方案已经遍地开花,但是MEF是第一个随着CLR发布的解决方案。

官方说法: Managed Extensibility Framework(MEF)是.NET平台下的一个扩展性管理框架,它是一系列特性的集合,包括依赖注入(DI)以及Duck Typing等。MEF为开发人员提供了一个工具,让我们可以轻松的对应用程序进行扩展并且对已有的代码产生最小的影响,开发人员在开发过程中根据功能要求定义一些扩展点,之后扩展人员就可以使用这些扩展点与应用程序交互;同时MEF让应用程序与扩展程序之间不产生直接的依赖,这样也允许在多个具有同样的扩展需求之间共享扩展程序。

 

  本系列文章所讨论的插件式框架的设计采用.NET 4.0中的MEF框架作为核心组件,MEF的详细可查看我写的《MEF程序设计指南》系列博文。

 

推荐资料:

  《MEF程序设计指南》:http://www.cnblogs.com/beniao/archive/2010/08/11/1797537.html

  《Silverlight动画开发教程》:http://www.cnblogs.com/beniao/archive/2010/04/04/1703992.html

  《一步一步学Silverlight教程》:http://www.cnblogs.com/Terrylee/archive/2008/03/09/Silverlight2-step-by-step-Tutorials.html

  《Silverlight MSDN Webcast》:http://www.msdnwebcast.net/webcast/2098.aspx



插件式架构设计实践二:基于Silverlight的B/S插件式架构设计方法

架构设计并不是项简单的工作,架构设计最终的产物则是由不同的框架组件构成一套高扩展、稳定、安全、通用的开发框架平台。或许一提到架构设计,很多朋友都联想到了常用的框架组件:数据访问组件、日志组件、事务组件、消息组件、配置组件以及工具库等。然而,本系列文章的中心“插件式框架设计”已经偏离了常规的框架设计方法论,它只是一套用于改善系统功能模块组织结构,灵活开发、部署、维护的一套方法论,其中的每个功能模块的具体实现还是走常规的开发框架,它自身的职责则主要是负责根据配置文件实现系统功能模块的组装,灵活的卸载某个部件以及各部件之间如何通信等。

  

  本篇将和大家分享基于Silverlight的B/S插件式架构设计的方法,文中的内容仅仅只是我个人知识、经验的总结,如有不妥之处还望各位读者给予指正,大家共同学习,进步。

 

  对于Silverlight项目而言,前端系统需要后台服务接口的支撑才能完成数据通信访问、储存数据的的功能。通常需要给Silverlight前端提供相应的数据通信接口,可分为多种方式提供,常用的数据通信接口分别有Socket、HttpHandler、WebService以及WCF等方式。详细的架构模型如下图所示:      

        

 

  系统后台采取的技术架构为是竖向分成架构模式+横向扩展架构模式相结合,分成架构模式也就是众所周知的三层/多层架构,这里不做详细介绍;横向扩展架构模式则为支持横向业务扩展的架构模式,所有业务组件(我通常称其为:业务插件)通过实现统一的业务服务接口来扩展系统业务功能,系统框架中的业务组件容器(我通常称其为:业务插件容器)使用统一的业务服务接口灵活的管理业务组件,实现各组件之间的数据通信、事件通知、以及灵活的构造、销毁业务组件实例。总上述,这种架构模式我便称其为插件式架构设计。

 

  插件式架构设计的框架能够灵活的横向扩展业务组件的扩展开发,管理业务组件的生命周期等,然而对于RIA应用系统来说,他只需要依赖一个或多个通信接口实现数据通信,不用关心服务后台的架构以及具体是实现细节。需要注重点则是关于系统前端的框架架构设计,一套基于Silverlight技术的插件式架构设计方法,通过插件框架灵活的加载、组合、初始化并进行托管运行系统插件模块,是我们期望达到的目的。如上所述,插件式框架的架构图大致如下所示:

        

 

  系统前端的核心架构受到所采用的技术方案的影响,会演化出不同的架构设计方法和架构风格, 如前面所说我们采用的是RIA的技术Silverlight来进行技术构建,那么在进行系统架构设计中定会受到Silverlight技术自身的一些限制,以至于我们的设计不能按照常规的方法,方式去实现。

 

  Silverlight能够为用户提供高用户体验的软件界面,以及传统的Web应用实现不了的很多功能,且也有很多的局限性,系统功能模块过多导致发布出来的应用程序包(.xap)过大,导致系统运行中初始化缓慢等诸多问题。我们需要一种全新的、开放性的、高扩展性的架构体系,来缓解这种因为技术自身的缺陷造成的诸多问题,可以实现快速的启动应用程序初始化界面,根据配置动态组装系统功能模块,以及灵活的扩展新的系统功能模块等功能,我将这种架构体系命名为插件式架构体系(或许与别人口中的插件式架构有所区别)。

        

 

  如上图所示,描述了插件框架的框架结构,框架由插件容器、插件契约和插件组件(业务功能插件)三大部分组成,扩展开发新的插件组件需要实现插件契约接口,以便插件容器可以灵活的控制插件组件。关于这三大组成部分的作用请查看《插件式架构设计简介》,本篇对基于Silverlight插件式架构设计方法进行了介绍,下一篇将详细介绍插件式架构设计的解决方案。

 

推荐资料:

  《MEF程序设计指南》:http://www.cnblogs.com/beniao/archive/2010/08/11/1797537.html

  《Silverlight动画开发教程》:http://www.cnblogs.com/beniao/archive/2010/04/04/1703992.html

  《一步一步学Silverlight教程》:http://www.cnblogs.com/Terrylee/archive/2008/03/09/Silverlight2-step-by-step-Tutorials.html

  《Silverlight MSDN Webcast》:http://www.msdnwebcast.net/webcast/2098.aspx


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453669.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第十章 动态选路协议

RIP 缺陷: Routing Information Protocol RIP没有子网的概念在路由器或链路发生故障后,需要很长的一段时间才能稳定下来采用跳数作为路由度量忽略了其他一些应该考虑的因素度量最大值为15则限制了可以使用RIP的网络的大小OSPF Open Shortest Path First …

五种方式让你在java中读取properties文件内容不再是难题

2019独角兽企业重金招聘Python工程师标准>>> 方式1.通过context:property-placeholder加载配置文件jdbc.properties中的内容 <context:property-placeholder location"classpath:jdbc.properties" ignore-unresolvable"true"/> 上面的配置…

hive metastore mysql_Hive MetaStore的结构

本篇主要是介绍Hive在MySQL中存储的源数据的表结构。Hive MetaStore 数据库表结构图test.pngTBLS记录数据表的信息字段解释TBL_ID在hive中创建表的时候自动生成的一个id&#xff0c;用来表示&#xff0c;主键CREATE_TIME创建的数据表的时间&#xff0c;使用的是时间戳DBS_ID这个…

修炼一名程序员的职业水准

程序就是一系列按步骤进行的操作序列&#xff0c;它有好多种级别&#xff0c;比如最低级的微程序、次低级的汇编程序、高级的各种编程语言程序、最高级的脚本语言程序&#xff0c;也许我列的不对&#xff0c;但没关系&#xff0c;我要说的是不管是那个级别的程序&#xff0c;其…

Rails开发细节《一》

常用命令 rails new new_app cd new_app rake db:create rails server rails generate controller Blog action1 action2 rails generate scaffold Product title:string description:textrails generate model Comment commenter:string body:text post:references rake db…

latex中怎样使公式居中_LaTeX_多行公式对齐居中的同时选择性的加编号

标签: 【转载请注明出处】http://www.cnblogs.com/mashiqi 2016/10/20 一年多没写博文了。今天写一个短的,记录一下使用LaTeX的一些经验。 如何居中多行的公式呢?我试过很多种方法后,觉得下面这个最好用: 1 \begin{flalign*}2 % In this way (this arrange of &), the…

[SDOI2008]Cave 洞穴勘测

题目描述 辉辉热衷于洞穴勘测。 某天&#xff0c;他按照地图来到了一片被标记为JSZX的洞穴群地区。经过初步勘测&#xff0c;辉辉发现这片区域由n个洞穴&#xff08;分别编号为1到n&#xff09;以及若干通道组成&#xff0c;并且每条通道连接了恰好两个洞穴。假如两个洞穴可以通…

Linux指令大全

名称&#xff1a;cat 使用权限&#xff1a;所有使用者 使用方式&#xff1a;cat [-AbeEnstTuv] [--help] [--version] fileName 说明&#xff1a;把档案串连接后传到基本输出&#xff08;萤幕或加 > fileName 到另一个档案&#xff09; 参数&#xff1a; -n 或 --number 由 …

mysql宏参数_C语言带参数的宏定义

C语言允许宏带有参数。在宏定义中的参数称为“形式参数”&#xff0c;在宏调用中的参数称为“实际参数”&#xff0c;这点和函数有些类似。对带参数的宏&#xff0c;在展开过程中不仅要进行字符串替换&#xff0c;还要用实参去替换形参。带参宏定义的一般形式为&#xff1a;#de…

自定义过滤器

首先在web.xml中对过滤器的监听 1 <!-- 自定义过滤器 -->2 <filter>3 <filter-name>AscFilter</filter-name>4 <filter-class>com.llh.filter.AscFilter</filter-class>5 </filter>6 <filter-mapping>7 …

[MS Sql Server术语解释]预读,逻辑读,物理读

在MSSQL中使用 SET STATISTICS IO ON 打开IO统计功能之后&#xff0c;每次执行完一个查询就会在下面的【消息】面板中显示本次查询IO的统计信息。 (0 行受影响) 表 demo。扫描计数 1&#xff0c;逻辑读取 622 次&#xff0c;物理读取 0 次&#xff0c;预读 0 次&#xff0c;lob…

mysql 数据库查询测试_MySQL查询测试经验

测试表geoinfo,整个表超过1100万行&#xff0c;表结构&#xff1a;CREATE TABLEgeoinfo (objectidint(11) NOT NULLAUTO_INCREMENT ,latitudedouble NOT NULL,longitudedouble NOT NULL,occupancybit(1) NOT NULL,timedatetime NOT NULL,cabidvarchar(16) NOT NULL,PRIMARY KEY…

更改阿里云域名解析台里某个域名绑定的IP之后不能解析到新IP

1.由于要撤销一组负载均衡&#xff0c;所以需要更改阿里云域名解析台里某个域名由原来绑定的负载均衡公网IP换到服务器公网IP 2.在服务器上nginx指定了域名访问&#xff0c;开启nginx服务 3.暂时关闭该组负载均衡服务 4.实现通过服务器IP可以访问项目&#xff0c;域名访问不了 …

秒懂数据类型的真谛—Python基础前传(4)

一切编程语言都是人设计的&#xff0c;既然是人设计的&#xff0c;那么设计各种功能的时候就一定会有它的道理&#xff0c;那么设计数据类型的用意是什么呢&#xff1f; (一) 基本数据类型 基本数据类型&#xff1a; 数字 int字符串 str布尔值 bool列表 list元组 tuple字典 dic…

Linux 系统命令及其使用详解(大全)

Linux 系统命令及其使用详解(大全) (来源: 中国系统分析员) cat cd   chmod chown   cp cut   名称&#xff1a;cat   使用权限&#xff1a;所有使用者   使用方式&#xff1a;cat[-AbeEnstTuv] [--help] [--version] fileName   说明&#xff1a;把档案串连…

wordpress配置SMTP服务发送邮件

使用SMTP服务发送邮件&#xff0c;需要使用一个插件&#xff1a;http://wordpress.org/extend/plugins/wp-mail-smtp/ 下载完成以后解压到plugin目录&#xff0c;然后在插件中启用这个插件。 配置SMTP服务 SMTP的选项 发送一封测试邮件吧 >>> 本文转自齐师傅博客园博客…

使用rpm包安装mysql_centos下利用rpm包安装mysql

安装mysql步骤&#xff1a;第一、 http://www.mysql.com/downloads/mysql-4.0.html下载MySQL-client-5.0.96-1.glibc23.x86_64.rpm和MySQL-server-5.0.96-1.glibc23.x86_64.rpm第二、安装服务端&#xff1a;[rootlfl01 mysql]# rpm -ivh MySQL-server-5.1.73-1.glibc23.i386.rp…

maxN - 返回数组中N个最大元素 minN - 返回数组中N个最小元素

从提供的数组中返回 n 个最小元素。如果 n 大于或等于提供的数组长度&#xff0c;则返回原数组&#xff08;按降序排列&#xff09;。 结合使用Array.sort() 与展开操作符(...) &#xff0c;创建一个数组的浅克隆&#xff0c;并按降序排列。 使用 Array.slice() 以获得指定的元…

Linux 常用命令

Linux之所以受到广大计算机爱好者的喜爱&#xff0c;主要原因有两个&#xff0c;首先它是自由软件&#xff0c;用户不用支付费用就可以使用它&#xff0c;并可根据自己的需要对它进行修改。另外&#xff0c;它具有Unix的全部功能&#xff0c;任何使用Unix系统或想要学习Unix系统…

使用Server 2008新GPO做驱动器映射

在Server 2003的时代&#xff0c;我们为用户做网络驱动器映射(以下就直接称为Map Network Drive&#xff09;, 通常可能有以下的做法. 方法一: 做一个登录脚本&#xff0c;放在DC的netlogon目录&#xff0c;接着在“Active Directory用户和计算机”控制台的用户属性的Logon S…