许多人面临的WCF中的一个常见问题是不可能从不同的配置文件加载客户端配置.
当开发人员想要部署一些二进制文件以及独立配置文件(也可能位于资源文件或其他配置文件中)时,这是常见的情况,以避免修改主配置文件.
我找到了两个参考文献:
http://social.msdn.microsoft.com/forums/en-US/wcf/thread/f33e620a-e332-4fd4-ae21-88c750437355/
哪个是关于它的最佳解决方案?
有关最佳解决方案的任何建议吗?我使用VS 2008和.NET 3.5.
假设我有3个程序集,Example.Core,Example.Contracts,Example.WcfServices.在我的契约程序集中,我定义了一个接口并添加了一些操作,例如ICalculator,它具有Add(double a,double b)操作.在我的WcfServices程序集中,我将ICalculator实现为Wcf服务.
现在我的问题是这个......在我的Example.Core程序集中,如何在保持所有内容解耦的同时对该接口进行编程(以允许我有一个替代的接口实现).如果我有一个需要ICalculator的类,我可以创建一个来自ChannelFactory并使用它,或者我可以在构造函数中注入一个实例.如果我在课堂上创建一个,那么我在ChannelFactory/Wcf中将依赖项放在我的班级中,我真的不想这样做.如果我在构造函数中注入一个实例,那么注入类将如何管理和整理wcf服务?似乎虽然我有一个界面,但我没有干净的使用方法.我已经看过像NInject这样的东西了,但我不相信如果它出现故障会清理ChannelFactory(至少我没有发现任何文档显示它知道何时调用Abort而不是在通道上关闭).
我最终做的是再次实现我的界面并使用此问题中描述的方法:创建WCF ChannelFactory <T>并只调用服务上的方法.这对我来说有点"闻起来",因为我再次包裹所有的电话只是为了确保通道正确关闭/中止.
有没有任何模式/方法干净地有两个接口的实现,其中一个是Wcf服务?
谢谢,
麦克风.
WCF服务将使用另一个Wcf服务.现在,我想创建通道工厂对象并手动缓存它.我知道表现会很好,但会引起任何其他问题的关注.
我发现信息如下:
"使用ChannelFactory,您仍然可以使用自己的自定义MRU缓存实现通道工厂缓存.这仍然意味着一个重要的限制:对共享通道工厂的同一服务端点的调用也必须共享相同的凭据.这意味着您无法传递不同的凭据对于从Web服务器层调用应用程序服务的每个线程.如果您使用相同的证书或Windows凭据对下游服务进行身份验证,则会出现这种情况.在这种情况下,如果您需要传递有关经过身份验证的用户的信息,您可以使用自定义标头而不是安全令牌."
链接:http://devproconnections.com/net-framework/wcf-proxies-cache-or-not-cache
我在Google中找到了一个示例代码,如下所示.
internal delegate void UseServiceDelegate<in T>(T proxy);
internal static class Service<T>
{
private static readonly IDictionary<Type, string>
cachedEndpointNames = new Dictionary<Type, string>();
private static readonly IDictionary<string, ChannelFactory<T>>
cachedFactories =
new Dictionary<string, ChannelFactory<T>>();
internal static void Use(UseServiceDelegate<T> codeBlock)
{
var factory = GetChannelFactory();
var proxy = (IClientChannel)factory.CreateChannel();
var success = false;
try
{
using (proxy)
{
codeBlock((T)proxy);
}
success = true;
}
finally
{
if (!success)
{
proxy.Abort();
}
}
}
private static ChannelFactory<T> …Run Code Online (Sandbox Code Playgroud)