Использование коллекций / списков в WCF DataContracts - PullRequest
1 голос
/ 29 марта 2011

Я не очень много знаю о WCF ...

Я хочу сделать чистую работу для обслуживания объектов на стороне клиента с использованием DataContracts. Представьте себе два DataContracts «Система» и «Здание»: «Система» может иметь много «Зданий», а «Здание» может иметь много «Систем». Итак, между ними есть отношения многие ко многим.

В модели контракта на обслуживание «Система» имеет свойство «Здания», которое является коллекцией. «Здания» также имеют коллекцию «Системы».

DataContracts

WCF использует DataSets для базового доступа к данным (с хранимыми процедурами для CRUD), и у меня есть таблица между SYSTEM и BUILDING, представляющая взаимосвязь.

Database tables

Итак, как мне правильно реализовать этот сценарий? Я хочу, чтобы клиенты могли получить простое представление «Здания» в «Системе», например, я мог бы использовать:

system = GetSystem(id);
foreach (Building building in system.Buildings) {
    // do whatever with each buildings...
}

Спасибо!

1 Ответ

1 голос
/ 30 марта 2011

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

  1. Забудьте о WCF и создайте Уровень доступа к данным (DAL) . Это должна быть библиотека, которая содержит код для запроса базы данных и возврата строго типизированных объектов. Эта библиотека может содержать метод с именем GetBuildings (), который возвращает список объектов Building. Библиотека может работать с DataSets (и другими типами, специфичными для базы данных), но не должна предоставлять DataSets внешним абонентам.
  2. Теперь, когда у вас есть библиотека, которую можно использовать для получения данных из базы данных, напишите службу WCF . Код в компоненте службы должен вызывать DAL и превращать эту информацию в объекты DataContract для отправки через границу веб-службы. Не пытайтесь представлять все ваши данные в объектах DataContract - вы хотите, чтобы ваши пакеты данных были относительно небольшими, поэтому не включайте информацию, которая не требуется. Сбалансируйте это с попыткой сделать как можно меньше вызовов веб-службы. При разработке классов DataContract учитывайте, что клиентское приложение будет делать с данными.
  3. Запись компонента Service Client . Это код, который выполняет вызовы к службе WCF и превращает эту информацию в объекты Entity.
  4. Последний (и наиболее полезный) шаг - написать логику клиентского приложения. Теперь у вас есть еще одна проблема, с которой вы столкнетесь при структурировании клиентского кода (я рекомендую использовать MVVM). Клиентское приложение должно вызывать компонент Service Client и использовать данные для удовлетворения требований вашего приложения.

Выполнив вышеуказанные 4 шага, вы должны получить:

  • Уровень доступа к данным, взаимодействующий с базой данных.
  • Сервисный уровень, который ничего не знает о базе данных, но способен извлекать данные из уровня доступа к данным.
  • Уровень Service Client, который ничего не знает о базах данных, но знает, как извлечь данные из уровня службы.
  • Код приложения, который ничего не знает о базах данных или веб-службах, но вызывает на уровне Service Client для получения данных и представляет данные в пользовательский интерфейс.

Каждый будет делать это по-своему, но главное - разделить проблемы с помощью многоуровневой архитектуры.

...