Хорошо, поэтому я задал еще один вопрос на ту же тему здесь , и хотя я не получил прямого ответа, я собрал некоторый код, который я получил, чтобы выполнить то, что я хотел.Вопрос в том, нарушает ли этот способ какой-либо принцип ООП?
Что я хотел
- Использовать надлежащий ООП для объявления типов ошибок в сервисе
- Иметь один блок перехвата на стороне клиента, который может обрабатывать несколько типов исключений, генерируемых службой.
- Иметь по одному методу HandleException на класс отказа, который имеет свою собственную реализацию.
- На стороне клиента есть толькоодин блок исключения понимает, какое исключение было сгенерировано, и вызывает соответствующий метод 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 для повышения производительности и потери его при отражении, пытаясь выяснить, какой метод класса вызывать?
Спасибо за ваше время и терпение ...