Корректное внедрение проекта, управляемого доменом


1

У меня есть важный вопрос для внедрения в Domain Driven Design. В представлении архитектуры слоев в книге Эванса Домен ссылается на уровень Infrastructure, являющийся самым низким слоем, однако я вижу во всех реализациях в Интернете, напротив, слой инфраструктуры, ссылающийся на уровень домена, возможно, из-за реализации шаблон репозитория с использованием ORM. Что вы, ребята, думаете об этом? У кого-то был бы пример, который бы имплантировал точно так же, как книга Эванса.

0

Вы уверены, что искали правильно? Хранилища не являются точно инфраструктурой, они расположены между вашим доменом и уровнем доступа к данным.

Как указано в книге Фаулера, хранилище

посредничает между слоями отображения доменов и данных с использованием коллекции-подобный интерфейс для доступа к объектам домена.

Если вы используете базу данных или, как вы отметили, ORM, ваша реализация репозиториев будет ссылаться на ORM. Довольно часто репозиторий реализуется как общий класс, единственный способ, которым он «ссылается» на домен как таковой, так как он использует базовый «сущностный» класс для общего ограничения.

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


2

примеры, которые вы видите, где интерфейсы живут в домене (например, UserRepository) и их реализация живет в инфраструктуре (например HibernateUserRepository) применяют Принцип инверсии зависимостей (DIP) для традиционной многоуровневой архитектуры.

В традиционной многоуровневой архитектуре модули высокого уровня должны зависеть от модулей низкого уровня. Если мы посмотрим на порядок стандартных уровней, у нас будет Domain -> Infrastructure.

Мы действительно хотим, чтобы наш домен зависел от деталей инфраструктуры? Применяя принцип DIP, мы инвертируем зависимость и заставляем инфраструктуру зависеть от уровня домена, однако она не зависит от конкреций, а от абстракций.

Вот что погружной принцип гласит:

A. Модули высокого уровня не должны зависеть от модулей низкого уровня. Оба должны зависеть от абстракций.

B. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.

Источник: http://en.wikipedia.org/wiki/Dependency_inversion_principle