Обновление 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
.