我正在阅读.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();
在这种情况下,源对象将与目标属性一起保存?而且我不必使用自动映射器?这是对的吗?
答案 0 :(得分:1)
由于您有一些问题,我会尝试单独回答:
什么时候我们需要使用这个映射器?
如果要根据另一个对象的属性(可以是相同类型,但通常情况并非如此)设置对象的多个属性,则使用AutoMapper。
在我的代码中说源和目标对象具有相同的类型,那么我需要这个映射器吗?
这取决于您是否希望源对象保持不变(即:对象引用),并且您希望复制所有类型的属性。如果不是这种情况,那么在这种情况下AutoMapper仍然有用(即使两种类型都相同)。
例如,我可以使用简单的= operation
来映射具有相同类型的对象
它们不是等效的操作。赋值运算符(destination = source
)替换了对象引用,因此变量destination
将引用与变量source
(Object.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。