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

Chr*_*ard 14 .net c# configuration prism mef

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

这一切都很好,但是当调用网络服务时,Can Prism中发现的Vaccano 是模块化的吗?在某些情况下,每个插件都需要自己的配置集--WCF绑定是一个典型示例,但还有许多其他具有类似需求的场景(日志记录,数据库连接等).

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

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

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

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

And*_*mes 4

我们遇到了同样的问题。我也没有找到解决这个问题的方法。

以下是我见过人们做过(或者我们做过)的两件事:

手动服务端点注册

创建一个应用程序服务注册表,说明如何从 T 创建 ChannelFactory。每个模块都可以通过调用在 IModule Initialize 中为此做出贡献,RegisterService<T>并且该模块的所有从属视图都可以从中获取其 Channel Factory:

public interface IServiceRegistry
{
     void RegisterService<T>(ServiceEndpoint ep);
     ChannelFactory<T> GetService<T>();
}
Run Code Online (Sandbox Code Playgroud)

当然,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);
}
Run Code Online (Sandbox Code Playgroud)

我们的“Endpoints.config”每个端点名称有多个端点,并添加了使该端点对于环境(DEV、QA、Staging、生产)唯一的属性。我不知道这是否是您关心的问题,但这是放置此类配置的方便位置。

两者都有效。令我惊讶的是,我没有看到更多的人谈论这个问题。很好的问题。