Преобразование Automapper с ошибкой IncludeBase для абстрактного универсального класса - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь отобразить эталонные объекты данных в dtos, которые оба наследуют из базового базового класса в своем собственном пространстве имен и используют профиль «все цели» для добавления сопоставлений. Рассмотрим следующий код:

namespace Dtos
{
    public abstract class ReferenceData<TId>
        where TId : Enum
    {
        public TId Id { get; set; }

        public string Description { get; set; }
    }

    public class ConcreteDto : ReferenceData<MyEnum> { }
}

namespace Entities
{
    public abstract class ReferenceData<TId>
        where TId : Enum
    {
        public TId Id { get; set; }

        public string Description { get; set; }
    }

    public class ConcreteEntity : ReferenceData<MyEnum> { }
}

namespace DtoMapping
{
    internal abstract class ReferenceDataDtoProfile<TDto, TEntity, TId> : Profile
    where TDto : Dtos.ReferenceData<TId>
    where TEntity : Entities.ReferenceData<TId>
    where TId : Enum
    {
        public ReferenceDataDtoProfile()
        {
        }

        protected IMappingExpression<TDto, TEntity> CreateDtoToEntityMap()
        {
            return this.CreateMap<TDto, TEntity>()
                        .IncludeBase<Dtos.ReferenceData<TId>, Entities.ReferenceData<TId>>();
        }

        protected IMappingExpression<TEntity, TDto> CreateEntityToDtoMap()
        {
            return this.CreateMap<TEntity, TDto>()
                        .IncludeBase<Entities.ReferenceData<TId>, Dtos.ReferenceData<TId>>();
        }

        protected void CreateMaps()
        {
            this.CreateDtoToEntityMap();
            this.CreateEntityToDtoMap();
        }
    }

    internal sealed class ProfileForConcreteEntity : ReferenceDataDtoProfile<Dtos.ConcreteDto, Entities.ConcreteEntity, MyEnum>
    {
        public PeriodProfile()
        {
            this.CreateMaps();
        }
    }   
}

Когда я запускаю приложение и пытаюсь добраться до рассматриваемой конечной точки, я вижу в отладчике, что код класса ReferenceDataDtoProfile выполняется, но затем я получаю исключение, котороедля этих объектов нет сопоставлений, а именно:

InvalidOperationException: отсутствует карта из Dtos.ReferenceData'1 [MyEnum] в Entities.ReferenceData'1 [MyEnum]. Создайте, используя CreateMap (ReferenceData'1, ReferenceData'1).

Как видите, я добавляю метод "IncludeBase" для обоих абстрактных классов ReferenceData, поэтому не понимаю, почему я получаю это исключение.

В мой проект веб-API я включил AutoMapper.Extensions.Microsoft.DependendyInjection пакет версия 7.0.0 .

Спасибо.

1 Ответ

1 голос
/ 07 ноября 2019

Похоже, что IncludeBase просто указывает, что отображение производных объектов будет наследовать конфигурацию базовых объектов. Однако вам все равно необходимо создать фактическое отображение как для базового, так и для производных объектов:

protected IMappingExpression<TDto, TEntity> CreateDtoToEntityMap() 
{ 
    this.CreateMap<Dtos.ReferenceData<TId>, Entities.ReferenceData<TId>>();
    return this.CreateMap<TDto, TEntity>() 
        .IncludeBase<Dtos.ReferenceData<TId>, Entities.ReferenceData<TId>>(); 
} 

protected IMappingExpression<TEntity, TDto> CreateEntityToDtoMap() 
{
    this.CreateMap<Entities.ReferenceData<TId>, Dtos.ReferenceData<TId>>();
    return this.CreateMap<TEntity, TDto>() 
        .IncludeBase<Entities.ReferenceData<TId>, Dtos.ReferenceData<TId>>(); 
}

См. Наследование отображения для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...