在前面的文章中,我们说过,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
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
在这里我们先解释一些概念性的东西:
- 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一致。