改进的C#插件构架

不过这种技术接口的制订是个难题,设计不好很影响以后的功能扩展 —— fking

比较简单的插件想法,扩展的功能是有限的。 应该考虑主程序本身也应该是一个插件的结构。也就是说插件分为宿主插件和扩展插件两类。这两类也可以在一起。这样的话才可能有好的扩展性。象eclipse的扩展和扩展点的思想,和sharpdevelop的插件树的思想比较好解决了扩展性的问题。 —— jan

以上是两位网友对笔者《C#插件构架实战》一文作出的评价。首先对两位热心的读者表示感谢。

的确如此,在软件开发的过程中,设计的过程往往比写代码的过程要难得多。因此,通常除了软件测试之外,耗时最多的也就是系统建模了。一个好的软件系统应当具有较高的稳定性(可靠性)、易操作性以及可扩展性支持,尤其是可扩展性。我认为,良好的可扩展性支持是一个软件团队在开发中变被动为主动的必要条件。对于一个应用,我们希望在用户增加需求时,我们能够用最少的时间、最少的人力来解决问题。当别人在用户快速增长的需求中忙得不可开交时(用户总是不能在第一次需求分析时将需求完完整整的告诉你 ^_^),而你,你的团队只需要作一点工作就可以让“贪得无厌”(-_-)的用户得到满足,从而提高了效率,让团队有更多的的时间来创造,而不是去做无谓的修改。

很遗憾的是,在《C#插件构架实战》一文中,我并未考虑到这一点。当然,对于一个十八岁的没有也不可能有团队工作经验的年轻人来说,这样的失误(失误就是失败——老师如是说)是可以原谅的(自我开脱之辞)。不过,我决定对这个插件系统进行重构。

考虑到系统的复杂性,这次我准备使用UML(大上个月才开始学的,画得不好,见笑了)。

1. 着手分析

对于网友 jan 的指教,我大概明了,但人的思维差别太大,我不敢保证我的理解是完全符合 jan 的意思的。但是,我仍然会根据自己对可扩展性的理解构建一个应用程序框架模型。

直入正题。我现在假设我属于一个软件团队(就暂且叫她 AbstractSoft 吧),并任系统分析师(^o^)。任何事物都有它规范的一面,我们希望我们的团队出品的部署在同一平台的所有应用都有相同的框架,相同的部署形式。这样便可以形成独有的团队特色,并在竞争中以效率取胜。因为我们不需要为每一套应用设计不同的框架——这可以节约不少时间!

这样我需要把程序实现与用户界面分开到不同的框架中。我的意思是:

如此一来,在 Application Frame Level 的核心库中存在的是抽象接口以及一些泛化的细节。这些内容在第一次安装团队产品时就已经部署在用户的机器上了。它不会自动销毁,直到用户提交把它从本地移除的请求。GUI Level 提供了团队产品泛化后的统一的界面组件(比如:属性编辑器、数据库操作界面等可重用组件)。特化的产品(Speciallized Application)通过实现 Application Frame Level 中的某些接口实现可扩展性,通过使用 GUI Level 中的的类来实现用户界面。

以下是一个简单的静态图(接口和类的成员将在下面详细阐述):

2. IConnectableObject

public interface IConnectable {

// application 为插件所属的主框架对象。若为null则表示插件本身就是主框架

ConnectionResult Connect( object application );

ExtendibleVersionInfo VersionInfo { get; }

void OnDestory();

void OnLoad();

void Run();

}

public enum ConnectionResult {

Connection_Success ,

Connection_Failed

}

