Как сопоставить свойства обернутого источника с распакованным местом назначения - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь отобразить исходную структуру, где некоторые свойства обернуты в универсальный тип NonNull<T> (из библиотеки GraphQL.Conventions).

На практике я хочу использовать AutoMapper для сопоставления структуры:

public class SourceA
{
    public NonNull<SourceB> Sub { get; set; }

    public string Username { get; set; }
}

public class SourceB
{
    public NonNull<string> Address { get; set; }
}

К пункту назначения, подобному этому:

public class DestA
{
    public DestB Sub { get; set; }

    public string Username { get; set; }
}

public class DestB
{
    public string Address { get; set; }
}

Это моя установка:

var source = new NonNull<SourceA>(new SourceA
{
    Username = "Test user",
    Sub = new NonNull<SourceB>(new SourceB
    {
        Address = "Test Address"
    })
});

var mapper = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<SourceA, DestA>();
    cfg.CreateMap<NonNull<SourceA>, DestA>()
        .ConvertUsing((src, dst, ctx) =>
        {
            ctx.Mapper.Map(src.Value, dst);
            return dst;
        });
    cfg.CreateMap<SourceB, DestB>();
    cfg.CreateMap<NonNull<SourceB>, SourceB>()
        .ConvertUsing((src, dst, ctx) =>
        {
            ctx.Mapper.Map(src.Value, dst);
            return dst;
        });
}).CreateMapper();


var dest = mapper.Map<DestA>(source);

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

Типы сопоставления ошибок.

Типы сопоставления: SourceA -> DestA MappingTest.Program + SourceA -> MappingTest.Program + DestA

Тип Конфигурация карты: SourceA -> DestA MappingTest.Program + SourceA -> MappingTest.Program + DestA

Назначение Участник: Sub

Любой знает простой способ сделать это (сохранение вИмейте в виду, что я должен иметь возможность автоматически генерировать конфигурацию отображения, используя шаблоны T4, если это вообще имеет значение)?

1 Ответ

0 голосов
/ 08 февраля 2019

Наконец-то нашел то, что работает.

var mapper = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<SourceA, DestA>();
    cfg.CreateMap<NonNull<SourceA>, DestA>().ConvertUsing((src, dst, ctx) => ctx.Mapper.Map<DestA>(src.Value));
    cfg.CreateMap<SourceB, DestB>();
    cfg.CreateMap<NonNull<SourceB>, DestB>().ConvertUsing((src, dst, ctx) => ctx.Mapper.Map<DestB>(src.Value));
}).CreateMapper();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...