Как смоделировать этот сценарий с DDD? - PullRequest
0 голосов
/ 25 июня 2018

У меня есть некоторые проблемы при моделировании этого сценария с помощью 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) Возможно, мои классы не смоделированы должным образом , но после размышлениймного это не встречается мне лучший способ сделать это.

1 Ответ

0 голосов
/ 25 июня 2018

Проблема возникает, когда мне нужно пересчитать стоимость машины без класса масла (у меня есть только его идентификатор).Какой лучший способ смоделировать это?

Поскольку машина и масло изолированы друг от друга (отдельные агрегаты), машинные вычисления не могут использовать «текущую» цену на нефть -без взаимной блокировки текущая цена на нефть может изменяться одновременно с изменениями в машине.

Поэтому машина работает с кэшированной копией цены на нефть.

Итак, один ответбудет включать в агрегат машины кэшированную копию последней известной цены на нефть и использовать ее для оценки стоимости.

Другая возможность состоит в передаче услуги домена на машину,где служба домена - это функция, которая принимает идентификатор машинного масла и возвращает кэшированную копию стоимости.Это немного похоже на ваш вариант № 5, за исключением того, что вместо внедрения службы в конструктор вы передаете ее в качестве аргумента там, где вам это нужно.

В любом случае вы можетехотите выяснить, нужна ли вашему домену точная модель времени (цена на нефть по состоянию на понедельник).Во многих доменах существует концепция котировки, сделанной в определенное время и, возможно, ограниченной продолжительности, в течение которой цена будет фиксированной (поставщик котировки в основном принимает на себя риск того, что любое реальное изменение цены может не произойтибыть прибыльным).

...