Репозиторий или ServiceAgent в DDD
У меня есть система, которая общается с базой данных, используя репозитории. Каково правильное определение, когда это удаленный сервис? Или лучше,
Репозиторий предназначен для баз данных, а [...] для внешних веб-сервисов.
Я нашел во многих местах об агентах ServiceAgent, но я не знаю, правильное ли это определение.
3 ответа
В DDD репозитории представляют собой виртуальную коллекцию сущностей (в частности, совокупные корни). Таким образом, если у вас есть 10M постоянных клиентов, вы будете работать с репозиторием, как если бы это был набор всех 10M в памяти. Репозитории обычно работают только с теми же типами операций, которые вы найдете в коллекции: добавить что-то, удалить что-то, найти что-то в коллекции.
Если фактическое сохранение данных происходит через веб-службу, реализация хранилища может взаимодействовать с прокси-сервером веб-службы, а не с базой данных. Однако тот факт, что постоянство включает в себя веб-службу, не влияет на то, как это должно выражаться вашим доменом. То есть, сохраняются ли данные посредством прямых вызовов базы данных, ORM, веб-службы или почтового голубя, - это деталь реализации.
Теперь, если ваша доменная модель имеет зависимости, которые должны поддерживаться внешними службами (например, проверка кредитной карты, проверка адреса и т. Д.), Это должно быть выражено как доменная служба в форме интерфейса, который определяет необходимые операции в терминах доменная модель. Чтобы быть ясным, доменные службы - это операции, которые логически являются частью вашего домена, но по той или иной причине не подходят точно по данному объекту или объекту значения. Поведение, поддерживаемое внешней службой, является лишь одним примером того, когда вы можете использовать доменную службу, поэтому не думайте о доменных службах как о "шаблоне хранилища для веб-служб" или о чем-то подобном.
Не уверен, что это официальный термин, но я бы назвал его "Сервисный прокси".
Я просто умоляю обдумать большинство принципов DDD, но я понимаю, что репозитории обычно используются для абстрагирования баз данных, но их можно использовать для упаковки всего, что ведет себя как постоянное и / или запрашиваемое хранилище. Короче говоря, я предполагаю, что, если я предполагаю, что если ваш сервис ведет себя достаточно как база данных, то я не вижу никаких проблем с использованием репозитория для абстрагирования доступа к сущностям, с которыми он имеет дело.
В противном случае, если веб-служба не имеет непосредственного отношения к данным или поведению в вашем домене, то, возможно, ваш случай может быть кандидатом на получение услуги уровня инфраструктуры на уровне вашего приложения.
Если у кого-то есть какие-либо возражения, то, пожалуйста, прокомментируйте, поскольку я хотел бы знать, если я сам неправильно понимаю предполагаемое использование репозиториев.