2009-10-16 104 views
2

时,需要一种方法来关闭ChannelFactory请帮我解决这个问题。当客户端只知道接口

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

回答

4

来解决它的最好方法是保持参照ChannelFactory活着的只要你需要它。因此,从GetTestService方法中创建ChannelFactory,并在初始化类(例如构造函数)时创建工厂,并在不再需要工厂时(例如,在您的类的Dispose方法中)关闭它。

ChannelFactory是一个工厂类,您可以随意多次重复使用,因此每次需要服务实现时都不需要创建它。

+0

这听起来像一个不错的解决方案。 所以我可以做的是有我自己的“ServiceFactory”,其中包含一个静态ChannelFactory 。每次我需要一个频道时,我都会在这个成员上调用CreateChannel()。 当应用程序终止时,我在ChannelFactory上调用close。 这听起来像是正确的做法吗? – GAT 2009-10-16 07:57:04

+0

这是正确的方法。重点是每次需要频道时都不应创建新的ChannelFactory。在程序期间保持ChannelFactory存活没有任何问题。 – 2009-10-16 08:47:14

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 
} 

客户端的寿命将是相同的信道工厂的寿命。

+0

这听起来像是一个不错的解决方案。所以你想让我做的是为我的服务打包一个包装,我可以在我的应用程序中使用它? – GAT 2009-10-16 08:15:17

+0

自从他回答第一个问题以来,我接受了@rwwilden的答案。我认为这两个答案都很好,所以我投了你的答案。 – GAT 2009-10-16 20:43:03

1

你有没有试过把它转换成IClientChannel然后调用Close?

((IClientChannel)service).Close(); 
+0

我想这会工作。但我不希望我的客户知道IClientChannel。这会破坏我的单元测试,因为我的FakeService没有实现IClientChannel。 – GAT 2009-10-16 08:03:24

+0

Yeap-我个人会选择rwwilden的解决方案。我打算补充一点,但是我的互联网连接掉在火车上了! – RichardOD 2009-10-16 08:42:48

+0

我想你使用C#作为运营商,而只是调用关闭,如果它不为null。这将允许你的单元测试不会失败 - 请看这里:http://msdn.microsoft.com/en-us/library/cscsdfbt.aspx – RichardOD 2009-10-16 09:15:28