具有新的多语言映射的投影或自定义值解析器
Projection or Custom Value Resolvers with new Multi Lingual Mappings
我正在使用最新版本的 ASP.Net Boilerplate(版本 3.7.2)。我目前正在使用新的多语言实体。
我在将 1 个实体自动映射到 Dto 时遇到问题,因为它不仅需要多语言方面,还需要 Projection/Custom 属性之一的解析器。
到目前为止,所有映射都正常工作。我遵循了 ASP.NET Boilerplate Documentation
中的文档
[Table("CategoryItems")]
public class CategoryItem : BaseClass, IMultiLingualEntity<CategoryItemTranslation>
{
/// <summary>
/// Gets or Sets the Category Item Display Order
/// </summary>
public int DisplayOrder { get; set; }
/// <summary>
/// Gets or Sets Catalog Categories
/// </summary>
public virtual ICollection<CatalogItem> CatalogItems { get; set; } = new HashSet<CatalogItem>();
...
/// <summary>
/// Gets or Sets all the Entity Translations
/// </summary>
public virtual ICollection<CategoryItemTranslation> Translations { get; set; } = new HashSet<CategoryItemTranslation>();
}
[Table("CategoryItemTranslations")]
public class CategoryItemTranslation : IEntityTranslation<CategoryItem>
{
/// <summary>
/// Get or Set Category Item Name
/// </summary>
public string CategoryItemName { get; set; }
/// <summary>
/// Gets or Sets Link to Category Item
/// </summary>
public CategoryItem Core { get; set; }
/// <summary>
/// Gets or Sets Link to Core Id
/// </summary>
public int CoreId { get; set; }
/// <summary>
/// Gets or Sets the Language
/// </summary>
public string Language { get; set; }
}
public class ReadCategoryItemFilterDto : PhantomEntityDto
{
public string CategoryItemName { get; set; }
...
public int ItemCount { get; set; }
...
}
在 ApplicationModule 的初始化中使用创建多语言地图代码 class:
cfg.CreateMultiLingualMap<CategoryItem, CategoryItemTranslation, ReadCategoryItemFilterDto>(new MultiLingualMapContext(IocManager.Resolve<ISettingManager>()));
翻译实体中的 CategoryItemName 正确映射到 ReadCategoryItemFilterDto 上的 CategoryItemName。
现在我需要将 CatalogItems 计数映射到 Dto 上的 ItemCount。
我尝试添加到映射配置器:
cfg.CreateMap<CategoryItem, ReadCategoryItemFilterDto>()
.ForMember(dest => dest.ItemCount, opts => opts.MapFrom(src => src.CatalogItems.Count));
和
cfg.CreateMap<CategoryItem, ReadCategoryItemFilterDto>()
.ForMember(dest => dest.ItemCount, opts => opts.ResolveUsing(new CatalogItemFilterCountResolver()));
使用
public class CatalogItemFilterCountResolver : IValueResolver<CategoryItem, ReadCategoryItemFilterDto, int>
{
public int Resolve(CategoryItem source, ReadCategoryItemFilterDto destination, int m, ResolutionContext context)
{
return source.CatalogItems.Count;
}
}
如果我在 CreateMultiLingualMap 之前添加此地图,则 CatalogItemName 映射正确但 ItemCount 失败。
如果我将投影或解析器放在 CreateMultiLingualMap 之后,则 ItemCount 映射正确但 CatalogItemName 映射失败。
如何创建地图配置文件以允许映射这两个属性?
谢谢。
对于您的情况,您不需要使用扩展程序 CreateMultiLingualMap
。
您可以创建自己的包含多语言映射的映射定义。
原来是这样;
configuration.CreateMap<CategoryItem, ReadCategoryItemFilterDto>()
.BeforeMap((source, destination, context) =>
{
var translation = source.Translations.FirstOrDefault(pt => pt.Language == CultureInfo.CurrentUICulture.Name);
if (translation != null)
{
context.Mapper.Map(translation, destination);
return;
}
var multiLingualMapContext = new MultiLingualMapContext(IocManager.Instance.Resolve<ISettingManager>());
var defaultLanguage = multiLingualMapContext.SettingManager.GetSettingValue(LocalizationSettingNames.DefaultLanguage);
translation = source.Translations.FirstOrDefault(pt => pt.Language == defaultLanguage);
if (translation != null)
{
context.Mapper.Map(translation, destination);
return;
}
translation = source.Translations.FirstOrDefault();
if (translation != null)
{
context.Mapper.Map(translation, destination);
}
}).ForMember(dest => dest.ItemCount, opts => opts.MapFrom(src => src.CatalogItems.Count));
https://aspnetboilerplate.com/Pages/Documents/Multi-Lingual-Entities#createmultilingualmap
configuration.CreateMultiLingualMap<CategoryItem, CategoryItemTranslation, ReadCategoryItemFilterDto>(context)
.EntityMap.ForMember(dest => dest.ItemCount, opt => opt.MapFrom(src => src.CatalogItems.Count));
我正在使用最新版本的 ASP.Net Boilerplate(版本 3.7.2)。我目前正在使用新的多语言实体。
我在将 1 个实体自动映射到 Dto 时遇到问题,因为它不仅需要多语言方面,还需要 Projection/Custom 属性之一的解析器。
到目前为止,所有映射都正常工作。我遵循了 ASP.NET Boilerplate Documentation
中的文档[Table("CategoryItems")]
public class CategoryItem : BaseClass, IMultiLingualEntity<CategoryItemTranslation>
{
/// <summary>
/// Gets or Sets the Category Item Display Order
/// </summary>
public int DisplayOrder { get; set; }
/// <summary>
/// Gets or Sets Catalog Categories
/// </summary>
public virtual ICollection<CatalogItem> CatalogItems { get; set; } = new HashSet<CatalogItem>();
...
/// <summary>
/// Gets or Sets all the Entity Translations
/// </summary>
public virtual ICollection<CategoryItemTranslation> Translations { get; set; } = new HashSet<CategoryItemTranslation>();
}
[Table("CategoryItemTranslations")]
public class CategoryItemTranslation : IEntityTranslation<CategoryItem>
{
/// <summary>
/// Get or Set Category Item Name
/// </summary>
public string CategoryItemName { get; set; }
/// <summary>
/// Gets or Sets Link to Category Item
/// </summary>
public CategoryItem Core { get; set; }
/// <summary>
/// Gets or Sets Link to Core Id
/// </summary>
public int CoreId { get; set; }
/// <summary>
/// Gets or Sets the Language
/// </summary>
public string Language { get; set; }
}
public class ReadCategoryItemFilterDto : PhantomEntityDto
{
public string CategoryItemName { get; set; }
...
public int ItemCount { get; set; }
...
}
在 ApplicationModule 的初始化中使用创建多语言地图代码 class:
cfg.CreateMultiLingualMap<CategoryItem, CategoryItemTranslation, ReadCategoryItemFilterDto>(new MultiLingualMapContext(IocManager.Resolve<ISettingManager>()));
翻译实体中的 CategoryItemName 正确映射到 ReadCategoryItemFilterDto 上的 CategoryItemName。
现在我需要将 CatalogItems 计数映射到 Dto 上的 ItemCount。
我尝试添加到映射配置器:
cfg.CreateMap<CategoryItem, ReadCategoryItemFilterDto>()
.ForMember(dest => dest.ItemCount, opts => opts.MapFrom(src => src.CatalogItems.Count));
和
cfg.CreateMap<CategoryItem, ReadCategoryItemFilterDto>()
.ForMember(dest => dest.ItemCount, opts => opts.ResolveUsing(new CatalogItemFilterCountResolver()));
使用
public class CatalogItemFilterCountResolver : IValueResolver<CategoryItem, ReadCategoryItemFilterDto, int>
{
public int Resolve(CategoryItem source, ReadCategoryItemFilterDto destination, int m, ResolutionContext context)
{
return source.CatalogItems.Count;
}
}
如果我在 CreateMultiLingualMap 之前添加此地图,则 CatalogItemName 映射正确但 ItemCount 失败。 如果我将投影或解析器放在 CreateMultiLingualMap 之后,则 ItemCount 映射正确但 CatalogItemName 映射失败。
如何创建地图配置文件以允许映射这两个属性?
谢谢。
对于您的情况,您不需要使用扩展程序 CreateMultiLingualMap
。
您可以创建自己的包含多语言映射的映射定义。
原来是这样;
configuration.CreateMap<CategoryItem, ReadCategoryItemFilterDto>()
.BeforeMap((source, destination, context) =>
{
var translation = source.Translations.FirstOrDefault(pt => pt.Language == CultureInfo.CurrentUICulture.Name);
if (translation != null)
{
context.Mapper.Map(translation, destination);
return;
}
var multiLingualMapContext = new MultiLingualMapContext(IocManager.Instance.Resolve<ISettingManager>());
var defaultLanguage = multiLingualMapContext.SettingManager.GetSettingValue(LocalizationSettingNames.DefaultLanguage);
translation = source.Translations.FirstOrDefault(pt => pt.Language == defaultLanguage);
if (translation != null)
{
context.Mapper.Map(translation, destination);
return;
}
translation = source.Translations.FirstOrDefault();
if (translation != null)
{
context.Mapper.Map(translation, destination);
}
}).ForMember(dest => dest.ItemCount, opts => opts.MapFrom(src => src.CatalogItems.Count));
https://aspnetboilerplate.com/Pages/Documents/Multi-Lingual-Entities#createmultilingualmap
configuration.CreateMultiLingualMap<CategoryItem, CategoryItemTranslation, ReadCategoryItemFilterDto>(context)
.EntityMap.ForMember(dest => dest.ItemCount, opt => opt.MapFrom(src => src.CatalogItems.Count));