如果源和目标类型相同,我们是否需要使用asp.net Auto Mapper

时间:2017-10-11 12:19:41

标签: c# asp.net .net entity-framework automapper

我正在阅读.NET https://github.com/AutoMapper/AutoMapper中基于约定的对象 - 对象映射器。允许映射两个对象之间的属性。但我的问题是我们何时需要使用这个映射器?让我说在我的代码中源和目标对象具有相同的类型,那么我需要这个映射器吗? 例如,我可以使用简单的=操作映射具有相同类型的对象,如下所示: -

Staff source = new Staff ()
{
FirstName= "Source First",
LastName = "Source Last",
Age =22,
Address = "Soruce 123..."
};

Staff destination = new Staff ()
{
FirstName= "Destination First",
LastName = "Destination Last",
Age =20,
Address = "Destination 123..."
};

source = destination;
entities.Staffs.Add(source);
entities.Save();

在这种情况下,源对象将与目标属性一起保存?而且我不必使用自动映射器?这是对的吗?

2 个答案:

答案 0 :(得分:1)

由于您有一些问题,我会尝试单独回答:

  

什么时候我们需要使用这个映射器?

如果要根据另一个对象的属性(可以是相同类型,但通常情况并非如此)设置对象的多个属性,则使用AutoMapper。

  

在我的代码中说源和目标对象具有相同的类型,那么我需要这个映射器吗?

这取决于您是否希望源对象保持不变(即:对象引用),并且您希望复制所有类型的属性。如果不是这种情况,那么在这种情况下AutoMapper仍然有用(即使两种类型都相同)。

  

例如,我可以使用简单的= operation

来映射具有相同类型的对象

它们不是等效的操作。赋值运算符(destination = source)替换了对象引用,因此变量destination将引用与变量sourceObject.referenceEquals(source, destination) == true)相同的对象。

如果您使用Mapper.Map<Source, Destination>(source, destination),则基本上设置了source对象的所有属性,但它仍然是同一个对象(Object.referenceEquals(source, destination) == false)。

答案 1 :(得分:1)

您正在使用source = destination;,它将仅复制目标对象的内存位置的引用。在您提供的示例中,由于您要向实体添加对象,因此无关紧要。

如果您希望在单独的内存位置完整克隆对象以对对象进行其他处理,请使用ICloneable和MemberwiseClone,以防万一,您不希望将AutoMapper用于映射完全相同的内容。

public class Staff : ICloneable
{
    public string FirstName{get;set;}
    public string LastName{get;set;}
    public int Age{get;set;}
    public string Address{get;set;}

    public object Clone()
    {
        return this.MemberwiseClone();
    }
}

然后,您可以使用source = (Staff)destination.Clone();

这样只允许浅拷贝。如果您需要深层复制,you can serialize and deserialize