组合复合应用程序配置的方法(例如PRISM,MEF)

时间:2011-04-01 13:48:48

标签: c# .net configuration prism mef

PRISM和MEF等框架使得从多个可组合组件中设计复杂的应用程序变得非常容易。一个常见的例子是插件架构,其中应用程序shell可以使用插件UI组件进行动态重新配置(例如,通过将DLL放入Plug-ins目录中)。

这一切都很好,但正如Vac Can Prism be modular when calling webservices?中发现的那样,有些情况下每个插件都需要自己的配置集--WCF绑定是一个典型的例子,但还有很多其他场景(具有类似需求的日志记录,数据库连接等。

所以,正如我所看到的,我们的选择是:

  • 所有配置都进入shell应用程序的App.config(正如Vaccano所提到的那样打破了此模型的整个封装和部署优势),或者
  • 每个插件程序集使用一个定制的配置机制(例如嵌入式资源),然后使用它来动态配置WCF服务(例如,它最多是凌乱和耗时,最坏的情况可能是不可能的)

这些选项都不是理想选择,但它们都是解决方法。但是,理想情况是每个插件DLL都有自包含配置(例如嵌入式资源文件)或Xxx.dll.config文件,并将每个XML配置片段合并到{{1在运行时动态配置shell应用程序。这让人联想到合并App.configMachine.config文件的方式。

因此,我的问题是:有没有人遇到任何现有的框架或技术,可以用来将复合配置文件动态合并到容器应用程序的进程内配置中? 我很惊讶不要将此视为PRISM或MEF的一部分,因此稍微警惕发布此问题,以防我错过了一些明显的事情 - 如果是这样,请悄悄发布相关链接:)

3 个答案:

答案 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