Может ли контракт данных WCF содержать внутри себя контракт операции WCF? Почему?

У меня есть контракт данных, скажем, User. Он сериализуем и передается по сети. Мне нужен операционный контракт SaveUser(). Я могу сохранить SaveUser (Пользователь-пользователь) в своем сервисном контракте в качестве операционного контракта. Но могу ли я сохранить его внутри моего контракта данных как собственное поведение?

Save() в идеале должен сохранять себя. Таким образом, в соответствии с принципами объектно-ориентированного программирования каждый контракт данных должен знать, как сохранить себя, а детали должны быть абстрагированы от внешнего мира.

Возможно ли это в WCF?


person Nilotpal Das    schedule 08.09.2010    source источник


Ответы (1)


Я бы сказал нет, и это правильно. Хотя я согласен с вами в отношении принципов объектно-ориентированного программирования и инкапсуляции, WCF имеет дело с принципами SO (сервисно-ориентированного). Думайте об этом с точки зрения проигрывателя компакт-дисков и компакт-дисков. Проигрыватель компакт-дисков — это Сервис. Компакт-диск — это Контракт данных. Принципы объектно-ориентированного программирования требуют, чтобы у компакт-диска был метод Play, чтобы иметь возможность воспроизводить себя. Но воспроизведение компакт-диска — это гораздо больше, чем знание его данных. Есть электроника, интерфейс к выходным разъемам и т. д. Все это предоставляется CD Player... Сервисом. Вот почему ваш сервисный контракт имеет метод воспроизведения и принимает компакт-диск в качестве контракта данных, сообщая ему, ЧТО играть (а не КАК его воспроизводить).

EDIT после вопроса в вашем комментарии: Нет, конечно (надеюсь), нет. В худшем случае у вас будет 34 сервисных контракта, в каждом из которых в среднем по 6 методов. И это только в том случае, если вы уверены, что каждый из методов в каждом классе ДОЛЖЕН выполняться как операция службы. Есть 2 аспекта, которые вам нужно учитывать. Аспект 1: Дизайн ваших услуг. Вместо 34 служебных контрактов вы должны сгруппировать 34 класса в разумную группу и создать 1 служебный контракт на группу. Например, вы можете получить службу InventoryManagement, службу SalesOrderProcessing и службу BackOfficeOperations. Каждая из этих служб содержит операции службы (и контракты данных), относящиеся к диапазону классов, сгруппированных в их области. Аспект 2: Что происходит на клиенте. Я упомянул, что вы должны учитывать, ДОЛЖНЫ ли методы каждого класса быть операциями службы WCF. Конечно, есть смысл иметь на клиенте богатые полностью инкапсулированные бизнес-классы. И там, где их операции не нужно выполнять как сервисные операции, эти операции выполняют свою логику в клиентском домене. Возникает вопрос, как передать их клиенту через службу, и здесь у вас есть две альтернативы: а) создать экземпляр экземпляра на клиенте и заполнить его свойства из DataContract, возвращенного операцией службы. б) возвращать объект непосредственно из операции службы, как это делается в такой среде, как CSLA (и я думаю, что DevForce использует аналогичный подход для возврата бизнес-классов через службу WCF). ХТН

person Shawn de Wet    schedule 08.09.2010
comment
Итак, если у меня есть 34 класса с 6 общедоступными методами в среднем в каждом классе, будет ли у меня 204 метода-оболочки в службе? это нормально? - person Nilotpal Das; 08.09.2010