设计问题 - 在 DLL 级别处理 .NET 应用程序配置
Posted
技术标签:
【中文标题】设计问题 - 在 DLL 级别处理 .NET 应用程序配置【英文标题】:Design Question - Handling .NET App Config at a DLL level 【发布时间】:2011-09-15 01:11:27 【问题描述】:我有一个现有的基于 .NET 3.5 的框架,该框架使用自定义插件进行了扩展。总之,插件实现了一个通用接口,核心框架通过反射调用这些接口。该框架运行良好,一切都很好,但是......
我现在有一个需要与 WCF 服务通信的插件的要求。从表面上看,这很简单,为插件添加一个服务引用,调用客户端代理代码,然后我们就开始了。不过……
由于 .NET 配置的工作方式,WCF 服务客户端配置应该驻留在正在执行的应用程序的 app.config 中。在这种情况下,这是我的插件调用程序应用程序。这样做的问题是它破坏了插件“模型”,因为通用调用程序应用程序现在必须在其中包含特定于插件的配置。
所以问题是,是否有人知道处理 WCF 服务客户端配置而不将其放入核心调用程序应用程序配置的替代机制?
经过一番探索,有一些机制允许 DLL to use its own config file。这里的问题是我无权访问服务代理创建的下划线代码,因此似乎无法重定向配置读取。
【问题讨论】:
我可能完全无法理解这个问题,但是否可以扩展插件合同以包含服务初始化方法?然后让您的基于服务的插件实现与一般合同相反的合同。这将允许您将服务初始化内容卸载给插件开发人员,而无需担心初始化的细节。 【参考方案1】:回答我自己的问题:
我似乎在这里找到了解决问题的方法:
http://weblogs.asp.net/cibrax/archive/2007/10/19/loading-the-wcf-configuration-from-different-files-on-the-client-side.aspx
总而言之,这允许您指定包含 WCF 配置的自定义配置文件,因为它是由 Visual Studio 生成的 - 这意味着可以轻松维护配置。
进行了几次快速测试后,它似乎可以正常工作(在这里和那里进行了一些调整(请参阅页面上的 cmets)。
【讨论】:
【参考方案2】:WCF 客户端的端点也可以通过编程方式配置。
下面的示例展示了如何在不需要配置文件的情况下调用 WCF 服务:
var myBinding = new BasicHttpBinding();
var myEndpoint = new EndpointAddress("http://localhost/myservice");
var client = new MyServiceClient(myBinding, myEndpoint);
try
client.MyServiceOperation();
client.Close();
catch
if (client != null)
client.Abort();
相关资源:
ClientBase<TChannel> Constructor (Binding, EndpointAddress)【讨论】:
我确实考虑过这个选项,但是能够使用 WCF 配置并能够使用所有可用的属性等将是有益的。如果我使用编程绑定等,那么我将不得不自己管理所有配置 - 它也可能会在未来的 .NET 版本中破坏。 如果您想让插件宿主与外部插件的实现细节完全隔离,那么您最好的选择是定义一套设计指南供插件作者遵循乙>。在这些指南中,您将描述他们应该如何处理自定义配置设置,例如通过拥有自定义配置文件并通过System.Configuration API 读取它们。 作为框架和插件开发人员,这些指南有点暗示 :) 我们已经有使用自己的配置文件的插件,但这些目前都使用基本的应用程序设置或自定义配置部分。 WCF 配置的问题是我找不到一种方法来告诉 WCF 服务客户端构造函数使用除执行应用程序 app.config 之外的任何东西以上是关于设计问题 - 在 DLL 级别处理 .NET 应用程序配置的主要内容,如果未能解决你的问题,请参考以下文章
处理来自 C++ DLL 的用户定义异常 - .NET PInvoke/Marshalling
如何设计一个包装类来使用 C++ 应用程序以使用 C# DLL?
如何在 dll 级别读取 app.config。? [复制]
将 MFC Gui 应用程序包装到 .NET 互操作的 DLL(或其他东西)中