public class ExtendibleVersionInfo {

private ExtendibleVersionInfo() {}

public ExtendibleVersionInfo( string name , string version , string copyright ) { // Omitted }

public ExtendibleVersionInfo(string name,int version1,int version2,int version3,string copyright) { // Omitted }

public int PrimaryVersion { get { return _Version1; } }

public int SecondaryVersion { get { return _Version2; } }

public int BuildVersion { get { return _Version3; } }

public string Name { get { return _Name; } }

public string VersionString { get { // Omitted } }

public string Copyright { get { return _Copyright; } }

private string _Name;

private int _Version1 = 1;

private int _Version2 = 0;

private int _Version3 = 0;

private string _Copyright;

public static ExtendibleVersionInfo Empty = new ExtendibleVersionInfo();

}

所有可连接的对象必须实现这个接口。这是所有 Application Frame Level 中类的鼻祖。

3. IExtendible

public interface IExtendible {

IConnectable GetLatestVersion();
IConnectable QuerySpecifiedVersion( ExtendibleVersionInfo version );
ExtendibleVersionInfo[] EnumerateVersions();

}

4. 使用类工厂创建应用程序和插件的最新版本

我们的主程序以及插件会设计成 internal class 。程序只输出一个工厂类,用户界面通过调用 IExtendible 接口的 GetLatestVersion() 方法获得这些用来完成实际任务的对象的实例,并把它们显示出来。或者,也可以枚举所有的版本,让用户来挑选所需要版本。

5. 可扩展性

不得不承认,这样的方式可扩展性仍不是很强。程序需要升级时同时需要修改提供给用户的工厂类(虽然接口不变)。为了实现更好的可扩展性,可以把简单工厂模式转换为工厂方法模式。

6. 声明

需要说明的是,本文仅仅介绍了我的一点小小的想法。有不合理的成分,请大家提出改进的意见(直接发邮件给我,或写回复)。在这里下载源代码:

时间: 2024-12-26 22:05:54

改进的C#插件构架的相关文章

C#插件构架实战

C# 插件构架实战 Jack H Hansen [ 2004-07-27 ] Keywords C# 插件 反射(System.Reflection) 属性(System.Attribute) 一.引言 1. 问题的引入 假设你设计的程序已经部署到用户的计算机上,并且能够正常运行了.但是有一天,用户打来了电话--他们要求增加新的功能.确定了用户的需求后,你竟然发现原有的软件架构已经无法胜任新增任务的需求--你需要重新设计这个应用了!但问题是,就算你又用了一个开发周期完成了用户需要的应用,却不能保

使用jquery-easyui写的CRUD插件(1)

写插件先看看jqeury的插件如何写,先了解一下如何写插件的代码. jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法.jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级别的插件开发,即给jQuery对象添加方法.下面就两种函数的开发做详细的说明. 1.类级别的插件开发 1.1 添加一个新的全局函数 添加一个全局函数,我们只需如下定义: jQuery.foo = function() { alert

JQuery闭包,插件的写法

jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法.jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级别的插件开发,即给jQuery对象添加方法.下面就两种函数的开发做详细的说明. 1.类级别的插件开发 类级别的插件开发最直接的理解就是给jQuery类添加类方法,可以理解为添加静态方法.典型的例子就是$.AJAX()这个函数,将函数定义于jQuery的命名空间中.关于类级别的插件开发可以采用如下几种

OpenCV3.0 3.1版本的改进

 摘要        OpenCV现在更新到了3.1版本,相对OpenCV2有了很大改进,其中对于硬件加速,移动开发(IOS,android)的支持成为亮点.      新版的OpenCV采用了内核+插件的架构模式,整体上更加易于扩展.      其中最与时俱进的特点就是 支持最新的 Windows 和 OS X 操作系统和最新的开发工具 (VS2015 和 Xcode 7),支持 Andorid 5.软件的更新换代推动硬件更新,并进一步推动摩尔定律,相信OpenCV的新版会带动更多人更新W

zz将 VSTO 插件部署给所有用户

原文:zz将 VSTO 插件部署给所有用户 注:本文原作者 Misha Shneerson 是 VSTO 团队的工程师.原文可以在下列地址找到:http://blogs.msdn.com/mshneer/archive/2007/09/05/deploying-your-vsto-add-in-to-all-users-part-i.aspx. VSTO 插件(也叫"托管代码 Office 插件")在部署方面有一个严重的不足,简单来说,微软只告诉了我们如何把这些插件部署到单个用户环境:

JavaScript tab选项卡插件实例代码_javascript技巧

今天,先从最简单的开始,将已有的一个Tab选项卡切换功能改写成javascript插件形式. 原生函数写法 将一个javascript方法改写为js插件最简单的方式就是将这个方法挂载到window全局对象下面 我们先来看看最原始的使用函数写法的代码: tab.html <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <meta http

《Photoshop修色圣典——PPW专业照片修正流程与技巧》目录—导读

版权声明 Photoshop修色圣典--PPW专业照片修正流程与技巧 Modern Photoshop Color Workflow The Quartertone Quandary, the PPW, and Other Ideas for Speedy Image Enhancement Copyright 2013 by Dan Margulis ISBN: 978-0-9882808-0-9 MCW Publishing http://www.moderncolorworkflow.co

盘点:2014 SNS开源软件动态

问题描述 2014年,是SNS平台高速增长.甚至可以说是疯狂的一年,新技术层出不穷.巨头与新创企业竞争不断.资本大量涌入.以粉丝社区.用户社区.电商社区等为代表的SNS社区,以众多社交APP为代表的移动互联网平台,层出不穷,令人眼花缭乱.而作为社交平台开发的开源软件,在2014年又有什么动态呢?让我们来盘点一下:1.开源SNS社区系统动作指数:5颗星近乎(英文:Spacebuilder)是运用asp.net技术的一款强大社区产品,借助预置的微博.群组.日志.相册.贴吧.问答等系统应用模块,帮助客

JShot 1.4 RC发布 多屏幕捕获和上传软件

JShot是一个多屏幕捕获和上传软件.JShot也有绘图和图像http://www.aliyun.com/zixun/aggregation/17204.html">编辑功能. 它支持在图片上绘制的形状,剪切,旋转,文字注释等 .该版本改进了 dropbox 插件支持自动检测 dropbox ID,支持图像捕获帧中的拖放操作等. Features Capture a rectangular region, full screen or clipboard content Capture a