Шаблон репозитория с lazying, загружающимся использующий ПОСТЕПЕННО

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

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

Я думал о при использовании "получения" на дочернем свойстве, чтобы проверить, если его "пустой указатель" и если это - вызов мой репозиторий для получения дочерней информации. Это имеет две проблемы от того, что я вижу: 1) Объект, "знает", как вовлечь себя, я быть не бы никакая логика доступа к данным быть сохраненным в объекте. 2) Это потребовало, чтобы оба класса сослались друг на друга, который в Visual Studio бросает круговую ошибку зависимости.

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

Спасибо

8
задан lancscoder 8 April 2010 в 10:08
поделиться

4 ответа

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

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

2
ответ дан 5 December 2019 в 22:17
поделиться

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

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

0
ответ дан 5 December 2019 в 22:17
поделиться

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

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

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

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

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

3
ответ дан 5 December 2019 в 22:17
поделиться

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

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

HTH.

1
ответ дан 5 December 2019 в 22:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: