В WCF лучше иметь несколько контрактов операций или иметь только одну операцию с полиморфным договором данных?
-
25-09-2019 - |
Вопрос
Мне было интересно, было ли лучше в WCF использовать несколько операций договоров или иметь только один договор операции с полиморфным договором к данным.
Позвольте мне дать вам небольшой пример:
[OperationContract]
action1Answer action1(action1data a);
[OperationContract]
action2Answer action2(action2data a);
или
[OperationContract]
actionAnswer action(actionContract a);
Договор на действия был бы абстрактным классом, которым Action1Contract и Action2Contract наследуют от. Договор акции укажет do()
Функция участника в его интерфейсе, которая бы в свою очередь, будет перегружена в детских классах
Personaly I нахожу второй подход, чтобы быть более расцеплением, поскольку он позволяет вам красиво инкапсулировать данные, а действие в полученном действии APCECONTACT и, в свою очередь, облегчает добавление новых действий. Но это первый раз, когда я использую WCF, наверное, вы знаете лучше!
Решение
Этот вопрос границ по краям Святых Войнов ОО Полиморфизма и SOA, но я предоставлю моих двух центов:
Когда вы рассматриваете возможность разработки сервисного слоя, должно быть понятно для конечного потребителя службы, в чем пройти и чего ожидать; Подход 2 не справится с этим хорошо. (Кроме того, при выполнении мыла с WCF, а затем загрузка из WSDL в других проектах .NET, он не правильно маркирует абстрактные классы, ни интерфейсы не передаются. WSDL не имеет способа описания немалочного базового класса, кажется, .)
Хотя я должен признать, я думаю, что второй процесс отлично используется, используя известные теПаэаттрибуты (как я вижу только сейчас marc_s, опубликовал) - я сам использовал его при разрешении неизвестных будущих требований.
Другие советы
Я согласен подход # 2 выглядит лучше - с точки зрения OOP.
Но: SOA / WCF и полиморфизм обычно не совпадают слишком хорошо - SOA (по крайней мере, когда вызовы на основе SOAP) нуждаются в бетонных классах, которые можно выразить в WSDL / XSD, который определяет ваш сервис.
Ты могу Используйте полученные типы данных на основе общего базового типа - если вы сделаете, вам придется посмотреть в Известностьетеп атрибут (или Serviceknowntype.) Чтобы сигнализировать на WCF, что вы можете возвращать что-то еще, чем операционный контракт на самом деле говорит, что он будет.