1

我正在处理 spring 的配置问题,与使用基于组件的架构以及 spring 如何加载它的配置文件有关。

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

我想要的是以下内容:

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

(2) 如果从文件夹中添加/删除 XML 文件,则向该目录添加一个文件监视程序以重新加载应用程序(Sitecore 已经这样做了)

(3) 如果我部署一个组件(称为 xyz),我会将一个 xyz.spring.xml 文件部署到该文件夹​​,其中将包含一个用于组件内正确配置的单个导入语句,例如:<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" />

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

...我也愿意接受其他可以让我得到我想要的建议...

4

1 回答 1

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

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

于 2013-02-02T14:00:52.293 回答