AutoMapper c # отображение времени выполнения в зависимости от свойства объекта - PullRequest
0 голосов
/ 09 июня 2018

Я хотел бы знать, как я мог бы с помощью AutoMapper отобразить один Dto на несколько объектов.

Позвольте мне объяснить.

У меня есть один Dto с перечислением для описанияего тип (чтобы избежать нескольких dtos)

В зависимости от этого перечисления (здесь RelationType) я хотел бы сопоставить его с правильной моделью (Entity, что бы то ни было, это еще один объект, который я использую в базе данных).

public class BCardDto : IMappedDto
{
    public long Id { get; set; }

    public BCardRelationType RelationType { get; set; }
    public long RelationId { get; set; }
}

Вот моя база модели:

public class BCardModel : IMappedDto
{
    public long Id { get; set; }
}

А вот производная модель:

public class CardBCardModel : BCardModel
{
    // ormlite, ignore that
    [Reference]
    public CardModel Card { get; set; }

    [ForeignKey(typeof(CardModel), ForeignKeyName = "fk_bcard_card")]
    public long RelationId { get; set; }
}

Как мне сопоставить Dto с правильной модельюв зависимости от перечисления, которое я дал?(Я не хочу использовать Mapper.Map везде, но хочу, чтобы mapper выполнял работу по отображению во время выполнения)

Вот как я делаю это для Модели -> Dto

        cfg.CreateMap<CardBCardModel, BCardDto>()
            .ForMember(s => s.RelationType, expression => expression.UseValue(BCardRelationType.Card))
            .IncludeBase<BCardModel, BCardDto>();

Скажитеменя, если я делаю что-то не так и объясните мне, почему, пожалуйста:)

Заранее спасибо, Blowa.

Ответы [ 2 ]

0 голосов
/ 03 июня 2019

Другим способом сопоставления является использование динамического:

public class PersonDto
{
    public string Name { get; set; }
}

public class StudentDto : PersonDto
{
    public int studentNumber { get; set; }
}

public class EmployeDto  : PersonDto
{
    public string EmployeId { get; set; }
}

public class Person
{
    public string Name { get; set; }
}

public class Student : Person
{
    public int StudentNumber { get; set; }
}

public class Employe : Person
{
    public string EmployeId { get; set; }
}

Создание карты с помощью:

Mapper.CreateMap<StudentDto, Student>();
Mapper.CreateMap<EmployeDto, Employe>();

Выполнение сопоставления с помощью:

try
{
    var student = MapPerson((dynamic) studentDto);
    var employe = MapPerson((dynamic) employeDto);
}
catch
{
    throw new InvalidOperationException("Unknown ModelType...");
}

И определить два метода

public static Student MapPerson(StudentDto studentDto)
{
    return Mapper.Map<StudentDto, Student>(studentDto);
}

public static Employe MapPerson(EmployeDto employeDto)
{
    return Mapper.Map<EmployeDto, Employe>(employeDto);
}

Преимущество состоит в том, что вам не нужен ключ и избегайте оператора switch

0 голосов
/ 09 июня 2018

Допустим, у вас есть установка, в которой есть базовый класс и 2 класса, которые наследуют базовый класс:

public class ModelBase
{
    public string Name { get; set; }
}

public class ModelOne : ModelBase { }

public class ModelTwo : ModelBase { }

Предположим также, что у вас есть DTO с перечислением ниже:

public class ModelDto
{
    public string Name { get; set; }
    public ModelType ModelType { get; set; }
}

public enum ModelType
{
    One = 1,
    Two = 2
}

Итак, теперь задача: Как мне сопоставить ModelDto с ModelOne или ModelTwo в зависимости от значения в свойстве ModelDto.ModelType?

Вот как:

Mapper.Initialize(cfg => cfg.CreateMap<ModelDto, ModelBase>().ConstructUsing(x => 
{
    switch (x.ModelType)
    {
        case ModelType.One:
            return new ModelOne { Name = x.Name };
        case ModelType.Two:
            return new ModelTwo { Name = x.Name };
        default:
            throw new InvalidOperationException("Unknown ModelType...");
    }
}));

Использование

var dto1 = new ModelDto { ModelType = ModelType.One, Name = "ModelOne" };
var dto2 = new ModelDto { ModelType = ModelType.Two, Name = "ModelTwo" };

var one = Mapper.Map<ModelBase>(dto1);
var two = Mapper.Map<ModelBase>(dto2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...