首页 > 解决方案 > 将特定接口实现映射到接口目标

问题描述

我的 AutoMapper 配置文件中有多个映射,用于相同的源和目标类型。目标类型是一个具有多个具体实现的接口。根据场景,我将映射到 IEmployeeDto 的适当具体实现。

// Model
public class Department
{
  public List<Employee> Employees { get; set; }
}

public class DepartmentDto
{
  public List<IEmployeeDto> Employees { get; set; }
}

public class EmployeeDto1 : IEmployeeDto 
{
  ...
}

public class EmployeeDto2 : IEmployeeDto
{
  ...
}

// Mappings
profile.CreateMap<Employee, IEmployeeDto>()
  .As<EmployeeDto1>();

profile.CreateMap<Employee, IEmployeeDto>()
  .As<EmployeeDto2>();

我也在使用实体框架。在运行时,我使用投影来映射:

var department = context.Departments
  .ProjectTo<DeparmentDto>(config)
  .SingleOrDefaultAsync(d => d.Name == departmentName);

//In this specific use case, I'm expecting EmployeeDto2 instead of EmployeeDto1
var employees = department.Employees;

有没有办法暗示目标类型的具体实现应该映射到哪个?

标签: c#automapper

解决方案


您通过指定已配置为使用特定类型的 AutoMapper 映射来“提示”它应该使用哪个具体实现。当你写

profile.CreateMap<Employee, IEmployeeDto>().As<EmployeeDto1>();

当一个对象应该映射到一个实例时,它将使用特定的EmployeeDto1类。如果您想要不同的映射,只需更改 AutoMapper 配置中配置的映射或使用不同的 AutoMapper 配置本身(配置了不同的映射)。您可以拥有多个对象实例,每个实例都有自己的配置。该方法需要配置才能使用,因此您可以根据需要交换配置。EmployeeIEmployeeDtoMapperConfigurationProjectTo()


推荐阅读