Карта AutoMapper Словарь с помощью внедренного сервиса - PullRequest
0 голосов
/ 28 января 2019

Мне нужно что-то вроде этого:

    public myMappingProfile(IInjectableService myInjectableService)
    {
        CreateMap<Source, Destination>()
            .ForMember(dest => dest.DestinationDictionary, opt => opt.MapFrom(src =>
            {
                var dict = new Dictionary<myEnum, string>();
                foreach (var item in src.SourceDictionary)
                {
                    dict.Add(item.Key, myInjectableService.BuildUrl(item.Value));
                }
                return dict;
            }));

Зависимость Внедрение службы работает нормально.Но Visual Studio показывает следующее сообщение об ошибке:

Лямбда-выражение с телом оператора не может быть преобразовано в дерево выражений

Затем я изменил тип назначения со словаря наList> и пытался использовать метод AfterMap:

           .ForMember(dest => dest.DestinationListOfKeyValuePair, opt => opt
           .MapFrom(src => src.SourceDictionary))
           .AfterMap((src, dest) => dest.DestinationListOfKeyValuePair
           .ForEach(ti => ti.Value = myInjectableService.BuildUrl(ti.Value)));

Но Visual Studio жалуется:

Свойство или индексатор не могут быть назначены - оно доступно только для чтения

Следующей попыткой был CustomResolver:

.ForMember(dest => dest.TenantImages, opt => opt.MapFrom<CustomResolver>())

открытый класс CustomResolver: IValueResolver >> {private readonly IInjectableService _myInjectableService;

    public CustomResolver(IInjectableService myInjectableService)
    {
        _myInjectableService = myInjectableService;
    }

    public List<KeyValuePair<MyEnum, string>> Resolve(
        Source source,
        Destination destination,
        List<KeyValuePair<MyEnum, string>> destMember,
        ResolutionContext context)
    {
        destMember = new List<KeyValuePair<MyEnum, string>>();
        foreach (var entry in source.SourceDictionary)
        {
            destMember.Add(new KeyValuePair<myEnum, string>(entry.Key, _myInjectableService.BuildUrl(entry.Value)));
        }
        return destMember;
    }
}

Но выдается следующее исключение:

System.MissingMethodException: для этого объекта не определен конструктор без параметров.

Я не знаю, как поместить IInjectableService в CustomResolver.

Anyидеи как решить эту проблему?Спасибо.

1 Ответ

0 голосов
/ 28 января 2019

Я думаю, что вы должны использовать .ConvertUsing():

    // Add this mapping, if the name of the property in source and destination type differ.
    CreateMap<Source, Destination>()
        .ForMember(dest => dest.DestinationDictionary, opt => opt.MapFrom(src => src.SourceDictionary));

    // Add this mapping to create an instance of the dictionary, filled by the values from the source dictionary.
    CreateMap</*type of source dictionary*/, Dictionary<myEnum, string>>()
        .ConvertUsing(src =>
        {
            var dict = new Dictionary<myEnum, string>();
            foreach (var item in src)
            {
                dict.Add(item.Key, myInjectableService.BuildUrl(item.Value));
            }
            return dict;
        }));

Кроме того, вы можете перенести создание словаря на один вкладыш LINQ:

src.ToDictionary(item => item.Key, item => myInjectableService.BuildUrl(item.Value));
...