将特定接口实现映射到接口目标

Mapping specific interface implementation to interface destination

我的 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>();

我也在使用 Entity Framework。 在运行时,我使用投影来映射:

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;

有什么方法可以提示应该将目标类型映射到哪个具体实现?

您 "hint" 通过指定已配置为使用特定类型的 AutoMapper 映射,它应该使用哪个具体实现。当你写

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

Employee 对象应映射到 IEmployeeDto 实例时,它将使用特定的 EmployeeDto1 class。如果您想要不同的映射,只需更改 AutoMapper 配置中配置的映射或使用不同的 AutoMapper 配置本身(配置了不同的映射)。您可以有多个 MapperConfiguration 对象实例,每个实例都有自己的配置。 ProjectTo()方法需要配置才能使用,所以你可以根据自己的需要调换配置。