首页 文章 精选 留言 我的

精选列表

搜索[高并发],共10000篇文章
优秀的个人博客,低调大师

.NET实现之(自己动手写内聚插件系统)

今天跟大家分享一下本人在“.NET简谈构件系统开发模式”一文中提到的软件架构设计思路的具体实现细节。 大家看了我这篇文章后,总问我为什么要起个这么怪异的名字“构件”而不用“插件”。其实这个名字在我脑子漂浮了很久,一直找不到合适的场合用它。 在一本书上是这样解释构件的:构件是可以更换的部件,并且这个部件是由一系列很小的部件组成,同样这些小的部件由更小的部件组成;我为什么要区分插件与构件主要原因是这两个名字所表达的思想不同。插件是可插、可卸的过程,没有强调无限极的递归实现子插件的意思,所以本人将其区分开来;当然也可以将这两种架构用同一名词描述,其实是大同小异了。下面我给大家带来怎么用这种设计思路来开发具体的系统。[王清培版权所有,转载请给出署名] 一:问题分析 在进行开发之前我们需要对整个系统有个分析,插件系统所强调的核心思想是能让所开发出来的系统应变日常需求,在功能升级的时候能很方便的进行更新。但这不是插件系统的最大的好处,我们用传统的三层、MVC开发也能实现这种好处,无非是将DLL文件放到目录下然后在重启就行了。 但是由于插件系统将功能点分的很细,大部分的功能在没有必要的情况下是不需要操作更新的。东西分的越小越好控制,但是开发的成本也随着控制粒度而变大。所以这个平衡点需要我们自己把握,不是所有的项目都适应这种架构。 插件系统是采用面向接口开发而不是面向类开发,在我们系统需求出来之后需要抽取功能点以进行插件抽象。这个时候就是考验一个项目的架构师的设计能力了。设计的不好导致后期开发无法进行下去,这类问题有很多种,比如:接口定义不明确、返回类型不明确、接口的公共部分是否抽象完全,也就是基类实现的是否合理等等;这些问题都很复杂,真正开发大型系统时,这些问题不能马虎,搞不好项目失败。从需求中抽出插件然后进行概要文档的编写、详要文档的编写。在一些大的方面设计文档可能很实用,但是我们程序员知道,一个设计文档不能通用,不是任何系统结构都能相同的设计文档,这就牵扯到了公司的文档编写方面了。如果设计文档无法应付这些复杂的系统结构,可以由架构师编写项目的架构设计文档,只有这样才能让开发人员一目了然,程序员才能发挥自主能动力能力,才能使项目完美收工。 我们刚才讲了,插件系统是采用面向接口设计、开发,也就是面向对象领域所提倡的开发思想。既然我们是以面向接口设计的,那么我们的插件是完全依赖于某些接口,就好比COM一样,你的接口不变,我就能找到你。最大的好处就是如果我的项目是需要第三方去实现的,那么我们的程序集文件DLL不需要签名,而不能由其他人跟换的插件使用签名,这样系统显的很有柔韧性。我喜欢大师们的开发思想,将自己的项目比作大型的机器人,任何部件是可装配、可更换的。不要将自己的项目开发的那么臃肿,那么脆弱。 插件系统对程序员的自身技术要求也是比较高的,这里面纵横交错,都是需要很深厚的技术功底的。都说这个语言好、那个语言好、只要精通什么都好。这个时候就考验你是否真的掌握了这门语言。语言本身是为了满足某些需求而存在的,JS是为了实现HTMLDOM的交互、CSS是为了修饰HTMLDOM、HTML是一种结构表示语言,这样语言的存在和使用都是有方向的,千万不要把语言和语言相比。由于插件自己的耦合几乎为零,这个时候我们都是通过接口进行调用,比如:我在一个接口里面操作了某些功能,同时这些同能要能及时的反馈到另一个插件中去。这样一个小小的功能,就需要我们运用很复杂的调用关系,任何一步处理的不到位,都会给后期的改动带来麻烦,甚至是灾难性的。 二:真实项目解析 我用了这种结构进行了系统开发,前期的构思是很头疼,但是后期的效果很不错的。 我在“.NET简谈构件系统开发模式”一文中已经进行了基本理论的分析,就不在讲了。直接用代码看吧; 1.主程序实现 在主程序要想使用某个插件的时候我们需要用统一的方法或者说是接口吧,能拿到我这个模块所对应的插件;请看代码: ///<summary> ///DataSourceOpen插件接口,上下文使用; ///</summary> BaseComebasecome; ///<summary> ///打开SqlServer数据源 ///</summary> privatevoidTools_Sqlmenu_Click(objectsender,EventArgse) { basecome=NewBaseCome(); (basecomeasDataSourceOpen).PassDataEvent+=newPassDataHandler(FrmDbServer_PassDataEvent); basecome.StartCome(); } privatevoidFrmDbServer_PassDataEvent(List<string>param,paramsstring[]par) { if(par.Length>0) if(!IsOpenSource(par[0])) BindTreeView(param,par); } 这是我的一个菜单的单击事件,这个菜单是主程序中的功能菜单,我需要在主程序中调用相对应的插件;上面的BaseCome是插件基类,实现了所有插件共同的一些特征,便于调用和实现;我在事件中使用了一个NewBaseCome()方法,这个方式是当前窗体中的公共方法,请看代码: ///<summary> ///统一获取构件基类 ///</summary> ///<returns>BaseCome对象</returns> privateBaseComeNewBaseCome() { return(PlugManager.PlugKernelManager.MainEventProcess("http://www.emed.cc/CodeBuilderStudio/Details/DataSourceOpen")asBaseCome); } 我通过这个公共方法获取到当前功能需要用的插件,PlugManager.PlugKernelManager.MainEventProcess()是插件管理器中的一个共有方法,这个方法会根据你传入的XML命名空间获取配置文件中的插件配置节点名称,你可能会问:“为什么要用这种结构的XML配置文件?”。其实我的个人习惯是使用有结构意义的XML文件,这是其一。其二是,我必须确定插件配置文件的唯一性,由于插件系统支持第三方实现,所以我更本不知道插件的名称是什么,所以我用XML命名空间进行规定。当我需要的时候,我直接通过XML命名空间就能获取到当前插件了。我们一起来看插件管理器的实现,请看代码: 2.插件管理器实现 ///<summary> ///主程序发生事件,需要启动相应构件 ///</summary> ///<paramname="xmlnamespace">构件所属的命名空间</param> ///<returns>本构件加载是否成功true:成功,false失败</returns> publicstaticobjectMainEventProcess(stringxmlnamespace) { try { PlugDomdom=domcollection[xmlnamespace]; if(dom==null) thrownewSystem.Exception( "在系统当前上下文构件集合中未能查找出"+xmlnamespace+"命名空间构件,请检查构件配置文件LoadConfig.xml是否进行了相应的设置;"); ComeLoadEvent(dom.Assembly);//构件初始化成功 returnReflectionDomObject(dom);//通过反射DLL文件,启动实现构件 } catch(Exceptionerr) { ComeCommonMethod.LogFunction.WritePrivateProfileString( "MainEventProcess",err.Source+"->"+err.TargetSite,err.Message,Environment.CurrentDirectory+"\\PlugManagerLog.ini"); returnnull; } } ///<summary> ///主程序发生事件,释放构件资源 ///</summary> ///<paramname="comeobject">构件对象</param> publicstaticvoidMainDisposeProcess(objectcomeobject) { try { (comeobjectasMain.Interface.ComeBaseModule.BaseCome).Dispose(); ComeExitEvent((comeobjectasMain.Interface.ComeBaseModule.BaseCome).ComeName); } catch(Exceptionerr) { ComeCommonMethod.LogFunction.WritePrivateProfileString( "MainDisposeProcess",err.Source+"->"+err.TargetSite,err.Message,Environment.CurrentDirectory+"\\PlugManagerLog.ini"); } } 由于管理器中的代码比较多,我只找了关键的代码。其实插件管理器的主要任务是起到一个衔接的作用,在主程序中通过插件管理器获取到插件对象。 插件管理器的大概实现的功能是这样的,系统启动时读取插件配文件,将配置文件进行对象化,也就是将XML节点进行抽取形成对象,这样便于我们使用。 在用户需要某个插件的时候,我们需要将插件以基类的形式给用户,这样可以消除插件管理器与接口之间的耦合。插件管理器只针对与插件基类。请看代码: ///<summary> ///内部方法,根据Assembly构件宿主程序集名称动态加载内部构件对象 ///</summary> ///<paramname="dom">构件文档对象模型PlugDom</param> privatestaticobjectReflectionDomObject(PlugDomdom) { try { Assemblyass=Assembly.LoadFile(Path.Combine(_comeloadpath,dom.Assembly)); Type[]entrytype=ass.GetTypes(); foreach(Typetypeinentrytype) { //所有构件基类,查找构件的入口点 if(type.BaseType.FullName=="Main.Interface.ComeBaseModule.BaseCome") { Main.Interface.ComeBaseModule.BaseComebasecome= System.Activator.CreateInstance(type,type.FullName,_comeloadpath,DateTime.Now) asMain.Interface.ComeBaseModule.BaseCome; //注册事件 NoteComeLifecycleProcess(basecome); returnbasecome; } } thrownewException("为能实现"+dom.XmlNameSpace+"标识构件,请检查构件配置文件"); } catch(Exceptionerr) { ComeCommonMethod.LogFunction.WritePrivateProfileString( "GetDomObjectByXmlns",err.Source+"->"+err.TargetSite,err.Message,Environment.CurrentDirectory+"\\PlugManagerLog.ini"); returnnull; } } ///<summary> ///记录所有构件共有的生命周期事件数据 ///</summary> privatestaticvoidNoteComeLifecycleProcess(Main.Interface.ComeBaseModule.BaseComebasecome) { basecome.ComeStartGoodsEvent+=newMain.Interface.ComeBaseModule.OnStartGoodsHandler(basecome_ComeStartGoodsEvent); basecome.ComeExitGoodsEvent+=newMain.Interface.ComeBaseModule.OnExitGoodsHandler(basecome_ComeExitGoodsEvent); basecome.ComeExceptionEvent+=newMain.Interface.ComeBaseModule.OnExceptionHandler(basecome_ComeExceptionEvent); } 这是插件管理器中比较重要的实现代码。包括反射、事件注册都在这里。Main.Interface.ComeBaseModule.BaseCome 就是插件基类,由于所有的插件需要进行整个生命周期管理,比如释放一些非托管资源、句柄之类的。所以我要进行统一的管理。在此进行事件注册,以方便监听。我们再看一下实现接口的插件代码: 3.插件实现 /* *author:南京.王清培 *codingtime:2011.5.28 *copyright:江苏华招网信息技术有限公司 *function:开发数据源构件实现,DataSourceOpen.Come项目; */ usingSystem; usingSystem.Collections.Generic; usingSystem.Text; usingMain.Interface.ComeBaseModule; namespaceDataSourceOpen.Come { ///<summary> ///继承构件基类,没有完全实现构件,继续向下传递实现; ///</summary> [Main.Interface.Attribute.WheTherNextTransfer(IfNextTransfer=true, ChildAssembly="CodeBuilderStudio.DataSourceOpen.Childe1", ChildInterface="DataSourceOpen.Interface.NextComeInterface")] publicclassControlContent:BaseCome,Main.Interface.DataSourceOpen { 这个插件继承了BaseCome对象,也就是插件基类。然后又实现了Main.Interface.dataSourceOpen接口,当主程序调用的时候就能拿到这个对象了。 总结:插件系统实现大概就讲完了,包扩接口、插件管理器等知识,希望能给各位需要进行插件开发的起到一个抛砖引玉的作用吧。 本文转自 王清培 51CTO博客,原文链接:http://blog.51cto.com/wangqingpei557/609175,如需转载请自行联系原作者

