如何将 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.Map
和 AfterMap
方法 .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);
像ConstructUsing
、AfterMap
、BeforeMap
这样的方法是在定义完所有内容后执行的方法。因此,按照这个逻辑,它应该可以毫无问题地执行 Mapper.Map<>
。
我有一个简单的问题:如何在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
.
有什么建议吗?
大卫
由于您已经为这些实体定义了映射,因此您可以对其调用 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<>
。