내 ViewModels 생성자에 DTO를 전달하여 속성을 매핑합니다.

architecture asp.net-mvc c# dapper

문제

내 솔루션에는 두 가지 프로젝트가 있습니다.

프로젝트 1 (핵심) Dapper를 사용하여 SQL을 DTO에 매핑

프로젝트 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()
        {
        }
    }

설명 : 프로젝트 (Core)에서 서비스 클래스를 사용하여 컨트롤러에서 내 DTO를 가져옵니다. 그런 다음 ViewModel을 만들고 ViewModel의 생성자에 DTO를 전달합니다. ViewModel이 빈 생성자를 사용할 수 있기 때문에이 뷰를 사용하여 새 Product를 추가 할 수도 있습니다.

누구든지이 경험을 가지고 있습니까? 나는이 방법으로 프로젝트가 커지면 미래에 문제가 생길지 궁금하다.

나는 이것이 Dapper와 아무런 관련이 없다는 것을 안다. 그러나 나는 여전히 나의 해결책을 설명하는 좋은 방법을 원할 것이다.

수락 된 답변

나는 당신이 현재의 접근법을 사용하여 잘 될 것이라고 생각합니다. 더 중요한 것은 객체 매핑 코드와 관련된 문제가 발생하기 시작하면 (미리 너무 많이 생각하는 대신) 리팩터링리팩터링 을 시작하는 것입니다.

때때로 사용하는 매핑 논리를 구성하는 또 다른 방법은 확장 메서드를 사용하는 것입니다. 그렇게하면 매핑 코드가 뷰 모델 자체와 별도로 유지됩니다. 같은 것 :

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

// Usage:

var viewModel = dto.ToViewModel();

또 다른 접근법은 AutoMapper 와 같은 매핑 프레임 워크 를 사용하는 것입니다. 매핑 논리가 단순한 경우 (특히 속성 사이에 1 : 1 매핑이 많은 경우) 특히 적합합니다.

그러나 필요할 때 간단하고 리팩터링을 시작 하십시오.


인기 답변

나는 이것이 조금 늦은 대답이라는 것을 알고 있지만 어쩌면 미래에 누군가를 도울 것입니다.

ViewModel의 책임은 뷰에서 사용할 준비가되어있는 속성의 데이터를 준비하는 것이므로 Solving 원칙의 'S'를 깨뜨린 것이므로 매핑 객체가 켜져 있으면 안됩니다. 그것은 책임입니다.

이 방법의 또 다른 단점은 ViewModel이 DTO와 강하게 결합되어있는 것처럼 'Loose Coupling'OO 원리를 깨뜨리는 것입니다.

우리가 프로젝트의 첫 단계에있을 때에도 우리가 깨뜨려서는 안되는 important OO 원칙이 있으므로 자동 (AutoMapper, ValueInjecter ...) 또는 매뉴얼 중 매퍼 클래스를 사용하는 것이 분명 좋습니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.