Automapper как сопоставить пользовательский интерфейс между 2 типами c - PullRequest
0 голосов
/ 30 января 2020

У меня есть интерфейс:

public interface IQueryResult<T> where T : IBaseEntity
{
    PageInfo PageInfo { get; }
    IEnumerable<T> Payload { get; }     
}

Реализация:

public class QueryResult<T> : IQueryResult<T> where T : IBaseEntity
{
    public QueryResult()
    {

    }
    public QueryResult(IEnumerable<T> payload, PageInfo pageInfo)
    {
        Payload = payload;
        PageInfo = pageInfo;
    }
    public QueryResult(IEnumerable<T> payload)
    {
        Payload = payload;
    }
    public IEnumerable<T> Payload { get; private set; }
    public PageInfo PageInfo { get; private set; }
}

Конфигурация Mapper:

    CreateMap<EntityA, DtoA>();
    CreateMap<DtoA, EntityA>();

    CreateMap<EntityB, DtoB>();
    CreateMap<DtoB, EntityB>();

    CreateMap(typeof(IQueryResult<>), typeof(IQueryResult<>));

Затем я хотел бы сделать это в контроллере :

IQueryResult<EntityA> entities = service.GetAll();
IQueryResult<DtoA> result = _mapper.Map<IQueryResult<DtoA>>(entities);

В настоящее время он не ломается, но проблема в том, что, поскольку свойства имеют частные установщики, свойства назначения являются нулевыми

Мне нужно как-то сказать, как это сделать чтобы отобразить свойства или использовать конструктор, я думаю

1 Ответ

0 голосов
/ 30 января 2020

У меня это работает, если кто-то еще сталкивается с этой проблемой, я оставлю это здесь:

После изучения документации Automapper я наткнулся на это решение:

Вы можете определить ITypeConverter

public class QueryResultConverter<TSource, TDest>
: ITypeConverter<IQueryResult<TSource>, IQueryResult<TDest>> where TSource: IBaseEntity where TDest : IBaseEntity
{
    public IQueryResult<TDest> Convert(IQueryResult<TSource> source, IQueryResult<TDest> destination, ResolutionContext context)
    {
        List <TDest> payload = context.Mapper.Map<List<TDest>>(source.Payload);
        destination = new QueryResult<TDest>(payload, source.PageInfo);

        return destination;
    }
}

Затем вы можете настроить отображение для использования конвертера:

CreateMap(typeof(IQueryResult<>), typeof(IQueryResult<>)).ConvertUsing(typeof(QueryResultConverter<,>));
...