使用 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
用于配置和生命周期管理的类。总之,您要采用的更改将是:
去除IConfigurationProvider
容器构建中的相关布线(在MappingModule
).
-
切换你的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>();
-
添加Profile
to the Mapper
(也许在MappingModule
?),并通过进行任何其他配置Mapper
:
Mapper.AddProfile(new MappingProfile());
Binding IMappingEngine
在ninject容器中Mapper.Engine
财产。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)