请帮我解决这个问题。
我有一个使用WCF的客户端。我不希望这个客户端知道它从服务获取数据。我想使用这样的模型,所以我更容易对代码进行单元测试,并在以后替换给定接口的实现。这个模型的问题是我无法在ChannelFactory上调用close。我不确定我需要打电话,但感觉还不对。
所以我的问题是:
当客户端只知道服务的接口时,有没有人知道关闭ChannelFactory的好模式?或者ChannelFactory是通过某种魔法自我封闭的?
下面是一些示例代码,我希望您能理解这个问题:
static void Main(string[] args)
{
ITestService service = GetTestService();
Console.WriteLine(service.GetData(42));
}
private static ITestService GetTestService()
{
var cf = new ChannelFactory<ITestService>(new WSHttpBinding(), new EndpointAddress("http://localhost:8731/TestService/"));
return cf.CreateChannel();
}
谢谢, GAT
答案 0 :(得分:4)
解决此问题的最佳方法是,只要您需要,就可以保持对ChannelFactory
的引用。因此,从ChannelFactory
方法创建GetTestService
并在类的初始化(例如构造函数)中创建工厂,并在不再需要工厂时关闭它(在{ {1}}您的类的方法,例如)。
Dispose
是一个工厂类,您可以根据需要重复使用多次,因此无需在每次需要服务实现时都创建它。
答案 1 :(得分:2)
你应该实现像
这样的类public class MyClient : ITestService
{
private ChannelFactory<ITestService> factory;
private ITestService proxy;
//...
//expose here methods Open and Close that internally will open and close channel factory
//implement interface members
}
此处客户的生命周期与渠道工厂的生命周期相同。
答案 2 :(得分:1)
您是否尝试将其投射到IClientChannel然后调用Close?
((IClientChannel)service).Close();