using AutoMapper;
using AutoMapper.Internal;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq.Expressions;
using YLErp.Model;
using AutoMapperExtensions = AutoMapper.QueryableExtensions.Extensions;
namespace YLErp
{
///
///
///
public static class YLAutoMapper
{
static readonly IMapper _mapper;
public static readonly MapperConfiguration Config;
static YLAutoMapper()
{
//这里应该只配置不同类型之间的相互映射
//对于automapper映射配置,相同类型不需要做map,使用clone方式就可以
Config = new MapperConfiguration(cfg =>
{
cfg.Internal().ForAllMaps((t, x) =>
{
x.IgnoreAllPropertiesWithAnInaccessibleSetter();
});
MapTradeDto(cfg);
cfg.CreateMap().ForMember(dest => dest.id, opt => opt.Ignore());
cfg.CreateMap();
cfg.CreateMap();
cfg.CreateMap();
cfg.CreateMap();
cfg.CreateMap().IgnoreNotMapped();
cfg.CreateMap().IgnoreNotMapped();
cfg.CreateMap().IgnoreNotMapped();
cfg.CreateMap().IgnoreNotMapped();
cfg.CreateMap().IgnoreNotMapped();
});
_mapper = Config.CreateMapper();
}
//转为交易数据转换分出来一个配置方法
private static void MapTradeDto(IMapperConfigurationExpression cfg)
{
cfg.CreateMap();
//所有基于OtcTradeBase的继承类可以相互映射
cfg.CreateMap();
//返回Extend映射到Full
IMappingExpression MapFullToExtend() where TExtend : TradeExtendBase
{
return cfg.CreateMap()
.ForMember(dest => dest.id, opt => opt.Ignore())
.ForMember(dest => dest.TradeId, opt => opt.MapFrom(src => src.id));
}
//返回Extend映射到Full
IMappingExpression MapExtendToFull() where TExtend : TradeExtendBase
{
return cfg.CreateMap()
.ForMember(dest => dest.id, opt => opt.Ignore())
.ForMember(dest => dest.OptId, opt => opt.Ignore())
.ForMember(dest => dest.OptName, opt => opt.Ignore())
.ForMember(dest => dest.OptDate, opt => opt.Ignore());
}
//亚式期权
MapFullToExtend();
MapExtendToFull();
//障碍期权
MapFullToExtend()
.ForMember(dest => dest.Discrete, opt => opt.MapFrom(src => src.MonitorType))
.ForMember(dest => dest.BarrierPrice, opt => opt.MapFrom(src => src.BarrierLow))
.ForMember(dest => dest.UpperBarrierPrice, opt => opt.MapFrom(src => src.BarrierHigh));
MapExtendToFull()
.ForMember(dest => dest.BarrierLow, opt => opt.MapFrom(src => src.BarrierPrice))
.ForMember(dest => dest.BarrierHigh, opt => opt.MapFrom(src => src.UpperBarrierPrice))
.ForMember(dest => dest.MonitorType, opt => opt.MapFrom(src => src.Discrete));
//双鲨期权
MapFullToExtend()
.ForMember(dest => dest.Discrete, opt => opt.MapFrom(src => src.MonitorType));
MapExtendToFull()
.ForMember(dest => dest.MonitorType, opt => opt.MapFrom(src => src.Discrete));
//二元期权
MapFullToExtend()
.ForMember(dest => dest.UpperBarrier, opt => opt.MapFrom(src => src.BarrierHigh));
MapExtendToFull()
.ForMember(dest => dest.BarrierHigh, opt => opt.MapFrom(src => src.UpperBarrier));
//区间累积期权
MapFullToExtend();
MapExtendToFull();
//气囊结构
MapFullToExtend()
.ForMember(dest => dest.Barrier, opt => opt.MapFrom(src => src.BarrierLow));
MapExtendToFull()
.ForMember(dest => dest.BarrierLow, opt => opt.MapFrom(src => src.Barrier));
//收益增强结构
MapFullToExtend();
MapExtendToFull();
//凤凰期权
MapFullToExtend();
MapExtendToFull();
//雪球期权
MapFullToExtend()
.ForMember(dest => dest.SpreadStrikeAtMaturity, opt => opt.MapFrom(src => src.SpreadStrike))
.ForMember(dest => dest.SpreadStrikeAtMaturity1, opt => opt.MapFrom(src => src.SpreadStrike1));
MapExtendToFull()
.ForMember(dest => dest.SpreadStrike, opt => opt.MapFrom(src => src.SpreadStrikeAtMaturity))
.ForMember(dest => dest.SpreadStrike1, opt => opt.MapFrom(src => src.SpreadStrikeAtMaturity1));
//累计期权
MapFullToExtend();
MapExtendToFull();
//现金流交易
MapFullToExtend()
.ForMember(dest => dest.ProfitDayCount, opt => opt.MapFrom(src => src.CouponDayCount));
MapExtendToFull()
.ForMember(dest => dest.CouponDayCount, opt => opt.MapFrom(src => src.ProfitDayCount));
//累计期权
MapFullToExtend();
MapExtendToFull();
//累计期权
MapFullToExtend();
MapExtendToFull();
//远期交易
cfg.CreateMap()
.ForMember(dest => dest.id, opt => opt.Ignore())
.ForMember(dest => dest.TradeId, opt => opt.MapFrom(src => src.id));
cfg.CreateMap()
.ForMember(dest => dest.id, opt => opt.Ignore())
.ForMember(dest => dest.OptId, opt => opt.Ignore())
.ForMember(dest => dest.OptName, opt => opt.Ignore())
.ForMember(dest => dest.OptDate, opt => opt.Ignore());
}
public static void Initialize()
{
//不需要任何代码
}
///
///
///
public static TDestination Map(object source)
{
return _mapper.Map(source);
}
///
/// 从source映射字段到destination
///
public static void Map(TClass source, TClass destination)
{
_mapper.Map(source, destination);
}
///
/// 从source映射字段到destination
///
public static void Map(TSource source, TDestination destination)
{
_mapper.Map(source, destination);
}
///
/// AutoMapper数据查询对象转换
///
public static IQueryable ProjectTo(this IQueryable source, object parameters, params Expression>[] membersToExpand)
{
return AutoMapperExtensions.ProjectTo(source, Config, parameters, membersToExpand);
}
///
/// AutoMapper数据查询对象转换
///
public static IQueryable ProjectTo(this IQueryable source, params Expression>[] membersToExpand)
{
return AutoMapperExtensions.ProjectTo(source, Config, membersToExpand);
}
///
/// AutoMapper数据查询对象转换
///
public static IQueryable ProjectTo(this IQueryable source, IDictionary parameters, params string[] membersToExpand)
{
return AutoMapperExtensions.ProjectTo(source, Config, parameters, membersToExpand);
}
//从实体模型映射到DTO时忽略NotMapped属性,不然调用ProjectTo从数据库取数据时报错
public static IMappingExpression IgnoreNotMapped(
this IMappingExpression expression)
{
var sourceType = typeof(TSource);
foreach (var property in sourceType.GetProperties())
{
var descriptor = TypeDescriptor.GetProperties(sourceType)[property.Name];
var attribute = (NotMappedAttribute)descriptor.Attributes[typeof(NotMappedAttribute)];
if (attribute != null)
{
expression.ForMember(property.Name, opt => opt.Ignore());
}
}
return expression;
}
}
}