using AutoMapper;
using AutoMapper.Internal;
using System;
using System.Linq;
using System.Reflection;
namespace Kean.Application.Utilities
{
///
/// 模型映射配置
///
public class AutoMapper : Profile
{
///
/// 初始化 Kean.Application.Utilities.AutoMapper 类的新实例
///
public AutoMapper()
{
/* 这是一个例子:
* 只需在 ViewModels 文件夹下创建视图模型,配置与数据表实体的映射即可
* 注意:在最后 ReverseMap(),确保双向映射处理读写能力
*
* CreateMap()
* .ForMember(entity => entity.TEST_ID, options => options.MapFrom(viewmodel => viewmodel.Id))
* .ForMember(entity => entity.TEST_NAME, options => options.MapFrom(viewmodel => viewmodel.Name))
* .ReverseMap();
*/
}
}
///
/// AutoMapper 扩展方法
///
internal static class AutoMapperExtension
{
///
/// 获取映射配置
///
/// 映射
/// ViewModel 类型名
/// 映射配置
internal static TypeMap GetMap(this IMapper mapper, string type)
{
var assembly = Assembly.GetExecutingAssembly();
var viewModelType = assembly.GetType($"{assembly.FullName.Split(',')[0]}.ViewModels.{type}", false, true);
if (viewModelType == null)
{
throw new TypeLoadException("ViewModel 不存在。");
}
var map = mapper.ConfigurationProvider.Internal().GetAllTypeMaps()
.FirstOrDefault(m => m.SourceType == viewModelType);
if (map == null)
{
throw new AutoMapperMappingException("未配置 ViewModel 与 Entity 之间的映射。");
}
return map;
}
}
}