Доступ к целевому свойству (не типу) при сопоставлении с помощью AutoMapper + Dependency Injection - PullRequest
0 голосов
/ 26 февраля 2019

Я нахожусь в довольно интересной ситуации, когда мне требуется, чтобы мой AutoMapper мог отображать объекты от типа TSource до TDestination со следующими ограничениями:

  1. Во время отображения мне нужнодоступ к службе, предоставляемой IServiceProvider (или, точнее, из инжектора зависимости).
  2. Моя функция отображения должна знать, какое свойство сопоставления находится в целевом объекте.Это означает, что мне не нужно знать, что свойство target имеет тип string, но это свойство называется Name или Address в сопоставленном типе.Причина этого заключается в том, что мне нужно иметь доступ к атрибутам этого свойства.

Первое ограничение может быть легко довольно просто неудобно с помощью пользовательского преобразователя или значенияконвертер.

public class MyValueResolver<TSource, TDestination> 
    : IValueResolver<TSource, TDestination, string>
{
    private readonly ISomeService _someService;

    public MyValueResolver(ISomeService someService)
    {
        _someService = someService;
    }

    public string Resolve(TSource source, TDestination destination, 
        string destMember, ResolutionContext context)
    {
        string result;

        // Perform some complex logic with _someService and attributes of
        // the target property...

        return result;
    }
}

Но я не могу понять, как узнать, какое свойство сопоставитель сопоставляет с целевым объектом.Есть ли способ получить эту информацию в методе Resolve(source, dest, member, context)?

Мы используем самую последнюю версию AutoMapper в ASP.NET Core.

1 Ответ

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

Я смог решить мою проблему, используя пользовательский IValueConverter вместо IValueResolver.Конвертер позволяет мне передавать некоторые данные во время отображения, где также можно передавать новые объекты с несколькими содержимыми:

public class MyValueConverter<TSource> : IValueConverter<KeyValuePair<TSource, MemberInfo>, string>
{
    private readonly ISomeService _someService;

    public MyValueConverter(ISomeService someService)
    {
        _someService = someService;
    }

    public string Convert(KeyValuePair<TSource, MemberInfo> data, ResolutionContext context)
    {
        var source = data.Key;
        var targetProperty = data.Value;

        string result;

        // Perform some complex logic with _someService and attributes of
        // the target property...

        return result;
    }
}

Для простоты я решил передать простую KeyValuePair в моем примере впользу пользовательского объекта, но оба работают.Метод может быть вызван с:

CreateMap<MyEntity, MyEntityViewModel>()
    .ForMember(dest => dest.Action, opts => 
        opts.ConvertUsing<MyValueConverter<TEntity>, KeyValuePair<TEntity, MemberInfo>>(src => 
            KeyValuePair.Create(src, opts.DestinationMember)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...