AutoMapper c#运行时映射取决于对象属性

时间:2018-06-09 12:28:03

标签: c# automapper

我想知道,我怎么能用AutoMapper将一个Dto映射到多个实体。

Lemme解释。

我有一个Dto,用枚举来描述它的类型(避免有多个dtos)

根据枚举(这里是RelationType),我想将它映射到正确的模型(实体,它是我在数据库中使用的另一个对象)。

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 :(得分:1)

假设您有一个设置,其中有一个基类和两个派生基类的类:

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映射到ModelOneModelTwo,具体取决于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);

答案 1 :(得分:0)

进行映射的另一种方法是使用动态:

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语句