Я работаю над проектом .Net 8.0, основанным на шаблоне «Чистая архитектура» Джейсона Тейлора. В этом проекте AutoMapper используется повсюду для сопоставления между сущностями домена и объектами передачи данных (DTO). В проекте модульного тестирования приложения определены тесты для проверки определенных сопоставлений. Недавно я представил несколько DTO, которые используют дженерики для установки типа данных для свойства Id объекта поиска. После введения дженериков (и связанных с ними карт) мои тесты AutoMapper начали давать сбой, но только для дженериков и только там, где используется перегрузка AddMaps. Если карты добавляются явно с использованием перегрузки MapperConfiguration(config => c.CreateMap(src,dest), карты работают должным образом.
Полагая, что это AutoMapper ошибка, я открыл проблему в репозитории AutoMapper, но вместо этого меня направили сюда.
Я создал скрипт .NET, демонстрирующий проблему в браузере, и полный код воспроизведения приведен ниже. есть недосмотр конфигурации, ограничение функций или это ошибка AutoMapper?
Код: Выделить всё
public class MyClass
{
public int Id { get; set; }
public string Name { get; set; } = null!;
}
public record MyClassDto
{
public int Id { get; init; }
public string Name { get; init; } = null!;
private class Mapping : Profile
{
public Mapping() => CreateMap();
}
}
public record MyGenericClassDto
{
public T Id { get; init; } = default!;
public string Name { get; init; } = null!;
private class Mapping : Profile
{
public Mapping() => CreateMap();
}
}
public class MappingTests
{
[Test]
// Will succeed
[TestCase(typeof(MyClass), typeof(MyClassDto))]
// Will fail
[TestCase(typeof(MyClass), typeof(MyGenericClassDto))]
public void ShouldSupportMappingFromSourceToDestination_AddMaps(
Type source,
Type destination)
{
var instance = GetInstanceOf(source);
var configuration = new MapperConfiguration(config =>
config.AddMaps(Assembly.GetAssembly(typeof(MyClass))));
var mapper = configuration.CreateMapper();
mapper.Map(instance, source, destination);
}
[Test]
// Will succeed
[TestCase(typeof(MyClass), typeof(MyClassDto))]
// Will succeed
[TestCase(typeof(MyClass), typeof(MyGenericClassDto))]
public void ShouldSupportMappingFromSourceToDestination_CreateMap(
Type source,
Type destination)
{
var instance = GetInstanceOf(source);
var config = new MapperConfiguration(cfg =>
cfg.CreateMap(source, destination));
var mapper = new Mapper(config);
mapper.Map(instance, source, destination);
}
private static object GetInstanceOf(Type type) =>
type.GetConstructor(Type.EmptyTypes) != null
? Activator.CreateInstance(type)! :
// Type without parameterless constructor
RuntimeHelpers.GetUninitializedObject(type);
}
Источник: https://stackoverflow.com/questions/781 ... -not-regis