优秀的个人博客,低调大师

戴尔管:PC业务对公司依然非常重要

在传统PC业务之外戴尔在众多领域都有所投资。去年收购云存储和网络公司EMC后,有观点认为PC将不再是公司的核心发展业务。然而事实上并非如此,戴尔客户解决方案的副总裁Jeffrey ClarkeV强调PC依然是公司各项业务发展的基石,如果有人问:“在PC市场不景气下收购EMC,戴尔是否依然将PC放在重要位置?”,他会用德州腔给出肯定的回答“Hell,yeah!”。 事实上,戴尔在近期推出了多款卓越的新产品,XPS 13可以认为是最佳的传统Windows 10笔记本;Venue 8 Pro则是将8英寸的Windows 10平板的重要代表性产品。这些新产品的亮相表明戴尔将PC作为重点的业务进行发展。 在今年的CES大展上,戴尔副董事长杰夫·克拉克(Jeff Clarke)说,PC市场“远未消亡”,戴尔本身仍然能够实现稳定增长。克拉克特意强调了戴尔在最近一个圣诞购物季的销售状况,尤其是在一些海外市场。例如,该公司“黑色星期五”在巴西的销量增长350%,而整体市场萎缩50%。戴尔还在中国“双11”当天卖出5万台笔记本。“戴尔和戴尔的客户是圣诞购物季的赢家。”克拉克说。他承认整个市场的确在萎缩,但戴尔本身仍然能够实现稳定增长。 本文转自d1net(转载)

