当前位置: 首页 > 编程语言 > C#

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

时间:2023-04-10 17:24:54 C#

在使用AutoMapper的自定义映射中调用IMappingEngine.Map,在使用ConvertUsing为容器类型定义自定义映射时,经常需要在映射函数.Map中调用IMappingEngine。这是必要的,因为它允许我重用子图的定义。CreateMap().ConvertUsing(o=>newOrderModel(o.Id,o.ShippingAddress,mapper.Map(o.Items)));为此,我需要引用IMappingEngine。配置映射引擎时,我没有可以在ConvertUsing参数中捕获的引用。一个简单的解决方案是在某处有一个静态引用,但我想避免它。有没有办法使用ConvertUsing在地图中获取对当前IMappingEngine的引用?此答案基于您的原始修订,其中包含附加代码如果您查看JimmyBogard关于Automapper和IOC的文章,他会注意到以下内容:与Configuration对象不同,MappingEngine不需要任何特殊的缓存/生命周期行为。MappingEngine非常轻量级,因为它实际上是一些与Configuration一起做有趣事情的方法。如果我们愿意,MappingEngine可以是一个单例,但它不是必须的。(在github上更新了最新版本的Automapper的示例IOC代码)只要您的ConfigurationStore是单例并且来自DI容器的IConfiguration和IConfigurationProvider请求解析为这个单例实例,本文(和代码示例)就提倡创建一个MappingEngine在注入时新建实例。综上所述,原始版本中MappingProfile的最终实现其实是一个可以接受的方案,除了没有将ConfigurationStore注册为单例实例(我猜的,我对ninject不熟悉)和没有绑定这个实例到IConfigurationMappingProfile。这可以是不同的MappingEngine实例。但是,根据您问题中的示例用法,可能值得考虑文章中的场景2。如果您不需要在整个应用程序中注入配置而只需要IMappingEngine,那么您可以依靠静态映射器类来进行配置和生命周期管理。总之,您对这种方法的更改是:在容器构建中删除与IConfigurationProvider相关的连接(在MappingModule中)。将MappingProfile切换为使用静态Mapper类CreateMap().ConvertUsing(o=>newOrderModel(o.Id,o.ShippingAddress,Mapper.Map>(o.Items)//使用静态Mapper类));创建地图();将Profile添加到Mapper(也许在MappingModule中?),并且任何其他配置都是通过Mapper完成的:Mapper.AddProfile(newMappingProfile());将ninject容器中的Mapper.Engine绑定到Mapper.Engine属性。您可以使用静态Mapper.Map>(o.Items)而不是IMappingEngine实例。它包含对在首次使用时延迟实例化的引擎的引用。以上就是C#学习教程:在自定义映射中调用IMappingEngine.Map。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: