如何使用Automapper进行统一依赖注入?

时间:2016-05-04 21:12:02

标签: asp.net-mvc dependency-injection inversion-of-control automapper

我打算将Automapper与ASP.NET MVC解决方案和Unity DI结合使用。在automapper上发布的有关如何使用的视频非常陈旧,并未显示映射器如何与依赖注入一起使用。 stackoverflow上的大多数示例也使用Mapper.CreateMap()方法,现在不推荐使用它。

自动导航指南说

  

获得类型后,您可以使用以下两种类型创建地图   MapperConfiguration实例和CreateMap。你只需要一个   MapperConfiguration实例通常是每个AppDomain,应该是   在启动期间实例化。

 var config = new MapperConfiguration(cfg => cfg.CreateMap<Order, OrderDto>());

所以我假设上面的代码行将进入应用程序启动,如global.asax

要执行映射,请使用CreateMapper方法创建IMapper。

 var mapper = config.CreateMapper();
 OrderDto dto = mapper.Map<OrderDto>(order);

以上行将进入控制器。但是我不明白这个config变量来自哪里?我如何在控制器中注入IMapper?

1 个答案:

答案 0 :(得分:13)

首先,创建一个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
}

然后,任何希望使用映射器的控制器(或服务)都可以在构造函数中声明这样的依赖关系,如下所示:

Size

假设您使用MVC框架正确设置容器,控制器应该可以构造而不会出现问题。