以下是我尝试做的简单示例...让我说我有以下界面:
public interface IPerson
{
int Id { get; set; }
}
public interface IModelPerson : IPerson
{
int BeautyCompetitionsWon { get; set; }
}
在实际实施中,有许多不同类型的人(例如IUglyPerson
等)。这些是实体类型的合同,例如如下:
public class PersonEntity : IPerson
{
public int Id { get; set; }
}
public class ModelPersonEntity : PersonEntity, IModelPerson
{
public int BeautyCompetitionsWon { get; set; }
}
注意:我们可能还有多种合同类型的实施 - 例如IModelPerson
也可以实施SupermodelEntity
。
我们希望将我们的实体类型映射到DTO,看起来像这样:
public abstract class PersonDto : IPerson
{
public int Id { get; set; }
public abstract string PersonType { get; }
}
public class ModelPersonDto : PersonDto, IModelPerson
{
public int BeautyCompetitionsWon { get; set; }
public override string PersonType
{
get { return "Model"; }
}
}
因此,我们创建了一个映射:
Mapper.Initialize(config =>
{
config.CreateMap<IPerson, PersonDto>()
.Include<IModelPerson, ModelPersonDto>()
.ConstructUsing((IPerson person) =>
{
if (person is IModelPerson) return new ModelPersonDto();
throw new InvalidOperationException("Unknown person type: " + person.GetType().FullName);
})
;
config.CreateMap<IModelPerson, ModelPersonDto>();
});
所以,我在这里有两个问题。
1。有没有办法在没有ConstructUsing
条款的情况下创建映射?我认为拥有CreateMap
更具体的版本会为我们处理这个问题,但如果我不这样做的话; t有ConstructUsing
子句,AutoMapper告诉我&#34;抽象类的实例无法创建&#34;。
2。为什么我的子类中的属性不会被映射?如果我按如下方式执行映射:
var source = new ModelPersonEntity { Id = 100, BeautyCompetitionsWon = 9 };
var target = Mapper.Map<PersonDto>(source);
target.BeautyCompetitionsWon
的预期值为9,但实际值为0.
答案 0 :(得分:8)
问题1:不是我知道的。
问题2:使用.ConstructUsing()时,请确保返回您所追求的映射对象而不是新实例。
e.g。
Mapper.Initialize(config =>
{
config.CreateMap<IPerson, PersonDto>()
.Include<IModelPerson, ModelPersonDto>()
.ConstructUsing((IPerson person) =>
{
if (person is IModelPerson) return Mapper.Map<ModelPersonDto>(person);
throw new InvalidOperationException("Unknown person type: " + person.GetType().FullName);
})
;
config.CreateMap<IModelPerson, ModelPersonDto>();
});