Полиморфизм в иерархии с сериализованными классами - сообщения DataContract - PullRequest
0 голосов
/ 06 июля 2018

Диаграмма ниже показывает, как

  • производитель создает новые сообщения / запросы, заполняющие данные членов,
  • сообщения сериализуются,
  • отправлено потребителю,
  • dserialized
  • Потребитель вызывает виртуальную функцию - использует полиморфное поведение ссылки на базовый класс.

В этой статье обсуждается аналогичный вопрос.
Но мне нужно отделить DTO (в DataContract.DLL) и некоторую реализацию (App.EXE), связанную с этим DTO, в рамках одной иерархии классов (я стараюсь избегать введения другого семейства классов, таких как RequestProcessors).
Реализация должна быть переопределена в другой сборке, чем в dll, с определением DTO / сообщения - этот dll должен быть легковесным - используется разными командами. Поэтому я не могу ссылаться на производный класс в атрибуте [KnownType(typeof(SomeData))], как в упомянутой статье. Я не хочу включать реализацию метода в DataContract.DLL.

Как реализовать полиморфизм в иерархии с сериализованными классами (сообщениями DataContract), где DataContracts и реализация разделены в разных сборках? Возможно ли это?

Я не нашел пути, но C # не является моим основным языком. Я вижу, что производитель не должен зависеть от Consumer.EXE, но должен создавать наиболее производный класс. Итак, все классы должны быть введены в DataContracts.DLL. Частичное определение класса, скорее всего, не является перекрестной сборкой.

Может быть, будет работать сборка из нескольких файлов? Может быть, метод расширения в ближайшем приближении.

Обновлено ( цитата из статьи ):

DTO, которые оформлены как классы DataContract, являются реальными объектами. В них могут быть методы, но методы не являются частью процесса сериализации

enter image description here

1 Ответ

0 голосов
/ 06 июля 2018

Как реализовать полиморфизм в иерархии с сериализованными классами (сообщения DataContract)

«Полиморфный контракт данных» - оксюморон.

Контракты данных - это реализация DTO ( Передача данных Объекты) для WCF.
WCF четко отделяет данные (контракты данных, DTO) от поведения (услуг).

Не смешивайте их.

Другими словами:

  • не пытайтесь реализовать полиморфизм в иерархии DTO;
  • не добавлять любое поведение к DTO.

Я стараюсь не вводить другое семейство классов, таких как RequestProcessors

Но ты не должен!

Это естественный подход для сервис-ориентированных решений, и речь идет не только о WCF (SOAP). Например, REST (ASP .NET Web API в случае .NET) делает то же самое.

Более того, сервис-ориентированный подход хорошо подходит для реализации бизнес-логики внутри приложений, поскольку он идеально подходит для контейнеров Dependency Injection.

Реализуйте некоторую иерархию IRequestProcessor - это правильный путь.

Обратите внимание , что связанный вопрос относится к наследованию, но не к поведению наследованию. ИМО, термин «полиморфизм» там неправильно используется. Вы можете (и часто должны) выводить один контракт данных из другого, но вы можете (должны) получать данные , а не поведение .

...