使用对象 - 对象映射器是一种好习惯,如果是这样,在哪里使用它?

时间:2015-05-17 13:31:38

标签: asp.net-mvc model-view-controller automapper object-object-mapping

我在互联网上搜索了一些关于这个主题的文章,但没有一个人满意我。我想知道使用object-object mapper将对象映射到彼此是否合适?我知道这取决于使用情况,但我如何才能实现良好或最好的使用方式?

2 个答案:

答案 0 :(得分:1)

退一步,最好将数据传输对象(DTO)和视图模型(VM)与业务对象(实体等)分开。在这方面,映射库是达到目的的一种手段,只是简化了这种关联。

至于何时,这取决于你。如果您希望能够以易于维护的方式在业务模型和DTO / VM之间进行转换,请继续。从我个人的经验来看,这只是到目前为止(特别是随着要求的变化)。因此,我喜欢映射库(特别是AutoMapper,因为我已经了解它的API并且很容易将其插入)。

话虽如此,每次我必须介于这两个模型之间时,我都会使用AutoMapper。我只需配置一次即可关闭并运行。对模型进行额外调整(在任何一侧)然后变得更容易,因为我可以在一个地方(地图定义文件)更改这些绑定,并且方法自动“赶上”。

示例:

我的数据库包含产品记录:

class Product
{
    public int Id { get; set; }

    public string Description { get; set; }
    public string Name { get; set; }
    public double Price { get; set; }
    public int QuantityOnHand { get; set; }
    public int? ReorderQuantity { get; set; }
    public string Sku { get; set; }
}

我可以用更精简的格式将其呈现给用户界面:

public class ProductViewModel
{
    public int Id { get; set; }

    public string Description { get; set; }
    public string Name { get; set; }
    public double Price { get; set; }
    public int Quantity { get; set; }
}

如果这是来自某种类型的存储库,我只是打电话:

var model = Mapper.Map<ProductViewModel>(productFromRepository)

在这里,我始终从我要求的产品中获得我关心的视图模型。如果业务/服务层要添加/更改/删除属性,我只会回到我的Mapper.CreateMap<Product, ProductViewModel>()定义,但我的演示逻辑的其余部分将保持不变。

答案 1 :(得分:1)

除了@Brad科视Christie的回答之外,如果您想要在视图中显示它们以及以不同方式生成的其他产品,则将具有微小差异的类型自动化为单一的总体类型通常会更容易。

如果您允许我删除我之前的答案,请举例说明:

class SingleProduct {
    string Name {get;set;}
    decimal Price {get;set;}
    decimal GetActualPrice() { return Price; }
}
class ComboSaleProduct {
    string Name {get;set;}
    List<SingleProduct> ComboProducts {get;set;}
    decimal GetActualPrice() { return ComboProducts.Sum(p => p.GetActualPrice()); }
}

class ProductViewModel {
    string Name {get;set;}
    decimal ActualPrice {get;set;}
}

Automapper将所有内容连接在一起,以便您可以返回其中任何一个,它将自动映射&#34; GetActualPrice&#34;到viewmodel上的ActualPrice。