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; } } }