這個問題的解決方案需要注意三點:
(1)插件配置檔案(即,插件用到的配置檔案)的格式。
插件配置檔案中不再需要<configSections>,也不再需要 <spring>/<context>,而是直接從<objects>開始,比如一個經過簡化的名為BusinessManagerAddin.config的插件配置檔案:
<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net" >
<object name="keyNameMappingCollection" type="BusinessManagerAddin.KeyNameMappingCollection ,BusinessManagerAddin">
<property name="AdoBaseManager" ref="adoBaseManager"/>
</object>
<object name="adoBaseManager" type="BusinessManagerAddin.AdoBaseManager ,BusinessManagerAddin">
<property name="DataBaseType" value="Oracle"/>
</object>
</objects>
(2)手動注冊插件配置檔案:
我們知道,通常App.config中的spring配置,是由Spring自己自動注冊的,而插件的配置檔案,由于前面提到的原因,需要我們手動注冊,就像這樣:
FileSystemResource input = new FileSystemResource("Addins/BusinessManagerAddin.config") ;
Spring.Objects.Factory.IObjectFactory objFactory = new Spring.Objects.Factory.Xml.XmlObjectFactory(input);
通常,配置檔案的注冊可以在插件的生命周期OnLoading方法中進行。
(3)在宿主應用App.Config(或Web.Config)中添加探測路徑。
我們通常将所有的插件放在AppBase目錄下的Addins目錄下。插件配置檔案中的元件很多可能在插件自身中定義,如果沒有在宿主的App.Config(或Web.Config)中添加對應的探測路徑,Spring容器才建立元件對象時,會找不到對應的類型定義。是以我們需要像下面這樣添加探測路徑:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="Addins"/>
</assemblyBinding>
</runtime>
其實,不僅僅是在插件中,你在任何dll中,如果這個dll需要使用自己的Spring配置檔案,都可以通過上述介紹的解決問題。