SharpDevelop插件系统完全分析(3)
首先通过ICodon codon = AddInTreeSingleton.AddInTree.CodonFactory.CreateCodon(this, curEl);这句话创建一个代码子对象,大家一定还不清楚这句话是如何工作的。下面,我再详细解释:
AddInTree这个对象我在前面已经显式创建好了,大家应该还记得。然后是CodonFactory的CreateCodon方法。不知大家是否还记得,在先前加载每个程序集的时候,都调用了LoadCodonsAndConditions这个方法,在这个方法内部扫描当前程序集的所有类型,并把继承自AbstractCodon类的所有子类都封装在一个对应的CodonBuilder对象中,最后把这些CodonBuilder都添加到了CodonFactory的Builders集合中。所以,当现在调用CodonFactory的CreateCodon方法时,会先根据代码子名(CodonName)找到一个相应的CodonBuilder对象,然后调用该对象的BuildCodon方法,在该方法中有这么一句话:
codon = (ICodon)assembly.CreateInstance(ClassName, true);
它通过一个具体的类名从一个程序集中创建一个代码子对象,最后将该代码子对象和当前插件对象关联。
知道了代码子对象如何创建之后,程序通过以下这句话:
AutoInitializeAttributes(codon, curEl);
上面这个函数的功能是全面检索当前被创建的代码子对象的所有的属性(包括基类的属性),
如果被扫描到的属性在XML文件中指定了值,则把该值赋给这个属性,如果没有指定,则不赋值。扫描时属性分为两类,一般属性和数组类型的属性。然后,程序对代码子进行排序之后将当前代码子对象插入到扩展对象e的一个集合中。最后,如果当前节点有子节点(如
好了,下面回到Initialize方法。当该方法按照上面那样执行结束之后,系统应该做了以下两件重要事情:1)系统已经加载了该插件运行所需的全部程序集;2)系统已经将这些程序集中的所有的代码子类和条件类全部创建完成,并都添加到了相应的Extension对象的codonCollection和Conditions集合中。
下面开始讨论AddInTree的InsertAddIn方法。
第一步,先将传过来的插件对象加入到一个插件集合中,刚才谈到一个Extension对象的codonCollection集合包含了该插件的某些代码子对象。所以,接下来先在外层循环对该插件对象的Extensions集合列表进行迭代,在该循环内部,先通过Extension对象所指定的Path属性创建一个插件树节点,注意创建该节点时总是以root为树的根节点,因为Path所指定的逻辑插件路径总是从根节点出发的。如下面的语句所示:
DefaultAddInTreeNode currentNode = CreateTreeNode(root, extension.Path);
接下来,再对Extension里的codonCollection集合进行迭代,并把这些codon对象作为插件树的节点一个个插入到相应的位置。并将当前插件树节点与一个代码子对象关联,使其具有某种具体的功能。注意:这里插入时,将代码子对象的ID属性作为了路径的一部分,其实就是将一个代码子对象也作为一个树节点看待,节点的名字就是该代码子对象的ID属性。这里有一个关于插件树节点如何创建的问题。这个功能是通过以下函数完成的:
DefaultAddInTreeNode CreateTreeNode(DefaultAddInTreeNode currentNode, string path)
该函数接受一个当前节点对象和一个树路径字符串信息。首先将该路径字符串进行分割,放在一个数组中(这个数组中的每个元素代表一个树节点的名称),然后根据这个数组中的节点名逐个构造树节点。有两种情况:
1) 如果由某个节点名指定的节点对象已经创建好了,则直接将该节点作为下一次的当前节点,并进入下一个循环继续创建其子节点。
2) 如果由某个节点名指定的节点对象还没有创建,则马上创建该节点并将其作为当前节点的子节点。
所以从插件树中节点的创建过程来看,整棵插件树在逻辑上是一棵树,但在内部其实是为每个节点都设置了一个ChildNodes集合,用来存放当前节点的子节点。另外对于条件对象也是一样,这里就不在详细讨论了。当InsertAddIn方法执行完毕时,已经顺利地将当前插件对象插入到插件树中。最后当AddInSingleton的InsertAddIns方法执行完成时,整棵插件树就应该成功地被创建了。
到这里,各位看官应该已经了解了整棵插件树是怎样被创建和组织起来的。下面为了清楚起见,我再简单回顾一下整个创建流程:
1:在Main函数中显式调用AddInTreeSingleton的CreateAddInTree()方法
AddInTreeSingleton.CreateAddInTree();
2:先获取所有插件文件列表,然后调用InsertAddIns()方法
InsertAddIns(addInFiles);
3:对文件类表进行迭代,对每个插件文件都创建一个插件,并将其插入到插件树中
static void InsertAddIns(StringCollection addInFiles)
4:用一个XML插件文件来初始化一个插件对象
addIn.Initialize(addInFile);
5:在上面的插件初始化函数中,先分析
AddRuntimeLibraries(curEl);
6:分析
AddExtensions(curEl); ――> AddCodonsToExtension
7:插件对象创建好之后,将该插件对象插入到插件树中。
addInTree.InsertAddIn(addIn);
8:在将插件对象插入到树的过程中,Extension对象的Path属性只用于构成树的路径,而
Extension对象的CodonCollection集合中的每一个Codon对象不仅作为一个树节点(构成路径),而且具有某个具体的功能。创建树节点的函数如下:
DefaultAddInTreeNode CreateTreeNode(DefaultAddInTreeNode currentNode, string path);
9:最后层层返回,最终完成整棵插件树的创建。
小结:
整个插件系统的创建应该说比较复杂,其中用到了一些设计模式:
1.因为插件树在一个程序一次运行中只有一个实例,所以采用了Singleton设计模式; 2.代码子和条件对象的创建方式,程序中使用了“Builder”字眼,看上去好像是使用了Builder设计模式,但我认为这跟Builder设计模式的真正用途是不一样的。因为Builder设计模式强调一个对象的创建过程,并最终将该对象返回。而这里只是简单的创建了一个代码子或条件对象,真正的创建任务是由代码子或条件对象来完成的。所以,这样来看这用方式应该更加符合Proxy设计模式,各位看官觉得如何呢?
3.CodonFactory这个类,一看就是工厂设计模式。但它不是一个一般的工厂模式,而是对一个工厂模式的优化,因为它可以创建任意种类的Codon对象,它并没有提供一个固定的创建一系列产品的方法列表接口。而是提供了一个集合,集合重的元素可以动态添加,每个元素都可以创建一个Codon或Condition对象。
插件系统如何创建今天就先介绍到这里,明天介绍Command、Service以及插件树节点中的每个功能是如何来体现和使用的。
发表于 @ 2005年10月01日 11:23:00 | 评论( 6 ) | 编 …… 此处隐藏:2371字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [互联网资料]2022年厦门大学机电工程系824机械设计
- [互联网资料]东南大学2022年硕士研究生拟录取名单公
- [互联网资料]能源调研报告(精选多篇)
- [互联网资料]初三英语下学期 中考英语 语法填空训练
- [互联网资料]2022内蒙古选调生行测常识备考:新事物
- [互联网资料]自驾必备!在新西兰租什么样的车自驾游
- [互联网资料]佛教素食菜谱44页未完
- [互联网资料]盈利能力分析外文翻译
- [互联网资料]2022年南昌航空大学音乐学院736马克思
- [互联网资料]优选外贸跟单实习报告总结(精品版)
- [互联网资料]银行新员工培训总结
- [互联网资料]2_year_visa_new_guidance_190316
- [互联网资料]天津市五校宝坻一中静海一中杨村一中芦
- [互联网资料]2007--2008学年第一学期高三数学宁波市
- [互联网资料]Chromatic framework for vision in ba
- [互联网资料]幼儿园大班上学期美术教案《心愿树》含
- [互联网资料]2022年华中农业大学信息学院820微型计
- [互联网资料]硬盘坏道的表现 __硬盘使用久了
- [互联网资料]江苏省2016年会计从业资格考试《会计基
- [互联网资料]公共场所卫生监督试卷全解
- 高级英语第一册所有修辞方法及例子总结
- 综合交通枢纽规划与城市发展
- 沃尔玛的企业文化案例分析
- 美国Thanksgiving Day 感恩节 介绍
- PEP六年级英语上册Unit6How do you fee
- 最齐全的中国大型商场购物中心名单
- 数据结构实验报告八—哈夫曼编译码
- 杭州市余杭区人民政府(通知)
- 七年级语文成语运用专项训练
- 微观经济学第三章 消费者行为 课后习题
- 对_钱学森之问_的思考
- Excel_三级联动_下拉菜单
- 办公用品需求计划申请表
- 对外汉语教材必须要知道的发展史
- 挑战杯大学生学术科技作品竞赛作品申报
- 举办民办教育培训机构应具备下列条件
- 太阳能路灯项目设计方案
- 2013年八年级上最新人教版新教材Unit3I
- 【历史】 6-4 《近代科学之父牛顿》 课
- 高中生物《第四章 第二节 探讨加酶洗衣




