Широко используется шаблон DAO в .NET? - PullRequest
14 голосов
/ 26 апреля 2011

Является ли DAO - объект доступа к данным - часто используемым шаблоном в .NET?Я всегда использовал DAO как способ предоставления доступа к своему уровню данных.Например, у меня может быть тонкий интерфейс над моим EntityFramework ObjectContext, который представляет все мои ObjectSets как IObjectSet.

Сложные запросы будут затем предоставляться DAO, каждый из которых зависит от этого интерфейса.У меня мог бы быть ProductDAO, который выставляет методы как GetProductsOnSale() или GetInfrequenlySoldProducts().Мои контроллеры или докладчики затем использовали бы эти методы, которые, вероятно, были бы виртуальными, чтобы позволить получать определенные результаты для модульных тестов.

Так это часто используемая идиома в .NET?По некоторым причинам подавляющее большинство примеров, которые я вижу в Интернете с использованием этого шаблона, основаны на Java.Даже этот вопрос о лучших практиках DAO помечен как Java, а не как C #.

Нет ничего плохого в использовании чего-то из другого сообщества, у меня просто небольшой страх, что все вокруг меня делают вещииначе ...

Ответы [ 3 ]

9 голосов
/ 26 апреля 2011

Это распространенная идиома в .NET.Я использовал его и видел, что он используется во многих местах.

Он встроен в каркас - см. Пространство имен System.Data - многие классы являются базовыми классами для специализированных поставщиков (SQL Server, Oracle, MySQL и т. Д.) И операции выполняются на базовых классах.

Однако то, что вы описываете, для меня больше похоже на шаблон репозитория , а не простоиспользование объектов доступа к данным .

Это также используется во многих проектах, хотя и не встроено в каркас.

1 голос
/ 27 апреля 2011

Моя самая большая рекомендация по использованию шаблона Repository для инкапсуляции доступа к данным (что действительно является очень хорошим шаблоном) - это возможность создавать общий репозиторий. Но для создания очень умного универсального репозитория, который дает вам в основном живую проводку для немедленного доступа ко всем стандартным операциям CRUD, наряду с доступом к сложной конструкции запроса, которую вы не будете показывать без вашего ISomeService фасада.

Самое важное при использовании универсального репозитория - вы хотите, чтобы он основывался на внедрении в конструктор, а не на наследовании. Таким образом, вы можете составить свой SomeService так, чтобы он зависел от многих универсальных репозиториев, необходимых для выполнения значимой границы бизнес-домена.

Я написал глубокий блог по этой концепции. Создание общего универсального и расширяемого репозитория NHiberate версии 2 . Несмотря на то, что этот пост является специфическим для NHibernate, вы можете использовать те же основные понятия и применять их практически к любым DAO.

.

Обратите внимание, что с некоторыми инструментами, такими как Entity Framework, Linq2Sql и RavenDB и многие другие, они сами предоставляют очень усовершенствованные репозитории и могут не обязательно получить выгоду от добавления дополнительной оболочки.

1 голос
/ 26 апреля 2011

Я широко использую шаблон DAO.

Вы упомянули Entity Framework; к этому я бы добавил, что нахожу DAO намного лучше, чем DataSets и DataTables, которые слишком похожи на базу данных и недостаточно похожи на объект для моих вкусов. Например, DataRow не могут быть добавлены более чем к одной таблице данных, поэтому я не могу передать подмножества загруженных данных различным объектам, не перемещая их в контейнер, который не был создан для их хранения. (То есть, кажется, что DataRow должен быть в DataTable, но они могут быть только в одном DataTable одновременно.) DataRowView неуклюжи и не так интуитивны, как добавление объектов сущностей в другой список.

...