Стоит ли избегать наследования сообщений в WCF?

Вообще, я стараюсь избегать использования наследования в контрактах WCF, предпочитая композицию.

Но в следующей ситуации...

  • У меня есть сервисная операция, которая может привести к одной из двух вещей: ResultA и ResultB.
  • В ответном сообщении есть логическое значение /enum для сообщения об этом результате.
  • В ответном сообщении есть ряд других свойств. Некоторые из них актуальны только в случае ResultA, а некоторые имеют значение только в случае ResultB.

Я вижу свои варианты как:

  1. Имейте один контракт с ответным сообщением, который содержит все, и когда свойства не релевантны, они остаются равными нулю. Затем клиент должен посмотреть на bool /enum, чтобы увидеть его ResultA или ResultB и игнорировать свойства соответственно.
  2. Имейте 2 контракта с ответными сообщениями, оба наследуют от общей базы. Один представляет ResultA и его соответствующие свойства, а другой представляет ResultB и его соответствующие свойства.

Я предпочитаю вариант 2 по ряду причин, но он нарушает композицию по правилу наследования.

Что думают люди?

3 ответа

Мое интуитивное чувство здесь - "перепроектируй свой интерфейс". Наличие методов с сомнительными типами возвращаемых данных обычно не является признаком хорошего дизайна. Это приводит к большому количеству ненужной и подверженной ошибкам логики в каждом вызывающем методе.

Поэтому я бы предложил "секретный вариант № 3": переделать интерфейс в два отдельных метода.

Предпочитаю композицию наследованию!= Никогда не используйте наследование:-)

Все правила должны быть нарушены. Если вы повторно используете объекты и системы позволяют вам использовать наследование... почему бы не использовать его? Как сказал Фил Хаак... подумай сам.

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

Предпочитаю композицию наследованию (Стив Роу). Вот другой угол. Но если вы читаете это, он говорит о повторном использовании функции, а не данных.

Другие вопросы по тегам