DAL: понимание принципов DataContext - PullRequest
1 голос
/ 04 ноября 2011

Не уверен, что есть «официальное» имя, но под DataContext я подразумеваю объект, который прозрачно поддерживает состояние объектов, обеспечивая отслеживание изменений, функциональность отчета о работе, параллелизм и, возможно, многие другие полезные функции. (В Entity Framework это ObjectContext, в NHibernate - ISession).

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

Итак, у меня есть несколько вопросов на эту тему

  1. Может ли кто-нибудь сформулировать требования к DataContext? - как вы понимаете его задачи и обязанности? (Наиболее релевантным, что мне удалось найти, является книга Эспозито, но, к сожалению, она примерно на уровне сэмплов msdn).

  2. Что бы вы предложили для реализации отслеживания изменений? (Проще всего можно отслеживать изменения «сущностей» вручную, но требует кодирования и смешивания dal с бизнес-логикой, поэтому я в основном заинтересован в «автоматическом» способе сохранения сущностей в большей степени).

  3. Есть ли способ использовать какое-то существующее решение? (Я надеялся, что инфраструктура nhibernate позволит подключенному пользовательскому модулю работать с монго за кулисами, но не уверен, что он вообще позволяет работать с не-sql dbs).

Ответы [ 2 ]

0 голосов
/ 04 ноября 2011

DataContext (ObjectContext или DbContext в EF) - это не что иное, как реализация Единицы работы (UoW) / Репозиторий шаблон.

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

  1. DataContext в основном должен выполнять работу UoW. Он должен обрабатывать чтение и управление объектами, которые вовлечены в данный жизненный цикл (то есть HTTP-запрос), s.t. в памяти нет двух объектов, представляющих одну и ту же запись в БД. Более того, он должен обеспечить некоторое отслеживание изменений для частичного обновления БД (как вы уже упоминали).

  2. Что касается отслеживания изменений, я полностью согласен с тем, что загрязнять свойства событиями изменений и т. Д. Плохо. Один из последних шаблонов, представленных в EF4.1, использует прокси для обработки этого и предоставления возможности иметь простые POCO.

0 голосов
/ 04 ноября 2011

Ответ на вопрос 2: Для того, чтобы классы POCO работали, вам нужно будет сгенерировать код во время выполнения, возможно, с использованием System.Reflection.

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

EntityFramework такжегенерирует код для инициализации коллекций, поэтому, когда кто-то пытается выполнить такие операции, как Add и Remove, сам объект коллекции знает, что делать.

...