У меня есть следующий класс домена:
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 для связанных продуктов, заполняет его и передает его представлению.
Это хорошая или плохая идея? Почему?
Спасибо