Есть две вещи, которые вызывают некоторое беспокойство. Первая - это цитата (выделено мной):
[...] существуют ли информационные системы, в которых логика базы данных представляет собой лишь небольшую часть всей бизнес-логики , и где было бы интересно высмеивать доступ к базе данных?
Вы помещаете бизнес-логику в свою базу данных? Если так: не делайте этого, это делает очень трудным для насмешки над вашей базой данных. Вам придется дублировать (и поддерживать!) Всю бизнес-логику от базы данных до ваших ложных заданий, иначе ваши тесты бесполезны.
Но как узнать, правильно ли макеты реализуют бизнес-логику? Вы можете написать модульные тесты для своих макетов или повторно использовать модульные тесты своей базы данных (они у вас есть, верно?), Но я бы попытался избежать этого любой ценой! Позвольте мне повторить: никогда (не нужно) писать модульные тесты для ваших издевательств. Если вы оказались в такой ситуации, сделайте несколько шагов назад и проверьте свой дизайн, потому что что-то очень не так.
Размещение бизнес-логики в базе данных только создаст ненужную связь между вашей моделью и базой данных и существенно усложнит ваш уровень тестирования. Разделение проблем является ключевым здесь: модель фокусируется только на бизнес-логике, а база данных - только на постоянстве, и ничего больше.
Что подводит меня к следующей проблеме: зачем вам нужны методы save()
и delete()
, которые связаны с постоянством, в вашей доменной модели? Постоянство не относится к модели предметной области.
Я знаю, вы сказали, что эти методы делегируют в хранилище, поэтому модель предметной области (надеюсь) не содержит фактической логики персистентности. Но как он узнает , в какой репозиторий он должен делегировать?
Если вы вызываете локатор службы в методе save()
, вы делаете невозможным сохранение объекта в нескольких репозиториях. Вы также скрываете зависимость от хранилища от вызывающей стороны, что я считаю плохой вещью.
Для решения этих проблем вы можете передать экземпляр хранилища методу save()
, например:
public class Foo extends AbstractPersistentObject {
public void saveTo(IFooRepository repository) {
repository.save(this);
}
}
Но такой метод подразумевает, что у вызывающей стороны уже есть экземпляр репозитория, поэтому он может также вызвать метод save()
непосредственно в репозитории. Любые методы сохранения в доменной модели будут устаревшими.
Возможно, я упрощаю вашу проблему. Чего вы пытаетесь достичь? Вам нужен только синтаксис entity.save()
или вы пытаетесь решить большую проблему?