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

时间:2016-01-15 19:24:59

标签: c# .net 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()
                                                    ));

我知道我们可以将Mapper.Map与AfterMap方法一起使用,例如.AfterMap((s, d) => Mapper.Map(s.CompanyProfile, d));

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

有什么建议吗?

大卫

1 个答案:

答案 0 :(得分:8)

由于您为这些实体定义了映射,因此可以在其上调用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);
                            });

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

var viewModel = Mapper.Map<List<SKUViewModel>>(sku);

ConstructUsingAfterMapBeforeMap等方法是在您完成所有内容后执行的方法。因此,遵循这个逻辑,它应该没有问题地执行Mapper.Map<>