using (var client = new SomeWCFServiceClient())
{
//Do something with the client
}
There are few stackoverflow threads about how to do it. But not a single one of them satisfy my typical needs.This is how I do it.
In a service class:
IBuildServiceDisposable GetBuildWebService()
{
return _buildWebService.GetBuildWsClient();
}
private WcfDisposableWrapper<IBuildServiceDisposable> WcfService
{
get
{
return new WcfDisposableWrapper<IBuildServiceDisposable>();
}
}
public Brochure GetBrochures(BrochureRequest param)
{
return WcfService.Use(
GetBuildWebService(),
client => client.GetBrochures(param));
}
Where the service interface inherits from an interface that was auto generated by client proxy (IBuildService) is defined as:
public interface IBuildServiceDisposable : IBuildService, IDisposable, ICommunicationObject {}
The most important part is implementation of WcfDisposableWrapper class itself:
public class WcfDisposableWrapper<T> where T : ICommunicationObject, IDisposable
{
public TReturnType Use<TReturnType>(T clientProxy, Func<T, TReturnType> codeBlock)
{
bool success = false;
try
{
var returnValue = codeBlock(clientProxy);
clientProxy.Close();
success = true;
return returnValue;
}
finally
{
if (!success)
{
clientProxy.Abort();
clientProxy.Dispose();
}
}
}
}
No comments:
Post a Comment