忙碌的好多天过去了,自从上一贴发出后,不少同仁都对插件式开发提出了自己的看法以及分享一些插件式开发比较典型的例子,感谢李锋、肖明等 同仁的分享,也感谢所有顶贴的同志,今天来分享一下插件式开发著名的产品SharpDevelop。正如李锋所 说,SharpDevelop在.Net领域它的地位相当于Java领域Eclipse,他们的底层都有着一个灵活的插件体系框架,他们努力都方向都是各 种平台终有一天都是用同一个IDE。
SharpDevelop发展至今已经从1.1到现在的4.0,紧跟微软的步伐(如果我是盖茨,我会疯掉),我们在这里讨论的是2.2的框架,虽然有点落 后,但是大体的思想不变,新特性无法展现,有兴趣的朋友可以继续深入研究4.0的新特性。还没有搭建环境的朋友可点击下载, 对于SharpDevelop得部署,我写了一个简要的部署文档,可点 击下载,如果已经成功部署了该环境的朋友可不比下载。
完成了一系列的安装部署后,SharpDevelop的庐山真面目出现了,呵呵,第一次接触SharpDevelop的代码我也跟很多人一样,好庞大,但 是慢慢地围绕一个主题“插件式”,那么所面对的疑惑将会慢慢解开。
接下来介绍一下SharpDevelop中的一些比较亮点的功能,这些功能可能也是我们很多项目中需要的,在之后的篇幅中将会对这些功能进行更加深入的内 核级的分析和学习。运行SharpDevelop2.2点击【Tools】-【Addin Scout】既可以看到SharpDevelop的所有插件的全貌。
国际化支持(本地化):
一个能够在国际上通行的最基本的功能,能够让软件在国际通行上更有竞争力,SharpDevelop默认语言是英语,并且还能支持中文、日文、俄语、西班 牙语等语言,而且可以定制。
可能的用途:现在的软件产品光局限于国内用户明显已经不能够满足现在的需要,走向国际化那么 这个是一个必然的产物,而国际化恰恰就是这个国际化不可或缺的功能,从这个项目的研究中将能够更好地体会到国际化的一些实现流程以及一些实用的方式。
富文本编辑:
经常在使用Visual Studio平台的时候会想,他们的代码编辑器是如何实现的呢,答案就在SharpDevelop的TextEditor里头 (SharpDevelop\src\Libraries\ICSharpCode.TextEditor)。
可能的用途:项目在千变万化的需求面前,如果不能够满足用户的一些我们认为不合理的需求,有 可能会导致项目的延期甚至失败,除了能够满足用户的业务需求之外,很多用户往往从在界面上提出一些很稀奇古怪的需求,曾经在上海做的项目中,有用户提出的 需求是某个字母后面加“.”号,则这个字母以红色显示,后面加“'”则字母蓝色显示,效果就是这样:AAA.BB'C.DDD'。这种需求看起来简单但是其实有一套语法解析的功能,市面上也没有诸如此类能够自定义显示规则的第三 方控件。所以最后采取的策略是根据用户的需求后台进行解析然后通过GDI绘制输送到前台。这样的实现方式跟SharpDevelop的文本编辑器实现一致 所以SharpDevelop出来的代码显示效果如下:
public static float DrawDocumentWord(Graphics g,string word,PointF position, Font font, Color foreColor)
所以为了使用用户的需求,我想大家可能在界面上能够实现更好的人机交互,可以参考该功能。
命令式的操:
插件式开发中的所有插件可以说基本上都是命令式出发,而这些命令基本上都是在插件文件里定义好的,直接看实例:
<MenuItem id = "Open" label = "${res:XML.MainMenu.FileMenu.Open}" type="Menu">
<MenuItem id = "File"
label = "${res:XML.MainMenu.FileMenu.Open.File}"
icon = "Icons.16x16.OpenFileIcon"
shortcut = "Control|O"
class = "ICSharpCode.SharpDevelop.Commands.OpenFile"/>
<MenuItem id = "Project"
label = "${res:XML.MainMenu.FileMenu.Open.Project}"
icon = "Icons.16x16.OpenProjectIcon"
shortcut = "Control|Shift|O"
class = "ICSharpCode.SharpDevelop.Project.Commands.LoadSolution"/>
</MenuItem>
以上这一段就是打开菜单的一段插件定义,解释一下这些关键字的含义
label :显示的文字
type :菜单类型(如:按钮、COMBO框、悬停按钮等)
icon :显示的图标
shortcut :快捷键
class :对应的类
其中class就是该命令触发的地址,我们顺藤摸瓜找到了该命令如下:
public class LoadSolution : AbstractMenuCommand
{
public override void Run()
{
using (OpenFileDialog fdiag = new OpenFileDialog()) {
fdiag.AddExtension = true;
fdiag.Filter = ProjectService.GetAllProjectsFilter(this);
fdiag.Multiselect = false;
fdiag.CheckFileExists = true;
if (fdiag.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm) == DialogResult.OK) {
ProjectService.LoadSolutionOrProject(fdiag.FileName);
}
}
}
}
呵呵,看到这段代码我想大家应该明白配置文件跟UI以及后台处理的一系列的工作过程,这种命令式触发就完全合应了插件式开发的原理,每个插件都是独立的, 就是如果没有打开这个功能,那整个程序还是能够正常运转,只是缺失了该功能。
可能的用途:在 项目开发的过程中,我们往往碰到很多问题,其中我个人觉得最值得注意的,也是最浪费财力物力的因素,那就是代码重用性。那么插件式的开发思想能够很好地将 某个模块很好的封装起来,从而起到功能独立、即插即用、重用性高、维护方便等方面,现在网络上也流行很多插件式网站开发工具跟此种思想比较类似,比较明显 的就是比如一些电子商务网站:B2B、B2C、C2C的网站定制开发工具。那么延伸到项目开发过程中,如果能够长远规划项目的开发,确保同类项目尽量不做 重复的劳动,把都用到的功能、处理、算法等封装起来,那么类似的新项目就能够节省开发时间,节省下不少的开发成本,而且随着项目的增多,积累的代码财富就 越来越多,最后能够形成良性循环,各个项目都能够及时地交付高质量的软件产品。当然项目是千变万化的,需求是让人匪夷所思的,只能说尽可能地做到,要完全 做纯定制基本上是不可能的,有一点是可以肯定的,积少成多,聚沙成塔。呵呵。
不知不觉又深夜了。。。一晚上好像写不了多少东西,以后再多续几贴吧,总结一下,今天主要跟大家探讨的是SharpDevelop的一些基本的概念,以及 几个个人觉得比较值得学习的功能,当然简单的篇幅不能很全面地写出SharpDevelop里面包含优秀的架构和编程思想,在之后的帖子中将慢慢深入到SharpDevelop的内核去探寻更为让程序爱好者感到更为奇妙的思想以及技术。。。
睡了,晚安。。
未完待续。。。
下 一贴:SharpDevelop工程源代码解析以及插件实现的内核结构
欢迎拍砖。。。z z Z z z。。。
2011-04-01 02:41:49