Chr*_*ard 14 .net c# configuration prism mef
PRISM和MEF等框架使得从多个可组合组件中设计复杂的应用程序变得非常容易.一个常见的例子是插件架构,其中应用程序shell可以通过插件UI组件进行动态重新配置(例如,通过将DLL删除到Plug-ins目录中).
这一切都很好,但是当调用网络服务时,在Can Prism中发现的Vaccano 是模块化的吗?在某些情况下,每个插件都需要自己的配置集--WCF绑定是一个典型示例,但还有许多其他具有类似需求的场景(日志记录,数据库连接等).
所以,正如我所看到的,我们的选择是:
App.configshell应用程序(正如Vaccano所提到的那样打破了这个模型的整个封装和部署优势),或者这些选项都不是理想选择,但它们是解决方法.但是,理想情况是每个插件DLL都有自包含配置(例如嵌入式资源文件)或Xxx.dll.config文件,并且App.config在运行时动态地将这些XML配置片段中的每一个合并到shell应用程序的配置中.这让人联想到合并的方式Machine.config和App.config文件.
因此,我的问题是:有没有人遇到过任何现有的框架或技术,可以用来将复合配置文件动态合并到容器应用程序的进程内配置中?我很惊讶不要将此视为PRISM或MEF的一部分,因此稍微警惕发布此问题以防我错过了一些明显的事情 - 如果是这样,请悄悄发布相关链接:)
我们遇到了同样的问题。我也没有找到解决这个问题的方法。
以下是我见过人们做过(或者我们做过)的两件事:
手动服务端点注册
创建一个应用程序服务注册表,说明如何从 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、生产)唯一的属性。我不知道这是否是您关心的问题,但这是放置此类配置的方便位置。
两者都有效。令我惊讶的是,我没有看到更多的人谈论这个问题。很好的问题。