Передача DTO в конструктор ViewModels для отображения свойств

architecture asp.net-mvc c# dapper

Вопрос

В моем решении у меня есть два проекта.

Project 1 (Core) Сопоставление SQL с DTO с использованием Dapper

Проект 2 (WebUI - ASP.NET MVC 4) Здесь я использую ViewModel для каждого представления.

Примеры контроллера

  [HttpGet]
    public ActionResult Edit(int id)
    {
        // Get my ProductDto in Core
        var product = Using<ProductService>().Single(id);
        var vm = new ProductFormModel(product);

        return View(vm);
    }

Примеры ViewModel

public class ProductFormModel : BaseViewModel, ICreateProductCommand
    {
        public int ProductId { get; set; }
        public int ProductGroupId { get; set; }
        public string ArtNo { get; set; }
        public bool IsDefault { get; set; }
        public string Description { get; set; }
        public string Specification { get; set; }
        public string Unit { get; set; }
        public string Account { get; set; }
        public decimal NetPrice { get; set; }

        public ProductFormModel(int productGroupId)
        {
            this.ProductGroupId = productGroupId;
        }

        public ProductFormModel(ProductDto dto)
        {
            this.ProductId = dto.ProductId;
            this.ProductGroupId = dto.ProductGroupId;
            this.ArtNo = dto.ArtNo;
            this.IsDefault = dto.IsDefault;
            this.Description = dto.Description;
            this.Specification = dto.Specification;
            this.Unit = dto.Unit;
            this.Account = dto.Account;
            this.NetPrice = dto.NetPrice;
        }

        public ProductFormModel()
        {
        }
    }

Объяснение: Я получаю свои DTO в контроллере, используя класс сервиса в проекте (Core). Затем я создаю свой ViewModel и передаю DTO конструктору в ViewModel. Я также могу использовать это представление для добавления нового продукта, потому что мой ViewModel может принимать пустой конструктор.

У кого-нибудь есть опыт в этом. Интересно, будет ли у меня таким образом проблемы в будущем, когда проект станет больше?

Я знаю, что это не имеет никакого отношения к Дапперу. Но мне все же хотелось бы найти хороший способ объяснить мое решение.

Принятый ответ

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

Другой способ организовать картографическую логику, которую я иногда использую, - использовать методы расширения. Таким образом, код отображения сохраняется отдельно от самой модели представления. Что-то вроде:

public static class ProductMappingExtensions
{
    public static ProductFormModel ToViewModel(this ProductDto dto)
    {
        // Mapping code goes here
    }
}

// Usage:

var viewModel = dto.ToViewModel();

Еще один подход заключается в использовании инфраструктуры сопоставления, такой как AutoMapper - это хорошо подходит, особенно если ваша логика сопоставления проста (много отображений 1: 1 между свойствами).

Но опять же, начинайте с простого и рефакторинга, когда вам нужно .


Популярные ответы

Я понимаю, что это немного поздний ответ, но, возможно, это поможет кому-то в будущем.

Этот способ выполнения сопоставления между объектами нарушает «S» принципов SOLID, поскольку ответственность ViewModel заключается в том, чтобы подготовить данные в своих свойствах к тому, чтобы они были готовы к использованию в представлении, и ничего больше, поэтому объекты сопоставления не должны это обязанности.

Другим недостатком этого способа является то, что он также нарушает принцип «Loose Coupling» OO, поскольку вы ViewModel тесно связаны с вашим DTO.

Я думаю, что даже когда мы находимся на самом первом этапе проекта, есть некоторые принципы OO-импортеров, которые мы никогда не должны прерывать, поэтому использование классов сопоставления, будь то auto (AutoMapper, ValueInjecter ...) или вручную, определенно лучше.



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему