在我们的WCF项目中,我们使用singleton pattern
来获取客户端代理。
基本上是因为 -
Binding
或Endpoint
只需要很少的更改。为了确保在每次服务电话后connection is closed
正确使用,我们计划在单身中实施IDisposable
,如下所示 -
public class ClientSingleton : IDisposable
{
static Service1Client client;
private ClientSingleton()
{
client = new Service1Client();
}
public Service1Client getInstance()
{
if (client != null)
return client;
else
{
client = new Service1Client();
return client;
}
}
public void Dispose()
{
client.Close();
}
}
这是否违反了Singleton Design-Pattern
原则?任何改进这方面的建议都会有所帮助。
修改
考虑using block
处理客户端对象,如下所示 -
using (Service1Client client = new Service1Client())
{
client.Operation1();
}
这意味着WCF代理实现了IDisposable
接口。所以我认为在这里实现这个界面没有任何害处。
谢谢!
答案 0 :(得分:1)
我一直在项目中使用扩展方法,负责正确关闭服务连接。 (我从某个博客偷了扩展方法,我忘记了博客链接)
public static void CloseConnection(this ICommunicationObject client)
{
if (client.State != CommunicationState.Opened)
{
return;
}
try
{
client.Close();
}
catch (CommunicationException)
{
client.Abort();
throw;
}
catch (TimeoutException)
{
client.Abort();
throw;
}
catch (Exception)
{
client.Abort();
throw;
}
}
与您的方法(特定于特定代理)不同,可以在任何代理上使用它来安全地关闭连接。
使用示例
Service1Client client = null
try
{
client = new Service1Client();
}
finally
{
if(client != null)
client.CloseConnection();
}