Доступ на уровне домена к материалам Persistence

Я пытаюсь сохранить уровень своей домена как можно более «чистым», не допуская постоянства или других проблем с инфраструктурой. Однако бывают случаи, когда моему домену необходимо использовать службы СУБД или другой внешней зависимости, и я не знаю, как с этим бороться.

Например, каждый объект домена в моем приложении реализует интерфейс IValidatable, который вызывается клиентами для получения списка нарушенных правил, препятствующих сохранению объекта. В некоторых случаях вышеупомянутая процедура проверки включает вызов класса DAO для проверки существования конкретной записи. Мы не используем ORM; вместо этого мы используем уровень сохраняемости, построенный с использованием шаблона объекта доступа к данным. Должен ли я просто создать класс службы / оболочки для этого доступа к базе данных и заставить мой объект домена сотрудничать с ним? Допустимо ли добавление такого уровня косвенного обращения или я все еще загрязняю свой объект домена?


person Mitch A    schedule 27.05.2009    source источник
comment
Как конкретная запись связана с объектом домена?   -  person Doug Knesek    schedule 18.11.2009


Ответы (2)


Обычный ответ - использовать какой-нибудь объектно-реляционный интерфейс. Уровень вашего домена представляет интерфейс вашей модели предметной области. У вас есть реляционная база данных под крышками, и вам нужен слой между ними для выполнения объектно-реляционной отображение. Вы говорите «мы не используем ORM», но на самом деле это так: вы просто делаете это сопоставление непосредственно на уровне домена.

Проблема создания такого сопоставления известна как проблема объектно-реляционного несоответствия импеданса. Если вы настаиваете на том, чтобы не указывать явный уровень ORM, то да, вам следует написать классы, инкапсулирующие детали использования СУБД (конечно, когда вы это сделаете, вы представите там классы ORM).

На самом деле, очень трудно избежать наличия некоторого уровня ORM.

person Charlie Martin    schedule 27.05.2009

Я давно придерживался мнения, что вы не можете скрыть знания о постоянстве в постоянном доменном объекте. Попытки сделать это становятся все более неестественными и вызывают странные побочные эффекты. Другими словами, я думаю, что встраивать знания о персистентности на уровне предметной области - это нормально, но не обязательно точные средства сохранения; следует использовать интерфейс DAO.

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

person nilskp    schedule 02.07.2010