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

How to use Mapper.Map with ConstructUsing and 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.MapAfterMap 方法 .AfterMap((s, d) => Mapper.Map(s.CompanyProfile, d));

但我无法在 ConstructUsing.

中执行相同的操作

有什么建议吗?

大卫

由于您已经为这些实体定义了映射,因此您可以对其调用 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<>