Domain Services
необходимы, когда у вас есть модель предметной области, потому что есть функциональность, которая не является частью вашей сущности.
Подумайте, например, о Repository
или Factory
.Интерфейс для Repository
, вероятно, будет в вашем Domain Layer
, а реализация в вашем Infrastructure Layer
.При Factory
и реализация, и интерфейс будут в вашем Domain Layer
.
Эти доменные службы используются на вашем прикладном уровне.Цель прикладного уровня - убедиться, что все на месте, чтобы модель домена могла выполнять свою работу.Это может означать загрузку определенных сущностей из репозиториев, а затем вызывать для них доменные функции.
Проверка должна проходить внутри сущности.Например, предположим, у вас есть класс Money
.
public class Money
{
public Money(string currency, int amount)
{
Currency = currency;
Amount = amount;
}
public int Amount { get; set; }
public string Currency { get; set; }
}
Если классу Money
не разрешено иметь отрицательную сумму, где бы вы это проверили?
Лучшее место для этого - в классе.Сущность несет ответственность за свое государство.В классе Money
это легко увидеть, но, например, с классом Order
с OrderLines
Order
отвечает за проверку наличия дублирующих элементов OrderLine
, которые должны быть объединены (это экономит расходы на доставку!)