AutoMapper выдает ошибку при отображении из 2 источников в место назначения, используя customResolver - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть два источника, таких как

public class Source1 
{
    public int Id {get;set;}
    public int Source2ID { get; set; }
    ... //Other Fields

}

Source2, таких как

public class Source2 : Entity
{
    public int Id {get;set;}
    public string Name { get; set; }

}

И класс назначения следующим образом

public class destination
{
    public int Id {get;set;}
    public int Source2ID { get; set; }
    public string Source2Name {get;set;}
    ... //Other Fields

}

Чего я пытаюсь достичьсопоставить имя source2 в месте назначения с source2ID, доступным в source1.

Я попытался использовать собственный преобразователь значений.

 public class CustomResolver : IValueResolver<Source1, Destination, string>
{

    private readonly IRepository<Source2> _suiteRepository;

    public CustomResolver(IRepository<Source2> suiteRepository )
    {
        _suiteRepository = suiteRepository;
    }

    public string Resolve(Source1 source, Destination destination, string destMember, ResolutionContext context)
    {
        return _suiteRepository.Get(source.Source2ID).Name;
    }
}

А затем в конфигурации яСоздаю карту следующим образом.

config.CreateMap<Source1, Destination>()
  .ForMember(u => u.Name, options => options.ResolveUsing<CustomResolver>());

Ниже приведен код, который вызывает маппер

var source1 = await _repository
     .GetAll()
     .ToListAsync();

var destinationList = ObjectMapper.Map<List<Destination>>(source1);

Это, однако, приводит к следующей ошибке.

An unhandled exception occurred while processing the request.
MissingMethodException: No parameterless constructor defined for this object.
System.RuntimeTypeHandle.CreateInstance(RuntimeType type, bool publicOnly, bool wrapExceptions, ref bool canBeCached, ref RuntimeMethodHandleInternal ctor)

AutoMapperMappingException: Error mapping types.

Mapping types:
Destination
Source1

Type Map configuration:
Source1-> Destinatinon
Namespace.Source1 -> Namespace.Destination

Property:
Source2Name
lambda_method(Closure , List<Sourc1> , List<Destination> , ResolutionContext )

AutoMapperMappingException: Error mapping types.

Я новичок в AutoMapper, я искал Google, но не мог найти что-то по этому вопросу.Я не уверен, есть ли лучший способ сопоставить их вместе.

Спасибо

1 Ответ

0 голосов
/ 09 декабря 2018

Как перенаправлено Lucian, CustomResolver необходимо сначала инициализировать.т.е. из документации Automapper

Как только мы получим нашу реализацию IValueResolver, нам нужно будет указать AutoMapper использовать этот пользовательский преобразователь значений при разрешении определенного целевого элемента.У нас есть несколько опций, чтобы указать AutoMapper, что нужно использовать пользовательский преобразователь значений, в том числе:

MapFrom

MapFrom (typeof (CustomValueResolver))

MapFrom (aValueResolverInstance)

Используя третий вариант, решил проблему.то есть

config.CreateMap<Source1, Destination>()
  .ForMember(u => u.Name, options => options.ResolveUsing(new CustomResolver());

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

Так как яиспользуя AbpBoilerplate, мой код выглядит следующим образом.

 using (var repo = Configuration.Modules.AbpConfiguration.IocManager.CreateScope().ResolveAsDisposable<IRepository<Source2>>())
 {

     config.CreateMap<Source1, Destination>()
          .ForMember(u => u.Name, options => options.ResolveUsing(new CustomResolver(repo.Object)));
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...