【问题标题】:How to use Automapper with unity dependancy injection?如何将 Automapper 与统一依赖注入一起使用?
【发布时间】:2016-05-04 21:12:02
【问题描述】:

我计划将 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?

【问题讨论】:

  • 您应该将容器配置为在IMapper 和映射器实例之间进行映射。然后你应该从控制器声明对IMapper的依赖(通过在构造函数中接受IMapper)。
  • 有什么例子吗?那么我需要映射的每个实体都会有“新的 MapperConfiguration()”吗?例子真的很有帮助

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


【解决方案1】:

首先,创建一个 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 框架正确设置了容器,控制器应该可以毫无问题地构建。

【讨论】:

  • 谢谢。你的指导很有帮助。由于 Unity 实现方式的现有配置,我只需添加它,我必须注册为这样的 Container.Register(Lifetime.Singleton);
  • 谢谢你。这完美地工作。但是,我正在尝试将 AutoMapper 用作 Property Injected 属性,因此这不起作用。你知道我怎样才能让它发挥作用吗?
  • @Cubelaster,您是否尝试将 IMapper 作为属性注入?如果您的 DI 容器支持属性注入并且您正确使用它,它应该可以工作。
  • @Cubelaster,你用的是什么 DI 容器?对了,为什么要使用属性注入而不是构造函数注入?
  • @Cubelaster,我已经很久没有使用 DI 容器了。你看到这个了吗? stackoverflow.com/questions/10267536/…
猜你喜欢
  • 2018-02-22
  • 1970-01-01
  • 1970-01-01
  • 2021-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-25
  • 1970-01-01
相关资源
最近更新 更多