AutoMapAtribute и полиморфизм - PullRequest
       2

AutoMapAtribute и полиморфизм

0 голосов
/ 04 апреля 2020

Обновление 1

По предложению Люциана я удалил атрибуты из классов, используемых для свойства, и добавил профиль; вот так оба теста пройдут успешно:

    public class TargetBaseClass
    {
    }

    public class TargetConcreteClass : TargetBaseClass
    {
    }

    public class TestProfile : Profile
    {
        public TestProfile()
        {
            this.CreateMap<TargetBaseClass, SourceBaseClass>()
                .Include<TargetConcreteClass, SourceConcreteClass>();
            this.CreateMap<TargetConcreteClass, SourceConcreteClass>();
            this.CreateMap<SourceBaseClass, TargetBaseClass>()
                .Include<SourceConcreteClass, TargetConcreteClass>();
            this.CreateMap<SourceConcreteClass, TargetConcreteClass>();
        }
    }

Вопрос в том, может ли он быть переведен в AutoMap атрибут (ы)? У меня есть несколько производных классов, и я могу добавить больше в будущем. Атрибут с первого взгляда выглядел простым способом сделать это.


оригинальный вопрос

У меня проблемы с использованием AutoMapper с AutoMapAttribute. Я создал следующий тест:

namespace Tests
{
    using AutoMapper;

    using Microsoft.Extensions.DependencyInjection;

    using Xunit;

    public class SourceContainerClass
    {
        public SourceBaseClass MyProperty { get; set; }
    }

    public class SourceBaseClass
    { }

    public class SourceConcreteClass : SourceBaseClass
    { }

    [AutoMap(typeof(SourceContainerClass), ReverseMap = true)]
    public class TargetContainerClass
    {
        public TargetBaseClass MyProperty { get; set; }
    }

    [AutoMap(typeof(SourceBaseClass), ReverseMap = true, IncludeAllDerived = true)]
    public class TargetBaseClass
    { }

    [AutoMap(typeof(SourceConcreteClass), ReverseMap = true)]
    public class TargetConcreteClass : TargetBaseClass
    { }

    public class AutoMapperTests
    {
        [Fact]
        public void TestSourceToTargetMapping()
        {
            var services = new ServiceCollection().AddAutoMapper(this.GetType().Assembly).BuildServiceProvider();
            var mapper = services.GetRequiredService<IMapper>();
            var source = new SourceContainerClass
            {
                MyProperty = new SourceConcreteClass()
            };
            var target = mapper.Map<TargetContainerClass>(source);
            Assert.IsType<TargetConcreteClass>(target.MyProperty);
        }

        [Fact]
        public void TestBackwardMapping()
        {
            var services = new ServiceCollection().AddAutoMapper(this.GetType().Assembly).BuildServiceProvider();
            var mapper = services.GetRequiredService<IMapper>();
            var source = new TargetContainerClass
            {
                MyProperty = new TargetConcreteClass()
            };
            var back = mapper.Map<SourceContainerClass>(source);
            Assert.IsType<SourceConcreteClass>(back.MyProperty);
        }
    }
}

При втором сбое теста:

Tests.AutoMapperTests.TestBackwardMapping:
    Outcome: Failed
    Error Message:
    Assert.IsType() Failure
Expected: Tests.SourceConcreteClass
Actual:   Tests.SourceBaseClass
    Stack Trace:
       at Tests.AutoMapperTests.TestBackwardMapping() in /{..}/AutoMapperTests.cs:line 59

Tests.AutoMapperTests.TestSourceToTargetMapping:
    Outcome: Passed

Total tests: 2. Passed: 1. Failed: 1. Skipped: 0

Это отображение не поддерживается или я что-то упустил? Я ссылаюсь на пакет AutoMapper.Extensions.Microsoft.DependencyInjection 7.0.0.

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