我想知道,如何使用 AutoMapper 将一个 Dto 映射到多个实体。
让我解释一下。
我有一个 Dto,用一个枚举来描述它的类型(以避免有多个 dto)
根据该枚举(此处为 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>();
如果我做错了什么请告诉我并解释原因:)
提前致谢,布瓦。
假设您有一个设置,其中有一个基类和派生基类的 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
中的值属性(property)?
方法如下:
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);
我是一名优秀的程序员,十分优秀!