У меня следующий доменный класс:
public class Product
{
public virtual Guid Id { get; set; }
public virtual string Name { get; set; }
public virtual IList<Product> RelatedProducts { get; set; }
}
У меня есть следующий класс DTO:
public class ProductDTO
{
public ProductDTO(Product product)
{
Id = product.Id;
Name = product.Name;
}
public Guid Id { get; private set; }
public string Name { get; private set; }
}
У меня на службе есть следующий метод:
public ProductDTO GetBySlug(string slug)
{
Product product = productRepository.GetBySlug(slug);
return (product != null) ? new ProductDTO(product) : null;
}
В моем контроллере есть следующее действие:
public ActionResult Details(string slug)
{
ProductDTO viewModel = productService.GetBySlug(slug);
return View("Details", viewModel);
}
Прочитав немного, я понял, что использование DTO в качестве модели представления нормально, поскольку текущий сценарий прост и понятен. Мое замешательство возникает, когда данные, которые я хочу вернуть, становятся немного сложнее. Предположим, я также хочу вернуть в представление список связанных продуктов. Куда бы мне добавить этот список?
Я читал, что DTO - это плоская версия объекта вашего домена, которая используется для передачи данных. Означает ли это, что общий список, содержащий связанные продукты, не должен быть разрешен внутри DTO? Ответ, который я получил до сих пор, говорит об этом. Как мне затем передать сопутствующие товары контроллеру?
Один из вариантов:
Вместо того, чтобы возвращать ProductDTO в сервисе, я бы создал новый класс, содержащий ProductDTO и список типа ProductDTO для связанных продуктов, и вернул бы его из сервиса. Затем в контроллере я бы либо передал новый класс в представление, либо создал отдельный ProductViewModel, содержащий ProductDTO и список типа ProductDTO для связанных продуктов, заполнил его и передал в представление.
Это хорошая или плохая идея? Почему?
Спасибо