Предположим, у нас есть метод сервиса, который выполняет некоторые проверки безопасности, извлекает данные из БД и стороннего веб-сервиса, создает MyDataDTO
, записывает контрольную запись обратно в БД.
И мы хотим хорошо структурированные, детальные коды ошибок, не так ли? Мы хорошие ребята и следуем стандартным правилам обработки ошибок WCF:
[FaultContract(typeof(AccessDenied))]
[FaultContract(typeof(KeyNotFound))]
[FaultContract(typeof(WsFault))]
[FaultContract(typeof(DbFault))]
MyDataDTO GetData(string key);
Теперь мы добавляем новый метод, который обновляет данные. Метод вызывает GetData()
внутренне (или большую его часть), выполняет проверку, добавляет обновления данных. Таким образом, он должен иметь все ошибки GetData()
, дублированные, и добавлять свои собственные ошибки:
[FaultContract(typeof(InvalidState))]
[FaultContract(typeof(DataNotValid))]
[FaultContract(typeof(AccessDenied))]
[FaultContract(typeof(KeyNotFound))]
[FaultContract(typeof(WsFault))]
[FaultContract(typeof(DbFault))]
void UpdateData(MyDataDTO data);
Пока все хорошо. Это позволяет нам даже создавать XML-документы, которые мы можем предоставить потребителям нашего сервиса, чтобы они знали, какие коды ошибок они могут ожидать.
Теперь представьте, что у нас есть 10 сервисов с 10 методами, как указано выше (или даже более сложными) каждый. И определение всех этих договоров о сбоях становится кошмаром, поскольку это довольно подверженный ошибкам процесс:
- Нет способа определить общие неисправности (например, DbFault) для всего сервиса
- Вы не можете гарантировать, что ошибка, определенная в операционном контракте, действительно будет возвращена (проблемы копирования и вставки)
- Вы не можете гарантировать, что не пропустили какую-то ошибку, чтобы добавить к договору операции
Не будем здесь учитывать версии интерфейса:)
Итак, вы получили представление о том, поддерживаете ли вы сервисы WCF на производстве. Должны ли мы вообще отказаться от контрактов на ошибки и использовать старый добрый C-стиль (например, иметь базовый класс DTOBase
со свойством ErrorCode)? Уменьшить ошибку детализации? Как убедиться, что документация верна / актуальна? Я заинтересован в некоторых лучших практиках.