Шаблон репозитория с отложенной загрузкой с использованием POCO - PullRequest
8 голосов
/ 08 апреля 2010

Я нахожусь в процессе запуска нового проекта и создания бизнес-объектов, доступа к данным и т. Д. Я просто использую простые старые объекты clr, а не какие-либо формы.Я создал две библиотеки классов: 1) Бизнес-объекты - содержит все мои бизнес-объекты, все эти объекты имеют небольшой вес и имеют только свойства и бизнес-правила.2) Репозиторий - это для всех моих данных доступа.

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

Я думал о том, чтобы использовать свойство get для дочернего свойства, чтобы проверить, имеет ли оно значение null, и вызывает ли оно мой репозиторий для получения дочерней информации.Это имеет две проблемы из того, что я вижу: 1) объект «знает», как получить себя, я бы не хотел, чтобы в объекте содержалась логика доступа к данным.2) Для этого требовалось, чтобы оба класса ссылались друг на друга, что в visual studio приводит к циклической ошибке зависимости.

Есть ли у кого-нибудь какие-либо предложения о том, как преодолеть эту проблему, или какие-либо рекомендации по компоновке моих проектов и где ее можно улучшить?

Спасибо

Ответы [ 4 ]

3 голосов
/ 08 апреля 2010

Для этого требуется, чтобы вы запрограммировали интерфейсы (абстракции над реализациями) и / или объявили свои свойства виртуальными. Затем ваш репозиторий возвращает прокси-объект для тех свойств, которые должны загружаться лениво. Класс, который вызывает хранилище, не является мудрым, но когда он пытается получить доступ к одному из этих свойств, прокси вызывает базу данных и загружает значения.

Честно говоря, я думаю, что безумие пытаться реализовать это самостоятельно. Есть отличные, проверенные временем решения этой проблемы, которые были разработаны и усовершенствованы величайшими умами .NET.

Для прокси вы можете использовать Castle DynamicProxy или NHibernate и разрешить ему обрабатывать все прокси и ленивую загрузку для вас (он использует DynamicProxy). Вы получите лучшую производительность, чем из любых ручных реализаций, гарантировано.

NHibernate не будет связываться с вашими POCO - без атрибутов, без базовых классов; вам нужно только отметить участников виртуальными, чтобы разрешить генерацию прокси.

Проще говоря, я бы пересмотрел использование ORM, особенно если вы хотите эту ленивую загрузку; вам не нужно отказываться от своих POCO.

2 голосов
/ 12 апреля 2010

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

Вот ссылка на статью.

1 голос
/ 08 апреля 2010

Если вы используете Entity Framework 4.0, у вас будет поддержка POCO с отложенной загрузкой, и вы сможете написать общий репозиторий для доступа к данным.

В общем шаблоне репозитория есть тонны статей с EF 4.0

HTH.

0 голосов
/ 08 апреля 2010

Вы можете обойти проблему циклической зависимости, если ваш ленивый код загрузки загружает хранилище во время выполнения ( Activator.CreateInstance или что-то подобное), а затем вызывает соответствующий метод с помощью отражения. Конечно, существуют потери производительности, связанные с рефлексией, но зачастую они оказываются незначительными в большинстве решений.

Еще один способ решить эту проблему - просто скомпилировать в одну DLL - здесь вы все равно можете логически разделить свои слои, используя разные пространства имен, и при этом организовать свои классы, используя разные каталоги.

...