В WCF лучше иметь несколько контрактов операций или иметь только одну операцию с полиморфным договором данных?

StackOverflow https://stackoverflow.com/questions/3006364

Вопрос

Мне было интересно, было ли лучше в 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, что вы можете возвращать что-то еще, чем операционный контракт на самом деле говорит, что он будет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top