У меня есть некоторые проблемы при моделировании этого сценария с помощью DDD.
У меня есть два объекта в одном и том же BC: Нефть и Машина .Существует несколько различных типов масла, его окончательная стоимость основана на некоторых свойствах (плотность, материалы, цена покупки и т. Д.), И они периодически обновляются.Так что они не в одной совокупности.Поскольку они являются различными объектами, машина содержит только ссылку на масло с ее идентификатором:
class Oil
id
purchase_price
density
material
...
class Machine
id
idOil
cost
addOil (Oil)
...
Стоимость машины тоже зависит от стоимости масла и некоторыхдругие свойства машины.Нефть является необязательной, поэтому, когда вызывается метод addOil, Machine сохраняет его идентификатор и рассчитывает стоимость машины с учетом стоимости масла.
В Machine не существует метода convertCost. Машина отвечает за обновление своей стоимости, когда некоторые ее свойства меняются .
Проблема возникает, когда мне нужно пересчитать стоимость машины без Нефть класса (у меня есть только его идентификатор),Какой лучший способ смоделировать это?Я думал, что некоторые из них, но ни один из них не убеждает меня:
1) Класс впрыскивания масла в конструкторе машин.Я думаю, что это невозможно, потому что Oil - это сущность, и DDD не разрешает это.
2) Inject Oil репозиторий в конструкторе машин.Как 1, DDD не разрешает это.
3) Ввести значение объекта Oil в конструкторе машин.Это означает, что мне нужно сохранить класс OilVO с копией сущности Oil, а не только с ее идентификатором при вызове метода addOil.
4) Построить агрегат .Мне не нравится, потому что у Oil есть собственный идентификатор, и есть некоторые другие классы, такие как Oil, которые участвуют в стоимости машины.Машина станет слишком большой.
5) Делегируйте калькулятор стоимости нефти в службу домена .Это означает, что мне приходится внедрять этот интерфейс службы в конструктор Machine каждый раз, когда я создаю объект Machine:
interface OilCostCalculatorService (OilRepository repo) {
...
public double calculateCost (IdOil id) {
Oil oil = repo.getOil(id);
double cost = .... // calculate cost from oil properties
return cost;
}
}
class Machine {
public Machine (OilCostCalculatorService service, ...) { ... }
}
6) Возможно, мои классы не смоделированы должным образом , но после размышлениймного это не встречается мне лучший способ сделать это.