在控制器或存储库模式中使用Automapper会更好吗?

bbu*_*ver 7 entity-framework automapper asp.net-core

使用Automapper的正确方法是什么?它是在控制器中还是在存储库模式中?对我来说,似乎把它们放在控制器中并不整洁无序.

所以,例如,

(控制器中使用的自动映射器):

- StudentController

public IActionResult Get()
    {           
        var query = _context.Students.ToList();

        var mapper = AutoMapper.Mapper.Map<List<Student>, List<StudentViewModel>>(query);

        return new OkObjectResult(mapper);
    }
Run Code Online (Sandbox Code Playgroud)

(存储库模式中使用的自动映像):

- StudentController

public IActionResult Get()
    {          
        return new OkObjectResult(_studentRepository.GetAllStudents());       
    }
Run Code Online (Sandbox Code Playgroud)

- StudentRepository

public IEnumerable<StudentViewModel> GetAllStudents()
    {
       var query = _context.Students.ToList();

        var mapper = AutoMapper.Mapper.Map<List<Student>, List<StudentViewModel>>(query);

        return mapper;
    }
Run Code Online (Sandbox Code Playgroud)

返回相同的结果,但实际上放置自动播放器设置的最佳位置是什么?使用.ProjectTo()以避免使用AutoMapper.Mapper.Map会更好吗?

小智 13

思考它的一个简单方法是改变模型.

  • 存储库将数据库实体转换为业务模型.
  • 控制器将业务模型转换为视图模型.
  • 视图将视图模型转换为html.

在这种情况下,您将映射到视图模型.这是控制器的可靠性.因此,逻辑上的选择是在控制器代码中进行映射.

另一种思考方式.存储库的另一个用户可以使用相同的模型,但可以使用不同的模型.例如,将其转换为JSON对象以在REST API中使用.在这种情况下,需要不同的映射.此映射不属于存储库,而是属于存储库的用户.