假设我有这个域模型:
public class Department
{
public int DepartmentId { get; set; }
public String DepartmentName { get; set; }
public ICollection<Course> Courses { get; set; }
}
public class Course
{
public String CourseName { get; set; }
public String CourseDescription { get; set; }
}
和相对持久性模型,针对实体框架和代码优先数据库创建进行了优化:
public class DepartmentDTO
{
public int DepartmentId { get; set; }
public String DepartmentName { get; set; }
public ICollection<CourseDTO> Courses { get; set; }
}
public class CourseDTO
{
public int CourseId { get; set; }
public int DepartmentId { get; set; }
public String CourseName { get; set; }
public String CourseDescription { get; set; }
}
然后我有一个测试类,我使用Automapper进行所有映射:
static void Main(string[] args)
{
Department dep = CreateDepartment();
Mapper.CreateMap<Department, DepartmentDTO>();
Mapper.CreateMap<Course, CourseDTO>()
.ForMember(dst => dst.CourseId, src => src.UseValue<int>(13)); // in my real scenario this is an autogenerated GUID
DepartmentDTO depDTO = Mapper.Map<DepartmentDTO>(dep);
}
public static Department CreateDepartment()
{
ICollection<Course> listOfCourses = new List<Course>();
listOfCourses.Add(new Course { CourseDescription = "A dummy course", CourseName = "Test Course" });
return new Department { DepartmentId = 42, DepartmentName = "Test Department", Courses = listOfCourses };
}
到目前为止,地图几乎已经完成,只缺少一件事:CourseDTO.DepartmentId
应为42
。
在这种情况下,一切都很好,因为我可以通过dep.DepartmentId
访问该值,但这不是真实的情况。
如何配置AutoMapper以达到我的目标?
答案 0 :(得分:0)
您可以创建自定义解析程序,以便在解析DepartmentId
时为每个Course
设置Courses
。
public class CourseResolver : ValueResolver<Department, ICollection<CourseDTO>>
{
protected override ICollection<CourseDTO> ResolveCore(Department source)
{
var coursesDto = source.Courses
.Select(c => Mapper.Map<CourseDTO>(c)).ToList();
coursesDto.ForEach(c => c.DepartmentId = source.DepartmentId);
return coursesDto;
}
}
配置:
Mapper.CreateMap<Department, DepartmentDTO>()
.ForMember(obj => obj.Courses, opt => opt.ResolveUsing<CourseResolver>());
Mapper.CreateMap<Course, CourseDTO>();