我正在研究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”/>
任何人都知道如何做到这一点,或者如果已存在类似的东西我可以查看吗?
......我也愿意接受其他建议,让我得到我想要的东西......
答案 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();
}
你们中的任何人都可以评估这个解决方案并告诉我它是否可行?