使用Automapper的正确方法是什么?它是在控制器中还是在存储库模式中?对我来说,似乎把它们放在控制器中并不是整洁无序的。
例如,
(控制器中使用的自动映射器):
- StudentController
public IActionResult Get()
{
var query = _context.Students.ToList();
var mapper = AutoMapper.Mapper.Map<List<Student>, List<StudentViewModel>>(query);
return new OkObjectResult(mapper);
}
(存储库模式中使用的自动映像):
- StudentController
public IActionResult Get()
{
return new OkObjectResult(_studentRepository.GetAllStudents());
}
- StudentRepository
public IEnumerable<StudentViewModel> GetAllStudents()
{
var query = _context.Students.ToList();
var mapper = AutoMapper.Mapper.Map<List<Student>, List<StudentViewModel>>(query);
return mapper;
}
返回相同的结果,但实际上放置自动播放器设置的最佳位置是什么?并且最好使用 .ProjectTo()来避免使用 AutoMapper.Mapper.Map ?
答案 0 :(得分:13)
一种简单的思考方式,就是模型的转换。
在这种情况下,您将映射到视图模型。这是控制器的可靠性。因此,逻辑上的选择是在控制器代码中进行映射。
另一种思考方式。存储库的另一个用户可以使用相同的模型,但可以使用不同的模型。例如。将其转换为JSON对象以在REST API中使用。在这种情况下,需要不同的映射。此映射不属于存储库,而属于存储库的用户。
答案 1 :(得分:1)
映射不是存储库的责任。这是 您的控制者的责任。您的存储库应该返回 域对象和存储库的客户端可以决定它是否 需要做映射。通过将域对象映射到视图模型 (或其他东西)在存储库中,您可以阻止客户端 您的存储库无法访问底层域对象
因此,对于 API 控制器而言,在控制器中包含映射器更有意义