2013-01-22 60 views
1

我正在處理與spring有關的配置問題,與使用基於組件的體系結構相關,以及如何彈簧加載它的配置文件。Spring.NET配置文件從一個文件夾動態加載

問題是每個組件都會將信息添加到spring上下文中,但爲了從程序集中加載新配置,您必須編輯web.config併爲該組件添加配置資源(或在至少編輯現有的資源文件並從程序集中導入組件的配置)。 web.config由另一個組「擁有」,無法編輯。

我想是這樣的:

(1)建立在APP_CONFIG一個特定的目錄爲我的春天文件

(2)添加filewatcher到該目錄重新加載,如果一個XML應用文件被添加/從文件夾中刪除(Sitecore已經這樣做)

(3)如果我部署一個組件(稱爲xyz),我會部署一個xyz.spring.xml文件到該文件夾​​,單個導入語句,用於裝配中的正確配置,例如: < import r esource =「assembly://PageTypes.Service/PageTypes.Service/PageTypes.xml」/ > 或者如果我需要配置測試/調試配置 < import resource =「assembly://PageTypes.Service/PageTypes.Service /PageTypes.DEBUG.xml「/ >

(4)添加一些代碼告訴Spring(我猜測WebApplicationContext的一個專門實現),它加載一個文件夾中的所有文件並將它們作爲配置資源進行處理。我們目前有

<資源URI = 「〜/ APP_CONFIG/xyz.xml」/ >

我想是這樣

< resourceFolder路徑= 「〜/ APP_CONFIG /春」/ >

任何人都知道如何做到這一點,或者如果已經有類似的東西存在,我可以查看?

...我也是持開放的態度讓我我想要什麼其他的建議?

+0

好的,沒有接受者?讓我們簡化一下 - 只是第二部分,我如何讓Spring從Web上下文中的目錄加載所有配置? –

回答

0

好了,我想我對這個答案....

由於我使用這個「插件」風格的架構,我需要彈簧來加載給定文件夾中的所有配置文件(我注意到爲了重新加載應用程序上下文而進行的更改)。 filewatcher元素在我使用的CMS中已經可用(謝謝Sitecore),所以我只需要加載配置。

因此,我所做的是創建IResource的實現,該實現允許我使用自定義協議來加載彈簧資源。

第1步 - 網頁。配置的變化

首先我創建resourceHandler部分:

<sectionGroup name="spring"> 
    <section name="context" type="Spring.Context.Support.WebContextHandler, Spring.Web"/> 
    <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" /> 
    <section name="resourceHandlers" type="Spring.Context.Support.ResourceHandlersSectionHandler, Spring.Core"/> 
</sectionGroup> 

然後,添加代碼爲我定製的資源處理程序

<spring> 
    <resourceHandlers> 
     <handler protocol="dir" type="TI.Base.Spring.DirResourceHandler, TI.Base"/> 
    </resourceHandlers> 
<context> 
    <resource uri="dir://~/App_Config/Spring" /> 
</context> 
</spring> 

接下來,我創建了DirResourceHandler - 這非常密切的模型StringResource Spring提供 - 這是肉的初始化:

/// <summary> 
/// Load all of the resource files in the directory, and create a virtual file importing all of those files 
/// </summary> 
/// <param name="resourceName"></param> 
private void Initialize(string resourceName) 
{ 
    string resourceNameWithoutProtocol = GetResourceNameWithoutProtocol(resourceName).TrimEnd(new [] {'/'}); 

    Path = HttpContext.Current.Server.MapPath(resourceNameWithoutProtocol); 
    DirectoryInfo = new DirectoryInfo(Path); 

    IEnumerable<FileInfo> files = DirectoryInfo.EnumerateFiles("*.xml"); 
    StringBuilder sb = new StringBuilder(); 

    sb.Append("<objects>"); 

    foreach (FileInfo xmlFile in files) 
    { 
     sb.Append(string.Format("<import resource=\"file://{0}/{1}\"/>", resourceNameWithoutProtocol, xmlFile.Name)); 
    } 
    sb.Append("</objects>"); 

    Contents = sb.ToString(); 
} 

你們任何一個春季大師都可以評估這個解決方案並告訴我它是否可行?