Несколько методов вызова службы WCF
-
28-09-2019 - |
Вопрос
У меня есть класс, который обрабатывает все взаимодействия в моем приложении с моей службой WCF, и кажется, что MSDN говорят, что использование оператора Using)_ с WCF плохо - я могу понять, почему это плохо, и согласен с этим (http://msdn.microsoft.com/en-us/library/aa355056.aspx )
моя проблема в том, что предложенный ими метод реализации будет означать, что у меня есть 10 методов [как 10 общедоступных методов в моем сервисе], которые будут иметь одинаковую структуру кода, и это, конечно, не соответствует принципу DRY - код выглядит следующим образом:
try
{
results = _client.MethodCall(input parameteres);
_client.Close();
}
catch (CommunicationException)
{
if (_client != null && _client.State != CommunicationState.Closed)
{
_client.Abort();
}
}
catch (TimeoutException)
{
if (_client != null && _client.State != CommunicationState.Closed)
{
_client.Abort();
}
}
catch (Exception ex)
{
if (_client != null && _client.State != CommunicationState.Closed)
{
_client.Abort();
}
throw;
}
Здесь пока нет никакого протоколирования, но, конечно, когда я начну протоколировать это, мне нужно будет добавить работу по протоколированию почти в 10 разных местах
есть ли у кого-нибудь какие-нибудь советы о том, как я могу быть немного более изобретательным при повторном использовании кода
Спасибо
пол
Решение
Я бы использовал какой-нибудь универсальный, настраиваемый компонент обработки исключений, который позволяет выполнять базовую обработку исключений, такую как протоколирование, повторное выбрасывание и т.д.должен быть отсоединен от фактического места обработки.Одним из примеров такого компонента является Microsoft Блок приложения для обработки исключений.
Тогда вы могли бы в конечном итоге получить такой код, как этот:
try
{
results = _client.MethodCall(input parameteres);
_client.Close();
}
catch (Exception ex)
{
_client.CloseIfNeeded();
if (!ex.Handle("Wcf.Policy")) throw;
}
где CloseIfNeeded
обозначает пользовательский метод расширения, инкапсулирующий логику закрытия канала WCF, и Handle
метод исключения вызывает механизм обработки исключений, передавая имя политики исключений, которая должна быть применена в этом месте.
В большинстве случаев вы можете сократить логику обработки исключений до приличной одной или двух строк кода, что дает вам несколько преимуществ:
- мгновенная конфигурируемость поведения при обработке исключений (политик)
- расширяемость благодаря пользовательским обработчикам исключений, привязанным к определенным типам исключений и политикам исключений.
- лучшая управляемость и читабельность кода