Вопрос

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

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

  • мгновенная конфигурируемость поведения при обработке исключений (политик)
  • расширяемость благодаря пользовательским обработчикам исключений, привязанным к определенным типам исключений и политикам исключений.
  • лучшая управляемость и читабельность кода
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top