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

时间:2016-12-29 12:02:35

标签: entity-framework asp.net-core automapper

使用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

2 个答案:

答案 0 :(得分:13)

一种简单的思考方式,就是模型的转换。

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

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

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

答案 1 :(得分:1)

根据Mosh Hamedani

<块引用>

映射不是存储库的责任。这是 您的控制者的责任。您的存储库应该返回 域对象和存储库的客户端可以决定它是否 需要做映射。通过将域对象映射到视图模型 (或其他东西)在存储库中,您可以阻止客户端 您的存储库无法访问底层域对象

因此,对于 API 控制器而言,在控制器中包含映射器更有意义