WCF Исключение и обработка ООП - PullRequest
2 голосов
/ 15 июня 2011

Хорошо, поэтому я задал еще один вопрос на ту же тему здесь , и хотя я не получил прямого ответа, я собрал некоторый код, который я получил, чтобы выполнить то, что я хотел.Вопрос в том, нарушает ли этот способ какой-либо принцип ООП?

Что я хотел

  1. Использовать надлежащий ООП для объявления типов ошибок в сервисе
  2. Иметь один блок перехвата на стороне клиента, который может обрабатывать несколько типов исключений, генерируемых службой.
  3. Иметь по одному методу HandleException на класс отказа, который имеет свою собственную реализацию.
  4. На стороне клиента есть толькоодин блок исключения понимает, какое исключение было сгенерировано, и вызывает соответствующий метод HandleException из соответствующего класса ошибок

Как это работает

Объявлен контракт на ошибкусервер для каждого типа исключения, который наследуется от базового типа исключения

[DataContract]
public class BusinessRuleViolationFault : BaseFault
{
  public BusinessRuleViolationFault(string message)
  : base(message)
        {

        }
}
[DataContract]
public class SomeOtherViolationFault : BaseFault
{
    public SomeOtherViolationFault(string message)
        : base(message)
    {

    }
}

[DataContract]

открытый абстрактный класс BaseFault

{

public BaseFault(string message)
{
  Message = message;
} 

}

На стороне клиента я создал частичные классы с теми же типами сбоев, что и выше, и реализовал обработчик исключения метаданныххд в этом.Я должен был сделать это на стороне клиента, поскольку, если бы я создал этот метод на стороне службы, он не был бы сериализован и был бы доступен через прокси.

public partial class BusinessRuleViolationFault : BaseFault
{

    public override void HandleException()
    {
        MessageBox.Show("BusinessRuleViolationFault handled");
    }
}



public partial class SomeOtherViolationFault : BaseFault
{

    public override void    HandleException()
    {
        MessageBox.Show("SomeOtherViolationFault handled");
    }
}


public abstract partial class BaseFault
{
    public abstract void HandleException();
}

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

Затем в своем клиентском блоке перехвата я использовал это имя для создания экземпляра локально созданного частичного класса, у которого есть метод исключения дескриптора.

Что мне любопытно узнать, не сломал ли якакой-то принцип ООП здесь?Это ООП вообще?

Я не хочу использовать несколько операторов if в этом одном блоке catch или иметь несколько блоков catch.Каково ваше мнение о компромиссе использования одного блока catch для повышения производительности и потери его при отражении, пытаясь выяснить, какой метод класса вызывать?

Спасибо за ваше время и терпение ...

1 Ответ

0 голосов
/ 15 июня 2011

Я не совсем понимаю, зачем здесь нужно размышление (как описано в предыдущем опубликованном вопросе).Я просто делаю это в своем коде, и он отлично работает:

try
{
    proxy.CallServiceMethod(message);
}
catch (Exception e)
{
    if (e is FaultException<BaseFault>)
    {
        BaseFault exceptionToHandle = 
            (e as FaultException<BaseFault>).Detail as BaseFault;
        exceptionToHandle.HandleException();
    }

}

Кроме ненужного размышления, я не вижу ничего плохого в том, как вы это реализовали (по крайней мере, с точки зрения ООП).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...