我有一个简单的问题:如何在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中做同样的事情。
有什么建议吗?
大卫
答案 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);
ConstructUsing
,AfterMap
,BeforeMap
等方法是在您完成所有内容后执行的方法。因此,遵循这个逻辑,它应该没有问题地执行Mapper.Map<>
。