教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 互联网资料 >

SharpDevelop插件系统完全分析(3)

来源:网络收集 时间:2026-07-30
导读: 首先通过ICodon codon = AddInTreeSingleton.AddInTree.CodonFactory.CreateCodon(this, curEl);这句话创建一个代码子对象,大家一定还不清楚这句话是如何工作的。下面,我再详细解释: AddInTree这个对象我在前面

首先通过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:在上面的插件初始化函数中,先分析元素节点,并创建一些CodonBuilder和ConditionBuilder对象,这些对象可以创建Codon和Condition对象。用以下函数实现:

AddRuntimeLibraries(curEl);

6:分析元素节点,根据这些节点并利用上面所提到的CodonBuilder和ConditionBuilder对象来创建Codon和Condition对象。

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字,全部文档内容请下载后查看。喜欢就下载吧 ……

SharpDevelop插件系统完全分析(3).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/443140.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)