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

Posted

技术标签:

【中文标题】使用对象-对象映射器是一种好习惯,如果是,在哪里使用它?【英文标题】:Is it good practice to use object-object mappers, and, if so, where to use it? 【发布时间】:2015-07-29 00:34:11 【问题描述】:

我在互联网上搜索了一些,找到了一些关于这个主题的文章,但没有一篇让我满意。我想知道使用对象-对象映射器将对象相互映射好不好?我知道这取决于使用情况,但我将如何实现一个好的或最佳使用情况?

【问题讨论】:

这真的取决于。例如,我在当前项目中使用 Automapper。它真的让我很满意。 【参考方案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; 

我可能会以更简洁的格式将其呈现给 UI:

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&lt;Product, ProductViewModel&gt;() 定义,但我的其余表示逻辑将保持不变。

【讨论】:

最重要的是,如果不小心,导航属性可能会被包含在内。 Automapper 将帮助这种情况不会发生。如果您是 json 编码,这尤其糟糕。【参考方案2】:

除了@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 将所有内容连接在一起,以便您可以返回其中任何一个,它会自动将“GetActualPrice”映射到您的视图模型上的 ActualPrice。

【讨论】:

以上是关于使用对象-对象映射器是一种好习惯,如果是,在哪里使用它?的主要内容,如果未能解决你的问题,请参考以下文章

将对象文字用作哈希表是一种好习惯吗?

在 MySQL 的表名中使用点是一种好习惯吗

在 javascript 中创建全局 urls 对象以便在模板中轻松反向路由是一种好习惯吗?

使用“视图”进行分组是一种好习惯吗?

为 useState() 钩子字符串化对象以避免重新渲染是一种好习惯吗

登录后重新生成会话 ID 是一种好习惯吗?