Я тренируюсь, чтобы реализовать проект с использованием 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; }
}
Я надеюсь, что моего объяснения было достаточно, если есть какая-либо другая информация, которую я должен добавить здесь,я знаю.