Spring.NET配置文件动态从文件夹加载

时间:2013-01-22 15:09:55

标签: spring.net

我正在研究spring的配置问题,与使用基于组件的体系结构有关,以及spring如何加载它的配置文件。

问题是每个组件都会向spring上下文添加信息,但是为了从程序集加载新的配置,你必须编辑web.config并添加该组件的配置资源(或者在至少编辑现有资源文件并从程序集导入组件的配置。 web.config由另一个组“拥有”,无法编辑。

我想要的是以下内容:

(1)在我的弹簧文件的App_Config中创建一个特定的目录

(2)如果在文件夹中添加/删除XML文件,则将filewatcher添加到该目录以重新加载应用程序(Sitecore已经这样做了)

(3)如果我部署了一个组件(称之为xyz),我会将xyz.spring.xml文件部署到该文件夹​​,该文件夹将包含一个import语句,用于组件中的正确配置,例如: < import resource =“assembly://PageTypes.Service/PageTypes.Service/PageTypes.xml”/> 或者如果我需要配置测试/调试配置 < import resource =“assembly://PageTypes.Service/PageTypes.Service/PageTypes.DEBUG.xml”/>

(4)添加一些代码告诉spring(我猜测WebApplicationContext的一个专门实现),它加载文件夹中的所有文件并将它们作为配置资源处理。我们目前在哪里

< resource uri =“〜/ App_Config / xyz.xml”/>

我想要像

这样的东西

< resourceFolder path =“〜/ App_Config / Spring”/>

任何人都知道如何做到这一点,或者如果已存在类似的东西我可以查看吗?

......我也愿意接受其他建议,让我得到我想要的东西......

1 个答案:

答案 0 :(得分:0)

好的,所以我想我有一个答案....

由于我正在使用这种“插件”样式架构,我需要spring来加载给定文件夹中的所有配置文件(为了重新加载应用程序上下文,我会注意更改)。 filewatcher元素已在我正在使用的CMS中可用(感谢Sitecore),因此我只需要处理加载配置的方法。

所以,我所做的是创建一个IResource实现,允许我使用自定义协议来加载spring资源。

第1步 - web.config更改

首先我创建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 - 它非常接近Spring提供的StringResource模型 - 这是在初始化中的主要内容:

/// <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();
}

你们中的任何人都可以评估这个解决方案并告诉我它是否可行?