PRISM和MEF等框架使得从多个可组合组件中设计复杂的应用程序变得非常容易。一个常见的例子是插件架构,其中应用程序shell可以使用插件UI组件进行动态重新配置(例如,通过将DLL放入Plug-ins
目录中)。
这一切都很好,但正如Vac Can Prism be modular when calling webservices?中发现的那样,有些情况下每个插件都需要自己的配置集--WCF绑定是一个典型的例子,但还有很多其他场景(具有类似需求的日志记录,数据库连接等。
所以,正如我所看到的,我们的选择是:
App.config
(正如Vaccano所提到的那样打破了此模型的整个封装和部署优势),或者这些选项都不是理想选择,但它们都是解决方法。但是,理想情况是每个插件DLL都有自包含配置(例如嵌入式资源文件)或Xxx.dll.config
文件,并将每个XML配置片段合并到{{1在运行时动态配置shell应用程序。这让人联想到合并App.config
和Machine.config
文件的方式。
因此,我的问题是:有没有人遇到任何现有的框架或技术,可以用来将复合配置文件动态合并到容器应用程序的进程内配置中? 我很惊讶不要将此视为PRISM或MEF的一部分,因此稍微警惕发布此问题,以防我错过了一些明显的事情 - 如果是这样,请悄悄发布相关链接:)
答案 0 :(得分:4)
我们遇到了同样的问题。我也没有找到解决方案。
以下是我见过人们做过的两件事(或者我们已经做过):
手动服务端点注册
创建一个应用程序服务注册表,说明如何从T创建ChannelFactory。每个模块都可以通过调用RegisterService<T>
在IModule Initialize中为此做出贡献,并且该模块的所有从属视图都可以从中获取它们的Channel Factories:
public interface IServiceRegistry
{
void RegisterService<T>(ServiceEndpoint ep);
ChannelFactory<T> GetService<T>();
}
而不是在这里返回ChannelFactory<T>
,你当然可以返回T
(告诫者)。 View / ViewModels只是要求IServiceRegistry作为依赖项并以这种方式获取其服务代理。在编写单元测试时,这也为隔离提供了便利的地方。
嵌入式配置
一个约定系统大致做与上面相同的事情,但基于DLL中嵌入的配置(如您所建议)并使用命名配置。你将以与上面相同的方式使用它,但这将是一种略微不同的体验。我们使用嵌入在DLL中的约定“Endpoints.config”并从中读取。
public interface IServiceChannelFactoryFactory //I'm terrible at naming
{
//This is much like the generated concrete class when you use "Add Service Reference"
//Except there is no method with an empty parameter
ChannelFactory<T> GetService<T>(string endpointName);
}
我们的“Endpoints.config”每个endpointName有多个端点,并添加了一些属性,使该端点对环境唯一(DEV,QA,Staging,Production)。我不知道这对你来说是否是一个问题,但这是一个方便的地方进行这种配置。
两者都有效。令我惊讶的是,我没有看到更多人谈论这个问题。好问题。
答案 1 :(得分:1)
模式中的Composite Services guidance项目&amp;实践(为您带来Prism的同一团队)为服务发现,组合和集成提供设计和实现模式。
关于动态配置合并,请查看Enterprise Library 5.0中的complex config scenarios实现。它不是通用的,只关注企业库配置,但您仍然可以检查源代码。
答案 2 :(得分:0)
对于Windows / WPF应用程序,您可以通过创建自定义设置提供程序来实现此目的 - 这是您构建的类,可插入.net配置系统。
理论上,您可以将设置放入特定于模块的配置文件中。您将构建一个设置提供程序,该提供程序知道如何在运行时查找这些特定于模块的文件,并提供设置。由于它位于“低于”堆栈中的配置使用者,WCF或其他技术不需要知道任何特殊的使用它。唯一的缺点是Silverlight似乎不支持它。
这是一个代码项目文章的链接,其中实现了一个:http://www.codeproject.com/KB/vb/CustomSettingsProvider.aspx
以下是MSDN文档的链接:http://msdn.microsoft.com/en-us/library/system.configuration.settingsprovider.aspx