优秀的个人博客,低调大师

IBM管:苹果设备在企业市场“无处不在”

据美国科技网站Computerworld北京时间6月19日报道,IBM产品与解决方案部门总经理马哈茂德·纳格什尼(Mahmoud Naghshineh)近日在接受媒体采访时表示,“苹果设备在企业级市场已无处不在。” 目前,IBM正在扩大其面向企业客户的MobileFirst iOS服务范围。德勤数字(Deloitte Digital)全球数字总监麦克·布林克(Mike Brinker)曾在去年表示,对于现代企业来说,苹果产品“是必不可少的”。很显然,纳格什尼的看法与布林克不谋而合。 帮助专业人士获得绝佳体验 纳格什尼在一封电子邮件中写道:“我们正在推出创新的应用,与公司的企业数据进行安全地整合,充分利用苹果用户体验的优势来改变专业人士的移动体验。我们正在创建可连接至企业核心系统的外形漂亮且直观的应用,同时集成合适的数据来帮助专业人士获得绝佳的体验。” 有时,这种解决方案也面临着诸多批评,其中之一就是它们仅在现有数据基础上提供可用性层(usability layer),但这种状况正在发生快速改变。纳格什尼说:“尽管让数据无处不在是很重要的,但真正能改变行业游戏规则的元素是源于这种数据的洞见,得益于IBM‘沃森’的先进分析和认知能力,如今我们正在将这一幕变成现实。” 纳格什尼指出,IBM还充分利用与其他公司建立的合作和结盟,“推动移动技术在企业市场的应用。”例如,最近IBM扩大了与SAP的合作关系,令其可以更轻松地将那些解决方案整合到iOS应用中。此外,IBM还扩大了与Box的合作范围。尽管许多人都了解苹果与IBM在企业级市场的结盟,但他们可能并未完全意识到这种合作的深度和规模。 纳格什尼表示,IBM目前拥有超过1万名设计师和开发者,随时准备帮助企业客户开发iOS应用。IBM在上海、布加勒斯特以及班加罗尔建立的新中心(IBM称之为“车库”)意味着,该公司可以“快速”开发企业级应用,同时还可以在应用使用寿命期间随时进行更新。 苹果iOS设备激活量遥遥领先 根据移动设备公司Good Technology发布的“移动指数报告”(Mobility Index Report),今年第一季度在企业激活的所有智能手机当中,iPhone就占到了72%,而iPad在企业平板电脑激活量中的占比更是达到81%。 纳格什尼说,“企业客户对我们与苹果的合作反应积极,许多客户也在积极部署,而且看到了商业益处。”根据埃森哲咨询公司2015年发布的“数字密度指数”(Digital Density Index)报告,到2020年数字技术的使用将给全球十大经济体贡献1.36万亿美元的收入。 市场研究公司Forrester宣称,部署iOS企业应用的航空公司预计三年内的投资回报率将达到48%,移动应用开发成本下降30%,运营成本下降10%。纳格什尼说:“我们想要携手实现企业规模的深刻转型,一开始就是将最终用户体验作为企业核心商业过程的核心所在,让专业人士接触到最相关的数据。” 那么,谁会使用这些技术呢?大家可以通过知名科技记者乔尼·埃文斯(Jonny Evans)所写的多份报道进行追踪,会发现这些解决方案被广泛应用于零售业、航空运输、金融服务、教育、紧急响应团队以及医学等各个领域。 企业欲借移动应用实现转型 这些行业并不仅仅寻求部署一款应用。纳格什尼指出,“我们如今正看到有关企业移动化转型的讨论,他们正从对单一应用的需求转向多款应用的部署,实现更大范围的转变。”例如,汉莎航空公司、City Furniture、新加坡航空公司和日本航空公司都部署了相关应用,利用数据和分析手段提供更好的客户体验。 纳格什尼解释说:“我们认为,所有企业转变一开始都必须专注于体验。若想与竞争对手较量,企业需要定义一种新的商业模式,通过数字体验来创建更好的与客户互动的模式。对于我们的许多客户来说,移动是他们大范围转型的基础。” 企业客户希望充分利用移动解决方案的潜力实现业务转型。他们希望走上一条灵活的发展道路,能迅速满足客户的需求。与此同时,企业客户还对出色的设计趋之若鹜,同时想要获得我们在使用任意iOS应用时得到的用户体验。安全和云支持同样至关重要。纳格什尼表示,应用必须具备与企业核心系统连接的能力。将来,人工智能就像现在的增强现实一样,可能会改变传统商业模式。 IBM解决这一问题的办法就是,确保它开发的iOS应用可以与IBM“沃森”的认知能力进行整合。乔尼·埃文斯(Jonny Evans)称,考虑到“沃森”的学习和适应能力,他预计会看到解决方案会迅速被应用于其他商业场景,令企业客户可以做出更快速的决策和更灵活的产品部署,对快速多变的市场需要做出回应。 本文转自d1net(转载)

