好的,所以我想我有一个答案......
由于我使用的是这种“插件”风格的架构,我需要 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 大师都可以评估这个解决方案并告诉我它是否可行吗?