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

Мне было интересно, было бы лучше в WCF использовать несколько контрактов на операции или иметь только один контракт на операции с полиморфным контрактом на данные.

Позвольте мне привести небольшой пример:

[OperationContract]
action1Answer action1(action1data a);

[OperationContract]
action2Answer action2(action2data a);

или

[OperationContract]
actionAnswer action(actionContract a);

Контракт действия был бы абстрактным классом, от которого наследуются как action1Contract, так и action2Contract.Контракт действия определил бы функцию-член do() в его интерфейсе, который, в свою очередь, должен был бы быть перегружен в дочерних классах

Personnaly. Я считаю, что второй подход более интересен, поскольку он позволяет вам красиво инкапсулироватьДанные и действия в производном actionContract и, в свою очередь, облегчают добавление новых действий.Но это первый раз, когда я использую WCF, так что, вероятно, вы знаете лучше!

Ответы [ 2 ]

3 голосов
/ 09 июня 2010

Этот вопрос граничит с гранями ООП-полиморфизма и SOA, но я приведу свои два цента:

Когда вы рассматриваете возможность разработки уровня обслуживания, конечному потребителю службы должно быть ясно, что передавать и чего ожидать; подход 2 не справляется с этим хорошо. (Кроме того, при выполнении SOAP с WCF и последующей загрузке из wsdl в других проектах .NET он не помечает должным образом абстрактные классы и интерфейсы не передаются. WSDL не имеют возможности описать неинстанцируемый базовый класс, кажется .)

Хотя, должен признать, я думаю, что второй процесс великолепен с использованием KnownTypeAttributes (как я вижу, только что опубликовал marc_s) - я использовал его сам, когда учитывал неизвестные будущие требования.

2 голосов
/ 09 июня 2010

Я согласен, что подход № 2 выглядит лучше - с точки зрения ООП.

Но: SOA / WCF и полиморфизм обычно не слишком хорошо соответствуют - для SOA (по крайней мере, при выполнении вызовов на основе SOAP) нужны конкретные классы, которые могут быть выражены в WSDL / XSD, который определяет ваш сервис.

Вы можете использовать производные типы данных на основе общего базового типа - если вы это сделаете, вам придется изучить атрибут KnownType (или ServiceKnownType ) чтобы сообщить WCF о том, что вы, возможно, возвращаете что-то еще, кроме того, что в договоре об операции указано, что это произойдет.

...