在自定义映射中调用 IMappingEngine.Map

2024-02-05

使用 AutoMapper,当使用 ConvertUsing 为容器类型定义自定义映射时,我经常需要在映射函数内调用 IMappingEngine.Map。这是必要的,因为它允许我重用子映射的定义。

CreateMap<Order, OrderModel>()
    .ConvertUsing(o => new OrderModel(
        o.Id,
        o.ShippingAddress,
        mapper.Map<IList<OrderItemModel>>(o.Items)
    ));

为了做到这一点,我需要对 IMappingEngine 的引用。配置映射引擎时,我没有可以在 ConvertUsing 参数中捕获的对它的引用。一个简单的解决方案是在某处对其进行静态引用,但我想避免它。

有没有办法在使用 ConvertUsing 的映射中获取对当前 IMappingEngine 的引用?


这个答案是基于你的原始修订版 https://stackoverflow.com/revisions/9282819/1其中包括附加代码

如果你看一下吉米·博加德 (Jimmy Bogard) 的文章自动映射器和 IOC http://lostechies.com/jimmybogard/2009/05/12/automapper-and-ioc/他指出以下几点:

MappingEngine 与我们的 Configuration 对象不同,不需要任何 特殊的缓存/生命周期行为。 MappingEngine 非常 轻量级,因为它确实是一堆有趣的方法 与配置有关的事情。如果我们愿意,MappingEngine 可以是单例的, 但没有必要。

(有最新版本 Automapper 的更新示例 IOC 代码github https://github.com/AutoMapper/AutoMapper/blob/master/src/AutoMapperSamples/InversionOfControl.cs)

只要你的ConfigurationStore是一个单例并且请求IConfiguration and IConfigurationProvider从您的 DI 容器解析到此单例实例,本文(和代码示例)主张可以创建该单例的新实例MappingEngine注射时。

根据上述情况,除了不注册您的ConfigurationStore作为一个单例实例(我假设,我不熟悉 ninject)并且不将此实例绑定到IConfiguration你的最终实施MappingProfile在您最初的修订版中实际上是一个可以接受的解决方案。不一样也没关系MappingEngine实例。

但是,根据您问题中的示例用法,可能值得考虑场景2在文章中。如果您不需要在整个应用程序中注入配置,而只需要IMappingEngine,那么你可以依靠静态Mapper用于配置和生命周期管理的类。总之,您要采用的更改将是:

  1. 去除IConfigurationProvider容器构建中的相关布线(在MappingModule).

  2. 切换你的MappingProfile使用静态Mapper class

    CreateMap<Order, OrderModel>()
        .ConvertUsing(o => new OrderModel(
            o.Id,
            o.ShippingAddress,
            Mapper.Map<IList<OrderItemModel>>(o.Items) //use static Mapper class
    ));
    
    CreateMap<OrderItem, OrderItemModel>();
    
  3. 添加Profile to the Mapper(也许在MappingModule?),并通过进行任何其他配置Mapper:

    Mapper.AddProfile(new MappingProfile());
    
  4. Binding IMappingEngine在ninject容器中Mapper.Engine财产。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在自定义映射中调用 IMappingEngine.Map 的相关文章

随机推荐