Passage de DTO à mon constructeur ViewModels pour mapper des propriétés

architecture asp.net-mvc c# dapper

Question

Dans ma solution, j'ai deux projets.

Projet 1 (Core) Mappage SQL vers DTO à l'aide de Dapper

Projet 2 (WebUI - ASP.NET MVC 4) J'utilise ici un ViewModel par vue.

Exemples de contrôleur

  [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);
    }

Exemples de 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()
        {
        }
    }

Explication: Je vais récupérer mes DTO dans mon contrôleur en utilisant une classe de service dans le projet (Core). Ensuite, je crée mon ViewModel et transmet le DTO au constructeur dans ViewModel. Je peux également utiliser cette vue pour ajouter un nouveau produit car mon ViewModel peut prendre un constructeur vide.

Est-ce que quelqu'un en a l'expérience? Je me demande si je serai de cette façon aura des problèmes à l'avenir, alors que le projet s'agrandit?

Je sais que cela n'a rien à voir avec Dapper. Mais je voudrais quand même un bon moyen d’expliquer ma solution.

Réponse acceptée

Je pense que vous allez bien utiliser votre approche actuelle. Plus important encore, commencez comme ceci et refactorez si vous commencez à rencontrer des problèmes liés à votre code de mappage d'objet (au lieu de trop y penser).

Une autre façon d'organiser la logique de cartographie que j'utilise parfois consiste à utiliser des méthodes d'extension. De cette façon, le code de mappage est séparé du modèle de vue lui-même. Quelque chose comme:

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

// Usage:

var viewModel = dto.ToViewModel();

Une autre approche consisterait à utiliser un framework de mappage tel qu'AutoMapper , ce qui convient particulièrement si votre logique de mappage est simple (beaucoup de correspondances 1: 1 entre les propriétés).

Mais encore une fois, commencez simple et refactore quand vous en avez besoin .


Réponse populaire

Je me rends compte que la réponse est un peu tardive, mais peut-être que cela aidera quelqu'un dans le futur.

Cette méthode de mappage entre les objets brise le «S» des principes SOLID, car la responsabilité de ViewModel est de préparer les données de ses propriétés pour qu'elles soient prêtes à être utilisées par la vue et rien d'autre, par conséquent, les objets de mappage ne doivent pas être activés. c'est des responsabilités.

Un autre inconvénient de cette méthode est qu’elle rompt également le principe OO «Couplage en vrac» lorsque ViewModel est fortement associé à votre DTO.

Je pense que, même lorsque nous en sommes à la toute première étape du projet, il existe des principes OO importants que nous ne devrions jamais casser.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi