Несколько методов для вызова службы WCF - PullRequest
0 голосов
/ 06 октября 2010

У меня есть класс, который обрабатывает все взаимодействия в моем приложении с моей службой 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 разных местах

есть ли у кого-нибудь какие-либо советы о том, как я могу быть немного более изобретательным при повторном использовании кода

спасибо

Пол

1 Ответ

5 голосов
/ 06 октября 2010

Я бы использовал какой-то универсальный, настраиваемый компонент обработки исключений, который позволяет отделить базовую обработку исключений, такую ​​как ведение журнала, повторный вызов и т. Д., От фактического места обработки. Одним из примеров такого компонента является Microsoft Блок обработки исключений .

Тогда вы можете получить такой код:

try
{
    results = _client.MethodCall(input parameteres);
    _client.Close();
}
catch (Exception ex)
{
    _client.CloseIfNeeded();
    if (!ex.Handle("Wcf.Policy")) throw;
}

где CloseIfNeeded обозначает пользовательский метод расширения, инкапсулирующий логику закрытия канала WCF, а метод Handle вызывает механизм обработки исключений, передавая имя политики исключений, которая должна применяться в этом месте.

В большинстве случаев вы можете сократить логику обработки исключений до приличной одной или двух строк кода, что дает вам несколько преимуществ:

  • мгновенная конфигурация поведения обработки исключений (политики)
  • расширяемость с помощью пользовательских обработчиков исключений, привязанных к определенным типам исключений и политикам исключений
  • лучшая управляемость и удобочитаемость кода
...