Значение карты из пары ключ-значение с использованием автоматического преобразователя - PullRequest
0 голосов
/ 02 марта 2019

Прошу прощения за непонятность в названии вопроса.Я попытаюсь объяснить простыми словами:

Я создаю экземпляр Mapper внутри моей функции с указанным отображением:

//omitted rest of the mapping to make the code simpler 
private TRADELINE MapTradeLine(Tradeline tradeLine, TradelineMeta tradelineMeta)
{
    MapperConfiguration configMapTradeline = new MapperConfiguration(
     cfg =>
     {
         cfg.CreateMap<Tradeline, TRADELINE>()       
         .ForPath(dest => dest.TLSOURCE, opt => opt.MapFrom(src => src.Source))              
         .ForPath(dest => dest.REQID, opt => opt.MapFrom(src => tradelineMeta.RequestId))        
     });
    IMapper mapperTradeline = configMapTradeline.CreateMapper();    
    return mapperTradeline.Map<Tradeline, TRADELINE>(tradeLine);
}

Это работает нормально.Хотя хотелось бы переместить этот код в Profile

Примерно так:

public class MappingProfile : Profile
{
    public MappingProfile()
    {
        .CreateMap<Tradeline, TRADELINE>()       
         .ForPath(dest => dest.TLSOURCE, opt => opt.MapFrom(src => src.Source))              
         .ForPath(dest => dest.REQID, opt => opt.MapFrom(src => tradelineMeta.RequestId));
    }
}

public static class MappingHelper
{
    private static readonly Lazy<IMapper> Lazy = new Lazy<IMapper>(() =>
    {
        var config = new MapperConfiguration(cfg =>
        {
            cfg.ShouldMapProperty = p => p.GetMethod.IsPublic || p.GetMethod.IsAssembly;
            cfg.AddProfile<MappingProfile>();
        });
        var mapper = config.CreateMapper();
        return mapper;
    });

    public static IMapper Mapper => Lazy.Value;
}

После этого я могу использовать экземпляр IMapper для выполнения сопоставления.Моя цель - избежать инициализации AutoMapper для каждого вызова метода.

Я застрял на том, как указать tradelineMeta.RequestId, если я использую подход Profile.

Возможно ли это?

1 Ответ

0 голосов
/ 03 марта 2019

Как упомянуто в ссылке , предоставленной @Lucian Bargaoanu и на этот вопрос, мне удалось выяснить:

public class MappingProfile : Profile
{
    public MappingProfile()
    {
        .CreateMap<Tradeline, TRADELINE>()       
         .ForPath(dest => dest.TLSOURCE, opt => opt.MapFrom(src => src.Source))                       
         .ForMember(dest => dest.REQID, opt => opt.MapFrom((src, dest, destMember, context) => context.Items["REQID"]))
    }
}

Использование:

return MappingHelper.Mapper.Map<Tradeline, TRADELINE>(tradeLine, opt =>
     {                 
         opt.Items["REQID"] = tradelineMeta.RequestId;                 
     });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...