优秀的个人博客,低调大师

欧洲幸免遭遇大范围仿银行APP攻击

据外媒报道,一群俄罗斯骇客计划通过高仿的假银行APP来感染欧洲百万台的Android(安卓)终端,实现网络钓鱼目的,进而盗取用户的金融财产。 骇客计划通过高仿的假银行APP盗取钱财 这个被称为“Cron”的骇客团伙,通过恶意软件Cron感染了俄罗斯100多万部Android手机,并盗取了超过5000万卢布(约合人民币609万)的资产。所幸该团伙已被俄罗斯内政部擒获并拘留。 所幸该团伙成员已被警方控制 根据分析,该骇客团伙曾计划袭击欧洲的大银行包括法国农业信贷银行(France's Credit Agricole)、法国巴黎银行(BNP Paribas)和法兴业银行(Societe Generale)等等。 有网络安全公司研究其作案手法后指出,该恶意软件Cron感染Android用户的手机后,允许攻击者向受害者的银行发送短信并要求其向每个受害者平均转出140美元。由于该恶意软件能够阻止了任何传入的短消息或银行交易通知。所以,用户在遭受攻击后,将完全对自已的金融转账失去控制,危害巨大。 Cron相当于一种木马病毒,通过文本信息和虚假应用中的恶意链接传播。研究人员表示,截止目前Cron已将资金存入6000个黑客银行帐户。 由于Android平台的开放性,因此成为攻击者利用恶意软件进行网络钓鱼、APP欺诈,甚至绕过防火墙而实施犯罪的一大温床。 安全研究人员警告称,针对Windows系统的WannaCry勒索攻击刚刚结束,下一波勒索攻击则很有可能发生在Android平台上,Android用户必须提高警惕了。 本文转自d1net(转载)

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册