在我的业务层中,我正在使用WCF服务。 WCF服务实例也可以在构造函数中传递。以下是我的BL的构造函数。
private IWCFClient wcfClient;
public MyBL()
:this(new WCFClient())
{
}
public MyBL(IWCFClient wcfClient)
{
serviceClient = wcfClient;
}
因为我将wcfClient声明为接口,所以我没有得到.Close()方法。我必须将其类型化为((RealwCFClient)wcfClient).Close();
有没有办法可以关闭我的客户而不进行类型转换?我应该在界面中公开Close方法吗?
答案 0 :(得分:3)
将您的对象投射到ICommunicationObject
然后.Close()它。
请注意,Close()可以抛出异常,在这种情况下捕获它并执行.Abort()
答案 1 :(得分:1)
除了其他答案,您还应该考虑creating a reusable WCF service client。在这个可重用的客户端中,您可以处理打开和关闭,而不是让消费类担心它。
答案 2 :(得分:1)
您可以为您的类实现IDisposable,并在您的Dispose方法中关闭WCF服务实例。
public class Consumer
{
public void SomeMethod()
{
using (WCFClient client = new WCFClient(new WCFService()))
{
int sum = client.Add(5, 10);
}
}
}
public class WCFClient : IDisposable
{
private WCFService _service;
public WCFClient(WCFService service)
{
_service = service;
}
public int Add(int a, int b)
{
return _service.Add(a, b);
}
public void Dispose()
{
if (_service != null)
_service.Close();
}
}
Consumer的SomeMethod()方法中的using块将确保调用WCFClient的dispose方法来关闭与服务的连接。
答案 3 :(得分:1)
这是一个链接 MSDN doc concerning closing a client
一般来说,dispose / close不会抛出异常我使用了一个包含这个功能的扩展方法,这里是一个非常好的 article providing the basic concept
我喜欢使用或执行方法名称而不是使用动词,因为使用具有调用dispose的含义,大多数人都不希望例外。
答案 4 :(得分:0)
只要IWCFClient
的所有具体实施者都有Close()
方法,然后将Close()
方法添加到界面。