当客户端只知道接口时,需要一种方法来关闭ChannelFactory

时间:2009-10-16 07:06:05

标签: wcf

请帮我解决这个问题。

我有一个使用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

3 个答案:

答案 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();