Соединение возвращенных экземпляров объекта в клиенте WCF - PullRequest
4 голосов
/ 05 июля 2011

У меня есть служба WCF, которая может возвращать несколько разных коллекций.

Объекты в каждой коллекции могут иметь ссылки на объекты в других коллекциях.Например.У меня есть коллекция заказов и коллекция клиентов.Объекты Customer содержат коллекцию ссылок на заказ, и каждый заказ содержит ссылку на клиента.

Мне было интересно, как люди обычно обрабатывают подобные вещи на стороне клиента.Насколько я вижу, я могу выбрать:

1) Просто позвольте WCF сериализовать любые объекты-члены полностью, и не беспокойтесь о дублировании.Я знаю, что могу использовать [PreserveReferences], чтобы смягчить это до некоторой степени, но все еще очень много дублирования и ненужной сериализации.То есть, если я запрашиваю объект клиента из службы, он будет сериализовать всех членов каждого заказа, который есть у клиента, даже если у меня уже есть эти объекты на стороне клиента в моей коллекции заказов.Это также означает, что я должен быть осторожен, чтобы постоянно сопоставлять вещи по Id, а не просто сравнивать экземпляры.

2) Идентификаторы Serialise Id, а не экземпляры.Это кажется наиболее разумным подходом, но означает, что у меня должна быть точка, где я снова превращаю эти идентификаторы в экземпляры на стороне клиента.Это вносит целый беспорядок в то, где это сделать, и как внедрить необходимые репозитории для подключения.

3) Просто используйте идентификаторы везде в клиенте вместо подключения экземпляров.Это просто кажется мне неправильным и отходит от всей цели ООП.Вместо того, чтобы получить доступ к коллекции на объекте, я должен получить доступ к коллекции идентификаторов, а затем просмотреть их через какой-то глобальный репозиторий.

В данный момент я склоняюсь к 2, но мне не нравится беспорядок сериализацииэто будет.

Я должен отметить, что клиент, вероятно, гораздо более динамичный, чем большинство клиентов WCF, и он поддерживает открытое соединение со службой с помощью обратных вызовов и т. Д. Для поддержки своих коллекций, поскольку он отображает данные в реальном времени.

Приветствия

Ответы [ 2 ]

1 голос
/ 15 июля 2011

Я думаю, что другой вариант - не получать коллекцию данных по умолчанию. Используя ваш пример, я мог бы определить несколько методов WCF:

ListCustomers () - возвращает объекты клиентов, но не заполняет коллекцию заказов. ListOrders () - возвращает объекты заказа, каждый из которых связан с объектом клиента, но объект клиента не имеет информации о заказе.

ListOrdersForCustomer (идентификатор клиента) - возвращает заказы для определенного клиента.

Конечно, у этого есть свои недостатки, но он может подойти для вашего примера.

0 голосов
/ 11 июня 2012

Имея за плечами 12 месяцев опыта, я думал, что обновлю это своим решением.

Теперь я использую отдельные объекты DTO для сериализации через WCF.Некоторые из них используют идентификаторы, некоторые содержат полные графы объектов.Прелесть использования DTO в том, что я могу возвращать разные форматы одного и того же бизнес-объекта в зависимости от потребностей вызывающего абонента.

На стороне клиента у меня фактически есть два уровня.DTO можно использовать непосредственно из сервиса (запрашивая полные графы объектов, содержащие только то, что мне нужно), но я также поддерживаю набор хранилищ бизнес-объектов на стороне клиента.Эти репозитории обновляют себя, используя DTO, используя только идентификаторы, и подключение ссылок выполняется в тот момент, когда DTO преобразуется в бизнес-объект.Как я уже говорил в моем OP, мой клиент гораздо более динамичный, чем большинство клиентов WCF, и репозитории также прослушивают обратные вызовы сервисов с обновленными объектами.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...