@RaSul909

Entity vs Value Object DDD?

Всем привет! Разрабатываю приложение на asp.core для работы с заявками. Пытаюсь применить DDD.
Возникает неуверенность в некоторых решениях. Попробую коротко описать сущности.

Есть два основных агрегата `User` и `Ticket`
```
```
public class User
    {
        public UserId Id { get; private set; }
        public FullName FullName { get; private set; }
        public DateTime BirthDate { get; private set; }
        public Group Group { get; private set; }
        ...
    }

    public class Ticket
    {
        public TicketId { get; private set; }
        public Group Group { get; private set; }
        ...
    }


`Group` это справочник который хранится в другой БД и изменятся другим приложением. Его я сделал как Entity, содержит Id и Name. В `User` это поле определяет к какой группе относится пользователь. В `Ticket` определят на какую группу назначена заявка. В `Ticket` таких справочников несколько.

Возникли вопросы:

**1.**Правильно ли что `Group` это Entity? Думал сделать его и другие справочники как ValueObject, но читал что объекты значения не принято хранить в отдельных таблицах. И мне необходимо в агрегатах, фактически (в БД) хранить только GroupId, чтобы после изменения в справочнике `Group`, в агрегатах получать измененное значение.

**2.**Если `Group` все таки Entity, то как мне ссылаться на нее в двух агрегатах? Выносить ее в отдельный агрегат, кажется неправильным. Как вариант, думал для `Ticket` создать Entity `TicketGroup`, но по факту через репозиторий возвращать одни и те же данный с одной таблицы
  • Вопрос задан
  • 300 просмотров
Решения вопроса 1
myks92
@myks92
Нашёл решение — пометь вопрос ответом!
1. Отличие VO от Entity это то, то её можно идентифицировать по Id. Так же структура VO не меняется с течением времени. Например, VO Email где бы то не был будет одинаковым и его логика долго не поменяется.

2. Тут зависит от того как вы используете эти Group. Если вам где-то в вашем приложении эти группы нужны, то их лучше создать как отдельную сущность/агрегат. Но можно и сделать их VO в сущности Ticket и хранить только ID Group, либо непосредственно название группы. Все зависит от того как вы работаете с этим в вашем контексте. Например, в контексте справочников Group может быть сущностью и это нормально. А в контексте Ticket можно хранить только ID или само значение.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы