Я написал метод расширения для использования со службами WCF, который хранит всю логику удаления и обработки исключений в одном месте. Метод заключается в следующем:
public static TResult CallMethod<TChannel, TResult>(
this ClientBase<TChannel> proxy,
Func<TResult> func) where TChannel : class
{
proxy.ThrowIfNull("proxy");
func.ThrowIfNull("func");
try
{
// set client credentials
return func();
}
finally
{
if (proxy != null)
{
try
{
if (proxy.State != CommunicationState.Faulted)
{
proxy.Close();
}
else
{
proxy.Abort();
}
}
catch (CommunicationException)
{
proxy.Abort();
}
catch (TimeoutException)
{
proxy.Abort();
}
catch (Exception)
{
proxy.Abort();
throw;
}
}
}
}
Метод будет использоваться так:
public int CreateBusinessObject(BusinessObject item)
{
MyServiceClient proxy = new MyServiceClient();
return proxy.CallMethod(() => proxy.CreateBusinessObject(item));
}
Мой вопрос действительно заключается в том, будет ли это лучше в качестве статического метода, который создает прокси службы? Я немного беспокоюсь о своей текущей реализации. Должна ли конструкция прокси находиться внутри try / catch? В настоящее время я понимаю, что если конструктор потерпит неудачу, все равно нечего утилизировать.