Стоит ли избегать наследования сообщений в WCF?
Вообще, я стараюсь избегать использования наследования в контрактах WCF, предпочитая композицию.
Но в следующей ситуации...
- У меня есть сервисная операция, которая может привести к одной из двух вещей: ResultA и ResultB.
- В ответном сообщении есть логическое значение /enum для сообщения об этом результате.
- В ответном сообщении есть ряд других свойств. Некоторые из них актуальны только в случае ResultA, а некоторые имеют значение только в случае ResultB.
Я вижу свои варианты как:
- Имейте один контракт с ответным сообщением, который содержит все, и когда свойства не релевантны, они остаются равными нулю. Затем клиент должен посмотреть на bool /enum, чтобы увидеть его ResultA или ResultB и игнорировать свойства соответственно.
- Имейте 2 контракта с ответными сообщениями, оба наследуют от общей базы. Один представляет ResultA и его соответствующие свойства, а другой представляет ResultB и его соответствующие свойства.
Я предпочитаю вариант 2 по ряду причин, но он нарушает композицию по правилу наследования.
Что думают люди?
3 ответа
Мое интуитивное чувство здесь - "перепроектируй свой интерфейс". Наличие методов с сомнительными типами возвращаемых данных обычно не является признаком хорошего дизайна. Это приводит к большому количеству ненужной и подверженной ошибкам логики в каждом вызывающем методе.
Поэтому я бы предложил "секретный вариант № 3": переделать интерфейс в два отдельных метода.
Предпочитаю композицию наследованию!= Никогда не используйте наследование:-)
Все правила должны быть нарушены. Если вы повторно используете объекты и системы позволяют вам использовать наследование... почему бы не использовать его? Как сказал Фил Хаак... подумай сам.
Ограничение себя набором искусственных правил - отличный способ сделать вашу работу намного сложнее. Есть причина, по которой мы можем использовать наследование, и я говорю, что это одна из них.
Предпочитаю композицию наследованию (Стив Роу). Вот другой угол. Но если вы читаете это, он говорит о повторном использовании функции, а не данных.