DataSets против DataClasses как тип возврата из служб WCF - PullRequest
1 голос
/ 26 января 2012

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

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

Может кто-нибудь объяснить разницу и преимущества.

Спасибо за помощь.

Ответы [ 4 ]

3 голосов
/ 26 января 2012

DataSet - это устаревшее, устаревшее решение типа «как и / или», которое долгое время прекрасно работало в разработках перетаскивания .

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

В таких сервисах, как WCF, лучшим подходом является DTO ( объекты передачи данных , также известные как объекты значений ), которыеоблегченные версии бизнес-объектов, абсолютно не связанные с любым уровнем (это не зависит от бизнеса, пользовательского интерфейса, данных ...), которые можно легко сериализовать в XML или JSON и десериализовать на любой платформе, а не только в сильнотипизированные среды, но также интерпретируемые, динамически типизированные, такие как JavaScript, PHP, Python или Ruby (или многие другие).

Думайте о DTO как о классе, который имеетct количество свойств, которые некоторым потребителям нужно для работы с уровнем обслуживания.

Практический пример: У вас есть класс Person , имеющий имя, второе имя и возраст.В вашем пользовательском интерфейсе вам нужно запросить у какой-либо службы список Person , и там вам нужно только показать SecondName .В этом случае вы создадите класс с одним свойством SecondName , и вы не будете давать пользователю полный интерфейс Person через уровень обслуживания, поскольку он дешевлеи, очевидно, оптимально.

Если этот сервисный уровень возвращает PersonDto объектов, JSON-сериализованный список из 3 человек будет [{ "SecondName": "Blah" }, { "SecondName": "Bleh" }, { "SecondName": "Blih" }].Я не думаю, что DataSet будет такой легкой сериализацией.

Проверьте эти статьи о DTO :

2 голосов
/ 26 января 2012

Я писал об этом здесь

2 голосов
/ 26 января 2012

Попробуйте - служба WCF должна быть независимой от платформы, а DataSet - нет. Вы не переносите определенные документы с помощью DataSets, но получаете внутреннее представление конкретного объекта .NET.

Попробуйте это - DataSet обладает множеством дрянных функций, которые требуют представления в форме XML (информация об изменениях и т. Д.), Но это совершенно не имеет значения в правильно разработанном API (которым является веб-сервис).

Попробуйте это - ни один проект, который я знал за последние 10 лет, от любого человека, которого я не считаю младшим, нигде не имел DataSet, WCF или нет. Многие люди, обладающие знаниями, обратились к мастерам OR много-много лет назад.

1 голос
/ 26 января 2012

С нетипизированными наборами данных вы не сможете сформировать данные, передаваемые клиентам, включая уровень представления.Для внутреннего API это не проблема, но если вы планируете расширить использование API, вы должны рассмотреть преимущества, если использовать статически типизированные модели, а не широкий контейнер данных.Это учитывает как входы, так и выходы.С типизированной моделью вы можете лучше определить предполагаемую форму ваших данных, их поведение, а с помощью общих контрактов вы можете воспользоваться общей моделью проверки.

...