CQRS DDD - отношения между командами и моделями доменов - PullRequest
0 голосов
/ 07 декабря 2018

Я тренируюсь, чтобы реализовать проект с использованием CQRS и DDD настолько хорошо, насколько это возможно, и у меня возник вопрос после построения команд.

Сценарий: Пользователь отправляет команду на создание книжной полки в системе, которая сама может также содержать коллекцию книг.

Команда выглядит следующим образом:

public class CreateNewBookShelfCommand : ICommand
{
    public long CommandInitiatorId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public ICollection<Book> Books { get; set; }
}

Все Commands находятся в проекте Contracts, который находится внутри папки решения Application.

Проект Model, находящийся в папке решения Domainсодержит класс сущности BookShelf, который включает коллекцию Books.

Вопросы 1: Приведенная выше команда имеет это свойство Books, которое имеет тип Book.Мой вопрос: должен ли проект Commands напрямую ссылаться на проект модели, чтобы тип данных Book был разрешен в CreateNewBookShelfCommand?Сам я не думаю, что Contracts разрешено ссылаться на любой проект, кроме CommandHandlers или что-либо еще, что может быть Cross Cutting .

Вопрос 2: Итак, является ли хорошей практикой копировать часть класса сущности Book здесь, в проекте Contracts, и использовать его в CreateNewBookShelfCommand?

И это модельный проект, который у меня есть для Book и BookShelf:

public class BookShelf : BaseEntity
{
    public string Name { get; set; }
    public string Description { get; set; }
    public BookShelfAccess Access { get; set; }

    public virtual BookShelfOwner Owner { get; set; }
    public long OwnerId { get; set; }

    public ICollection<Book> Books { get; set; }
}

 public class Book : BaseEntity
{
    public string Name { get; set; }
    public DateTime? PublishedAt { get; set; }
    public int NumberOfPublishes { get; set; }

    public virtual BookShelf Shelf { get; set; }
    public long ShelfId { get; set; }
}

Я надеюсь, что моего объяснения было достаточно, если есть какая-либо другая информация, которую я должен добавить здесь,я знаю.

1 Ответ

0 голосов
/ 07 декабря 2018

Как правило, вы не будете использовать сущности в вашей доменной модели в качестве элементов вашей команды.

Команды - это в основном сообщения , и поэтому они действительно должны быть неизменными.Вы хотите знать, что полученное - это то же самое, что было отправлено.В терминах DDD вы можете думать о сообщениях как о объектах-значениях .

Нет смысла использовать сущность из вашей доменной модели как часть представления вашей памяти в памяти.команда, потому что вы никогда не должны вызывать какие-либо методы сущностей, которые изменяют его состояние.

Команды по своей природе гораздо ближе к объектам передачи данных, чем к сущностям модели предметной области.

Обычно,все объекты сущностей в вашей системе должны находиться за агрегированным корневым интерфейсом, а аргументы, передаваемые этому интерфейсу, значения .Если модели предметной области нужна сущность, она может создать ее из предоставленных значений.

...