在前面的文章中,我们说过,Mussel的内核是一个插件容器。Mussel本身不提供任何功能上的服务,所有的功能都由插件来提供。Mussel负责协调插件与插件、插件与容器以及容器与调用者之间的通信。
Mussel提供了一个装载器,这个在以后的文章中会讲到。装载器的Start方法调用时,装载器遍历Mussel程序集所在文件夹以及所有的子文件夹,搜寻
*.addin 的插件配置文件。在这里,我们先看一个addin文件的演示。
1
<?xml version="1.0" encoding="utf-8" ?>
2
<Addin Name="Core" CreateNewDomain="true" DomainName="Core">
3
<ReferenceAssemblies>
4
<Reference AssemblyFile="icecs.dll"/>
5
<Reference AssemblyFile="Mussel.Communication.Contract.dll"
6
IsMusselAssembly="true" />
7
<Reference AssemblyFile="Mussel.Communication.IceCommon.dll"/>
8
<Reference AssemblyFile="Mussel.Communication.IceServicePortal.dll"
9
IsMusselAssembly="true"/>
10
</ReferenceAssemblies>
11
<AddinNode Path="/Mussel/Core">
12
<AddinItem ClassKey="BasicFormatter" Name="BasicFormatter"/>
13
<AddinItem ClassKey="ConnectionManager"/>
14
<AddinItem ClassKey="FullServiceSiteFactory"/>
15
<AddinItem ClassKey="IceServicePortal"
16
ServiceSiteFactoryKey="/Mussel/Core,FullServiceSiteFactory"
17
AdapterId="IceServicePortalAdapter"
18
ObjectId="IceServicePortal"
19
Endpoint="tcp -p 8755"
20
ConnectionManager="/Mussel/Core,ConnectionManager"
21
/>
22
</AddinNode>
23
</Addin>
24![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
13
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
14
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
15
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
16
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
17
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
18
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
19
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
20
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
21
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
22
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
23
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
24
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
在这里我们先解释一些概念性的东西:
- Mussel的插件(Addin)是树状结构的,插件可以包含许多个加载节点(AddinNode),加载节点又可以包含许多个插件项目(AddinItem),而插件项目本身又可以是一个容器,可以包含许多子插件项目。
- 由于Mussel采用了树状的插件结构,所以加载节点及插件项目都有完全限定的路径。
- 插件项目的路径表示为:节点路径,[父级插件项目基本路径.]插件项目名称,例如:如果一个插件项目的完全路径为:/Mussel/UI/MainForm,MainMenu.FileMenu,则其装载节点是/Mussel/UI/MainForm,父级插件项目的完全路径是:/Mussel/UI/MainForm,MainMenu,父级项目的基本路径是MainMenu。
接下来,我们来看看配置文件中各个节点的具体含义,在Mussel插件配置文件中,一般会有以下一些元素:
- /Addin,这是一个根元素,每个文件中只有一个。正如其名称一样,该元素表示其内部的XML内容为插件配置相关的信息,该元素有三个特性:
- Name:插件的标识
- CreateNewDomain:是否需要在新的AppDomain中加载插件。
- DomainName:AppDomain的标识,如果多个配置文件的DomainName相同,则会被加载到同一个AppDomain中。
- Name:插件的标识
- /Addin/ReferenceAssemblies,该元素标识其内部的XML内容为引用的程序集相关的信息。
- /Addin/ReferenceAssemblies/Reference,该元素明确引用的具体程序集,有两个特性
- AssemblyFile:程序集所在的相对路径(相对于插件文件所在的目录),如果前置"~/"字符,则相对于Mussel.Core程序集所在的目录。
- IsMusselAssembly:该程序集是否为Mussel插件程序集,如果值为"ture",Mussel会尝试从程序集索并记录Mussel插件项目类型。
- AssemblyFile:程序集所在的相对路径(相对于插件文件所在的目录),如果前置"~/"字符,则相对于Mussel.Core程序集所在的目录。
- /Addin/AddinNode,该元素指示插件的装载节点,有一个特性:
- Container:节点内部的容器,该容器明确元素内部的插件项目的父级插件项目位置。
- Container:节点内部的容器,该容器明确元素内部的插件项目的父级插件项目位置。
- /Addin/AddinNode/AddinItem,该元素设置具体的插件项目,包含两个基本的特性:
- ClassKey:用于实例化插件项目的类型,对应插件代码中[MusselType(xxxx)]特性指定的类型标识。
- Name:插件的名称标识,如果不设置的话,默认同ClassKey一致。