我计划将Automapper与ASP.NET MVC解决方案和Unity DI一起使用.在
automapper上发布的关于如何使用的视频非常陈旧,并没有显示映射器如何与依赖注入一起使用. stackoverflow上的大多数示例也使用Mapper.CreateMap()方法,现在不推荐使用它.
自动化指南说
Once you have your types you can create a map for the two types using
a MapperConfiguration instance and CreateMap. You only need one
MapperConfiguration instance typically per AppDomain and should be
instantiated during startup.
var config = new MapperConfiguration(cfg => cfg.CreateMap<Order,OrderDto>());
所以我假设上面的代码行将进入应用程序启动,如global.asax
要执行映射,请使用CreateMapper方法创建IMapper.
var mapper = config.CreateMapper(); OrderDto dto = mapper.Map<OrderDto>(order);
以上行将进入控制器.但是我不明白这个配置变量来自哪里?我如何在控制器中注入IMapper?
解决方法
首先,创建一个MapperConfiguration,并从中创建一个IMapper,它具有如下所有类型的配置:
var config = new MapperConfiguration(cfg => { //Create all maps here cfg.CreateMap<Order,OrderDto>(); cfg.CreateMap<MyHappyEntity,MyHappyEntityDto>(); //... }); IMapper mapper = config.CreateMapper();
然后,使用统一容器注册映射器实例,如下所示:
container.RegisterInstance(mapper);
然后,任何希望使用映射器的控制器(或服务)都可以在构造函数中声明这样的依赖关系,如下所示:
public class MyHappyController { private readonly IMapper mapper; public MyHappyController(IMapper mapper) { this.mapper = mapper; } //Use the mapper field in your methods }
假设您使用MVC框架正确设置容器,控制器应该可以构造而不会出现问题.