.NET 中的对象-对象映射有哪些不同的方法?
What are the different approaches to Object-Object mapping in .NET?
我需要在对象之间进行一些映射(例如 PersonModel 到 PersonViewModel),并且正在研究执行此操作的不同方法。具体来说,我正在使用 Entity Framework 并尝试将生成的模型映射到视图模型。
但是,我还没有找到一篇文章或资源来汇总如何执行此操作的列表。到目前为止,我遇到了以下问题:
- 隐式转换(我认为这是最基本的方法?因为你手动将属性从一个对象映射到另一个对象,它简单但乏味)
- 扩展方法(尚未使用)
- 反射(我做了一些修改,但只管理了非常基本的映射)
- Automapper(非常受欢迎,但我无法让它与 EF 一起正常工作)
- Value Injecter(还没有用过)
- Emit Mapper(还没有使用过它,但我可能无法让它与 EF 一起使用?)
能否请您帮忙指出并详细说明那里可用的方法,以及每种方法的优缺点?例如,我看到有人提到 Automapper 与手动映射相比速度慢?或者,指出一篇解决此问题的文章?
编辑:因为有些人可能会问我使用 AutoMapper 有什么问题,请看这个:
好吧,我可以给你一个方法,让你自己做映射,做起来很简单,而且可以在大量数据上快速执行。我将向您展示我会做什么,然后尝试详细说明我为什么要这样做。这里是:
public class PersonViewModel
{
public static Expression<Func<Person, PersonViewModel>> FromPerson
{
get
{
return p => new PersonViewModel
{
Name = p.FirstName,
SurName = p.LastName
};
}
}
public string Name { get; set; }
public string SurName { get; set; }
public static PersonViewModel CreateViewModel(Person original)
{
var func = FromPerson.Compile();
var vm = func(original);
return vm;
}
}
现在您会注意到我有两种方法可以将 Person EF 模型转换为 ViewModel。这是因为第一个使用 Expression>,用于在 Select() 语句中转换大量对象。简单用法:
return people.Select(PersonViewModel.FromPerson);
在这种情况下,我们可能已经从数据库中检索了一组 Person 对象,并且需要使用 ViewModel 将它们显示在列表或其他内容中。以这种方式,操作是批量执行的,并且比通过其他方法简单地创建所有对象要快得多。现在,可以使用静态 CreateViewModel 方法在需要的地方映射单个对象。一个例子是,如果您从数据库中获取了单个用户的数据并需要显示它,但使用的是您的 ViewModel。在这种情况下,最好使用静态方法而不是主要用于批量转换的表达式。
这就是我所能提供的,除了想知道使用 AutoMapper 有什么问题之外,因为它非常简单,而且您还没有真正详细说明将它与 EF 一起使用的问题是什么。希望这对您的问题至少有一点帮助:)
好吧,如果您预先知道对象的类型,那么接受的答案就很好。
如果没有,我会选择 AutoMapper 或 PropMapper。
如果你想推出自己的东西,最“最新”的方法是使用编译的表达式树。您枚举类型的属性,然后为每个 属性 构建一个赋值表达式块,然后“编译”这个块:
var e = Expression.Assign(Expression.Property(srcObj, prop1), Expression.Property(destObj, prop2)));
这是一个关于此的分步博客 post:https://dev.to/alexjitbit/yet-another---lightning-fast---object-mapper-for-net-2bj2
我需要在对象之间进行一些映射(例如 PersonModel 到 PersonViewModel),并且正在研究执行此操作的不同方法。具体来说,我正在使用 Entity Framework 并尝试将生成的模型映射到视图模型。
但是,我还没有找到一篇文章或资源来汇总如何执行此操作的列表。到目前为止,我遇到了以下问题:
- 隐式转换(我认为这是最基本的方法?因为你手动将属性从一个对象映射到另一个对象,它简单但乏味)
- 扩展方法(尚未使用)
- 反射(我做了一些修改,但只管理了非常基本的映射)
- Automapper(非常受欢迎,但我无法让它与 EF 一起正常工作)
- Value Injecter(还没有用过)
- Emit Mapper(还没有使用过它,但我可能无法让它与 EF 一起使用?)
能否请您帮忙指出并详细说明那里可用的方法,以及每种方法的优缺点?例如,我看到有人提到 Automapper 与手动映射相比速度慢?或者,指出一篇解决此问题的文章?
编辑:因为有些人可能会问我使用 AutoMapper 有什么问题,请看这个:
好吧,我可以给你一个方法,让你自己做映射,做起来很简单,而且可以在大量数据上快速执行。我将向您展示我会做什么,然后尝试详细说明我为什么要这样做。这里是:
public class PersonViewModel
{
public static Expression<Func<Person, PersonViewModel>> FromPerson
{
get
{
return p => new PersonViewModel
{
Name = p.FirstName,
SurName = p.LastName
};
}
}
public string Name { get; set; }
public string SurName { get; set; }
public static PersonViewModel CreateViewModel(Person original)
{
var func = FromPerson.Compile();
var vm = func(original);
return vm;
}
}
现在您会注意到我有两种方法可以将 Person EF 模型转换为 ViewModel。这是因为第一个使用 Expression>,用于在 Select() 语句中转换大量对象。简单用法:
return people.Select(PersonViewModel.FromPerson);
在这种情况下,我们可能已经从数据库中检索了一组 Person 对象,并且需要使用 ViewModel 将它们显示在列表或其他内容中。以这种方式,操作是批量执行的,并且比通过其他方法简单地创建所有对象要快得多。现在,可以使用静态 CreateViewModel 方法在需要的地方映射单个对象。一个例子是,如果您从数据库中获取了单个用户的数据并需要显示它,但使用的是您的 ViewModel。在这种情况下,最好使用静态方法而不是主要用于批量转换的表达式。
这就是我所能提供的,除了想知道使用 AutoMapper 有什么问题之外,因为它非常简单,而且您还没有真正详细说明将它与 EF 一起使用的问题是什么。希望这对您的问题至少有一点帮助:)
好吧,如果您预先知道对象的类型,那么接受的答案就很好。
如果没有,我会选择 AutoMapper 或 PropMapper。
如果你想推出自己的东西,最“最新”的方法是使用编译的表达式树。您枚举类型的属性,然后为每个 属性 构建一个赋值表达式块,然后“编译”这个块:
var e = Expression.Assign(Expression.Property(srcObj, prop1), Expression.Property(destObj, prop2)));
这是一个关于此的分步博客 post:https://dev.to/alexjitbit/yet-another---lightning-fast---object-mapper-for-net-2bj2