С этим проблем нет. Такая настройка кода, сгенерированного дизайнером, - это как раз та функция, которую должны предоставлять частичные классы, и это один из рекомендуемых способов борьбы с нарушенной реализацией IDisposable
в ClientBase
.
Что касается необходимости повторной реализации этого кода для каждого клиента WCF - к сожалению, да, если вы захотите использовать шаблон IDisposable
с ними. Вы можете извлечь блок if/else
в служебный метод, но вам все равно придется создать частичный класс для каждого и переопределить Dispose
.
Поскольку вышеприведенное довольно утомительно, многие люди предпочитают вместо этого использовать Service Proxy Helper , поскольку он не требует написания нового кода.
Я использую слегка измененную версию, сам:
public static class Service<TProxy>
where TProxy : ICommunicationObject, IDisposable, new()
{
public static void Using(Action<TProxy> action)
{
TProxy proxy = new TProxy();
bool success = false;
try
{
action(proxy);
proxy.Close();
success = true;
}
finally
{
if (!success)
{
proxy.Abort();
}
}
}
}
Что позволяет писать такой код:
Service<MyServiceClient>.Using(svc => svc.PerformOperation());
Или:
Service<MyServiceClient>.Using(svc =>
{
var result = svc.PerformOperation();
ProcessResult(result);
});
Примечание. Создание прокси WCF обходится дорого, поэтому вы, как правило, стараетесь поддерживать их как можно дольше, а не создавать и утилизировать их каждые несколько секунд (или больше). Это предназначено для клиентов, которые редко используются.