自动映射器 c# 运行时映射,具体取决于对象属性



我想知道,我如何使用AutoMapper将一个Dto映射到多个实体。

莱姆解释道。

我有一个 Dto,有一个枚举来描述它的类型(以避免有多个 dto(

根据该枚举(此处为关系类型(,我想将其映射到正确的模型(实体,无论如何,它是我在数据库中使用的另一个对象(。

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>();

告诉我如果我做错了什么,并解释为什么请:)

提前感谢, 布洛亚。

假设您有一个设置,其中有一个基类和 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映射到ModelOneModelTwoModelDto.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);

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

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

最新更新