5

在我的解决方案中,我有两个项目。

项目 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()
        {
        }
    }

说明: 我将使用项目(核心)中的服务类在我的控制器中获取我的 DTO。然后我创建我的 ViewModel 并将 DTO 传递给 ViewModel 中的构造函数。我也可以使用这个视图来添加一个新产品,因为我的 ViewModel 可以采用一个空的构造函数。

有没有人有这方面的经验。我想知道我这种方式将来随着项目变大会不会有问题?

我知道这与 Dapper 无关。但我仍然想要一个解释我的解决方案的好方法。

4

2 回答 2

10

我认为你会很好地使用你目前的方法。更重要的是,如果您开始遇到与对象映射代码相关的问题,请像这样开始并重构(而不是事先考虑太多)。

我有时使用的另一种组织映射逻辑的方法是使用扩展方法。这样,映射代码就与视图模型本身分开了。就像是:

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

// Usage:

var viewModel = dto.ToViewModel();

另一种方法是使用像AutoMapper这样的映射框架- 如果您的映射逻辑很简单(属性之间的大量 1:1 映射),这尤其适合。

但同样,从简单开始并在需要时重构

于 2013-01-14T11:37:55.853 回答
1

我意识到这是一个有点晚的答案,但也许它会在未来帮助某人。

这种在对象之间进行映射的方式打破了 SOLID 原则的“S”,因为 ViewModel 的职责是在其属性中准备数据以供视图使用,而不是其他任何东西,因此,映射对象不应该打开这是责任。

这种方式的另一个缺点是它还打破了“松耦合”OO 原则,因为您的 ViewModel 与您的 DTO 强耦合。

我认为,即使我们处于项目的第一步,也有一些重要的 OO 原则是我们不应该打破的,所以使用映射器类,无论是自动(AutoMapper,ValueInjecter ...)还是手动,肯定更好。

于 2016-12-28T10:55:09.763 回答