哪种方法最好? AutoMapper 反对隐式(C# 参考)
Which is the best approach? AutoMapper against implicit (C# Reference)
Automapper 是一种匹配类型的方法,非常适用于映射模型及其视图模型时。 但这不是我们可以在 C# 中使用隐式实现的方法吗? (假设两个模型具有相同的属性但名称不同,在这种情况下,您需要在模型之间链接的AutoMapper中指定)
有了 autommaper,我们有
public class Employee
{
public string Name { get; set; }
public string Email { get; set; }
}
public class EmployeeViewItem
{
public string Name { get; set; }
public string Email { get; set; }
}
通常我们这样做:
Employee employee = new Employee
{
Name = "John SMith",
Email = "john@codearsenal.net"
}
EmployeeViewItem viewItem = new EmployeeViewItem();
viewItem.Name = employee.Name;
viewItem.Email = employee.Email;
使用 AutoMapper
EmployeeViewItem employeeVIewItem = Mapper.Map<Employee, EmployeeViewItem>(employee);
现在,使用隐式 C# 参考
public class Employee
{
public static implicit operator EmployeeViewItem(Employee employee)
{
EmployeeViewItem viewItem = new EmployeeViewItem();
viewItem.Name = employee.Name;
viewItem.Email = employee.Email;
return viewItem;
}
public static implicit operator Employee(EmployeeViewItem ev)
{
var e = new Employee();
e.Name = ev.Name;
e.Email = ev.Email;
return e;
}
}
AutoMapper 使用反射来映射属性(性能开销很小),允许高级自定义映射规则,并且在基本(常见?)场景中需要 1 行代码。
隐式运算符要求您指定每个 属性,容易出错(添加新的 属性 但不将其添加到运算符),更难设置多种类型,创建很多无用的代码,即使在最基本的设置中,您仍然有 N 行代码,其中 N 是属性的数量。
我认为它不言自明。
我拒绝使用隐式。
本例中的视图模型没有额外的属性。但是,如果确实如此,您根本不需要视图模型。实际上,它会有许多其他属性,可能包含不是来自原始模型的数据。例如。 IsSelected 什么的。
隐式转换应该可以在不丢失数据的情况下工作,而反向转换回模型是不可能的
其次!
视图模型的目的是匹配视图所需的数据。每个模型应该有多个视图模型。例如。也许您有一个编辑视图和一个不可编辑视图。或移动应用程序和网页!
模型不应该知道这些视图或它们的模型,并且隐式的使用需要耦合它
这取决于您的具体情况。
如果 AutoMapper 能够将您的 类 映射到彼此,并且您不需要在映射过程中发生任何特殊逻辑,那么当存在一些东西时,为什么还要自己编写所有代码呢?可以使用 NuGet 参考和几行代码为您完成吗?此外,此方法会随着您更改 类 进行调整,从而为您省去维护它的麻烦。
如果您需要在映射过程中做 AutoMapper 不能做的聪明事情,或者由于某种原因 AutoMapper 在您的项目中不可用,那么您将不得不编写自己的运算符。如果可以避免,我建议不要这样做,但有时你会坚持下去。
Automapper 基本上允许您:
- 忘记常规、琐碎的代码;
- 自动处理复杂类型的内部属性;
- 在复制构造过程中跳过(忽略)一些属性;
- 高级:创建 IOC 友好的映射程序;
- 在一个地方流畅地配置 1-3 个进程。
但是明显比手写代码慢。因此,如果您不太关心性能 - 您应该尝试一下,这可能是值得的。否则,您可以尝试更快的方法(例如 emitmapper)或手动编写您自己的映射器并组合以转换复杂类型。
我的经验表明,视图模型通常与模型 (DTO) 有很大不同,因为它们是为不同的任务创建的,以解决不同的问题。因此在这种情况下自动映射会很困难,或者没有优势(变得不可读的混乱,集团)
Automapper 是一种匹配类型的方法,非常适用于映射模型及其视图模型时。 但这不是我们可以在 C# 中使用隐式实现的方法吗? (假设两个模型具有相同的属性但名称不同,在这种情况下,您需要在模型之间链接的AutoMapper中指定)
有了 autommaper,我们有
public class Employee
{
public string Name { get; set; }
public string Email { get; set; }
}
public class EmployeeViewItem
{
public string Name { get; set; }
public string Email { get; set; }
}
通常我们这样做:
Employee employee = new Employee
{
Name = "John SMith",
Email = "john@codearsenal.net"
}
EmployeeViewItem viewItem = new EmployeeViewItem();
viewItem.Name = employee.Name;
viewItem.Email = employee.Email;
使用 AutoMapper
EmployeeViewItem employeeVIewItem = Mapper.Map<Employee, EmployeeViewItem>(employee);
现在,使用隐式 C# 参考
public class Employee
{
public static implicit operator EmployeeViewItem(Employee employee)
{
EmployeeViewItem viewItem = new EmployeeViewItem();
viewItem.Name = employee.Name;
viewItem.Email = employee.Email;
return viewItem;
}
public static implicit operator Employee(EmployeeViewItem ev)
{
var e = new Employee();
e.Name = ev.Name;
e.Email = ev.Email;
return e;
}
}
AutoMapper 使用反射来映射属性(性能开销很小),允许高级自定义映射规则,并且在基本(常见?)场景中需要 1 行代码。
隐式运算符要求您指定每个 属性,容易出错(添加新的 属性 但不将其添加到运算符),更难设置多种类型,创建很多无用的代码,即使在最基本的设置中,您仍然有 N 行代码,其中 N 是属性的数量。
我认为它不言自明。
我拒绝使用隐式。
本例中的视图模型没有额外的属性。但是,如果确实如此,您根本不需要视图模型。实际上,它会有许多其他属性,可能包含不是来自原始模型的数据。例如。 IsSelected 什么的。
隐式转换应该可以在不丢失数据的情况下工作,而反向转换回模型是不可能的
其次!
视图模型的目的是匹配视图所需的数据。每个模型应该有多个视图模型。例如。也许您有一个编辑视图和一个不可编辑视图。或移动应用程序和网页!
模型不应该知道这些视图或它们的模型,并且隐式的使用需要耦合它
这取决于您的具体情况。
如果 AutoMapper 能够将您的 类 映射到彼此,并且您不需要在映射过程中发生任何特殊逻辑,那么当存在一些东西时,为什么还要自己编写所有代码呢?可以使用 NuGet 参考和几行代码为您完成吗?此外,此方法会随着您更改 类 进行调整,从而为您省去维护它的麻烦。
如果您需要在映射过程中做 AutoMapper 不能做的聪明事情,或者由于某种原因 AutoMapper 在您的项目中不可用,那么您将不得不编写自己的运算符。如果可以避免,我建议不要这样做,但有时你会坚持下去。
Automapper 基本上允许您:
- 忘记常规、琐碎的代码;
- 自动处理复杂类型的内部属性;
- 在复制构造过程中跳过(忽略)一些属性;
- 高级:创建 IOC 友好的映射程序;
- 在一个地方流畅地配置 1-3 个进程。
但是明显比手写代码慢。因此,如果您不太关心性能 - 您应该尝试一下,这可能是值得的。否则,您可以尝试更快的方法(例如 emitmapper)或手动编写您自己的映射器并组合以转换复杂类型。
我的经验表明,视图模型通常与模型 (DTO) 有很大不同,因为它们是为不同的任务创建的,以解决不同的问题。因此在这种情况下自动映射会很困难,或者没有优势(变得不可读的混乱,集团)