如何将Mapper.Map与ConstructUsing和AutoMapper一起使用?

Dav*_*eau 6 .net c# automapper

我有一个简单的问题:如何在ConstructUsing中使用Mapper.Map?我正在使用AutoMapper v4.1.1,我有这个代码,我想通过重用代码来清理它.

            Mapper.CreateMap<SKU, SKUViewModel>()
                .ConstructUsing(m => new SKUViewModel((from texts in m.DescriptionTranslation.TranslationTexts
                                                       select new TranslationTuple
                                                       {
                                                           LanguageId = texts.LanguageId,
                                                           LanguageDisplayName = texts.Language.DisplayName,
                                                           TranslationText = texts.Text,
                                                           NeutralText = texts.NeutralText,
                                                           ThreeLetterIsoLanguageName = texts.Language.ThreeLetterISOLanguageName
                                                       }).ToList(),
                                                    (from texts in m.DisplayNameTranslation.TranslationTexts
                                                     select new TranslationTuple
                                                     {
                                                         LanguageId = texts.LanguageId,
                                                         LanguageDisplayName = texts.Language.DisplayName,
                                                         TranslationText = texts.Text,
                                                         NeutralText = texts.NeutralText,
                                                         ThreeLetterIsoLanguageName = texts.Language.ThreeLetterISOLanguageName
                                                     }).ToList(),
                                                    (from texts in m.PaypalDescriptionTranslation.TranslationTexts
                                                     select new TranslationTuple
                                                     {
                                                         LanguageId = texts.LanguageId,
                                                         LanguageDisplayName = texts.Language.DisplayName,
                                                         TranslationText = texts.Text,
                                                         NeutralText = texts.NeutralText,
                                                         ThreeLetterIsoLanguageName = texts.Language.ThreeLetterISOLanguageName
                                                     }).ToList()
                                                    ));
Run Code Online (Sandbox Code Playgroud)

我知道我们可以像这样使用Mapper.Map和AfterMap方法 Mapper.Map

但是我无法在ConstructUsing中做同样的事情.

有什么建议吗?

大卫

Fel*_*ani 9

由于您为这些实体定义了映射,因此可以在其上调用Mapper.Map.样品:

Mapper.CreateMap<SKU, SKUViewModel>()
                .ConstructUsing(m => 
                            {
                                var descriptions = Mapper.Map<List<TranslationTuple>>(m.DescriptionTranslation.TranslationTexts);
                                var displays = Mapper.Map<List<TranslationTuple>>(m.DisplayNameTranslation.TranslationTexts);
                                var paypals = Mapper.Map<List<TranslationTuple>>(m.PaypalDescriptionTranslation.TranslationTexts);

                                return new SKUViewModel(descriptions, displays, paypals);
                            });
Run Code Online (Sandbox Code Playgroud)

然后,当您需要创建一个由automapper映射的对象时,只需使用:

var viewModel = Mapper.Map<List<SKUViewModel>>(sku);
Run Code Online (Sandbox Code Playgroud)

类似的方法ConstructUsing,AfterMap,BeforeMap是你拥有的一切定义之后执行的方法.因此,遵循这个逻辑,它应该Mapper.Map<>没有问题地执行.

  • 从Automapper的4.2版本开始,不推荐使用静态方法Mapper.Map().因此,您应该将ConsttructUsing()与ResolutionContext一起使用,并调用ResolutionContext.Engine.Map(). (12认同)
  • 我必须像 .ConstructUsing((s, c) =&gt; c.Mapper.Map&lt;Order, OrderViewModel&gt;(s.Order)) 这样的事情 (4认同)