Скучное вступление:
Я знаю - DDD не о технологиях. На мой взгляд, DDD - это создание повсеместно распространенного языка с владельцем продукта и его отражение в коде настолько простым и структурированным образом, что его просто нельзя неправильно истолковать или потерять.
Но тут вступает в игру парадокс - чтобы избавиться от технической стороны приложения в доменной модели, он становится своего рода техническим - по крайней мере, с точки зрения дизайна.
В прошлый раз, когда я пытался следовать DDD - все закончилось с целой логикой вне доменных объектов в «магические» сервисы вокруг и анемичную модель домена.
Я выучил несколько новых трюков ниндзя и подумал, смогу ли я справиться с Голиафом на этот раз.
Проблема:
class store : aggregateRoot {
products;
addProduct(product){
if (new FreshSpecification.IsSatisfiedBy(product))
products.add(product);
}
}
class product : entity {
productType;
date producedOn;
}
class productTypeValidityTerm : aggregateRoot {
productType;
days;
}
FreshSpecification
предполагается указать, если продукт не пахнет. Чтобы сделать это - он должен проверить тип продукта, определить по дням, как долго продукт является свежим, и сравнить его с producedOn
. Добрый простой.
Но тут возникает проблема - productTypeValidityTerm
и productType
должны управляться клиентом. Он должен иметь возможность свободно добавлять / изменять их. Поскольку я не могу перейти от продукта к productTypeValidityTerm
напрямую, мне нужно как-то запросить их по productType
.
Ранее - я хотел бы создать что-то вроде ProductService
, которое получит необходимые репозитории через конструктор, запросит термины, выполнит некоторое дополнительное вуду и вернет логическое значение (убирает релевантную логику дальше от самого объекта и рассеивает его, кто знает, где).
Я думал, что было бы приемлемо сделать что-то вроде этого:
addProduct(product, productTypeValidityTermRepository){...}
Но опять же - я не мог свободно составить спецификацию из нескольких спецификаций, что является одним из их основных преимуществ.
Итак - вопрос в том, где это сделать? Как магазин может быть в курсе условий?