В моем приложении DDD-by-the-book у меня есть такое определение репозитория на моем уровне домена:
public interface CustomerRepository {
Customer findById(long id);
...
}
Уровень интеграции базы данных содержит реализацию этого интерфейса, например:
public class CustomerDao implements CustomerRepository {
public Customer findById(long id) {
// access EntityManager or JDBCTemplates or ...
}
}
Для каждого уровня существует модуль, а модуль базы данных зависит от домена и всех интеграционных библиотек (например, спящего режима), а модуль домена зависит от чего угодно. Таким образом, у нас есть четкое разделение проблем и никаких «технических» зависимостей домена, как предлагает DDD. Как следствие, я могу переключиться с базы данных на постоянство в памяти, создав соответствующую реализацию репозитория. Используемая реализация настроена на уровне моего приложения.
Реализация репозиториев для доступа к базе данных ужасна и больше не нужна, поскольку у нас есть Spring Data. Чтобы использовать данные Spring, мне нужно определить такой репозиторий.
public interface CustomerRepository implements Repository<Customer, Long> {
....
Это означает, что поскольку определение интерфейса репозитория находится в моем доменном слое, у меня теперь есть зависимость моего доменного слоя от «технической» библиотеки. При переключении на реализацию в памяти у меня также будут классы spring-data в моем приложении. Я думаю, это немного попахивает.
Как ты об этом думаешь? Как ты с этим справишься? Можно ли использовать данные Spring и НЕ иметь зависимости от моего уровня домена?
Спасибо
(Кстати: мой бизнес-объект аннотирован JPA, поэтому мой модуль домена зависит от javax.persistence. Но я могу жить с этим, в основном потому, что javax.persistence содержит только аннотации и не содержит реализаций. Так что это скорее «логический», чем "техническая" зависимость. Я полагаю, что зависимость от модуля spring-data-annotation будет меньше пахнуть.)
Repository<Customer, Long>
- это интерфейс из Spring Data, и автор не хочет, чтобы его интерфейс домена напрямую зависел от него. - person Ken Chan   schedule 10.12.2015