【发布时间】:2016-08-04 18:53:21
【问题描述】:
我正在尝试为新模块实现 AutoMapper。
我在网站上有 MVC 模型,我正在研究,它看起来像这样:
public class MvcModel
{
public Params Params { get; set; }
public Steps Steps { get; set; }
}
public class Params
{
public int? RequestId { get; set; }
public bool NewClient { get; set; }
}
public class Steps
{
public Step1 Step1 { get; set; }
public Step2 Step2 { get; set; }
public Step3 Step3 { get; set; }
}
public class Step1
{
public int Name { get; set; }
}
public class Step2
{
public int Phone { get; set; }
}
public class Step3
{
public int Email { get; set; }
}
另一方面,我有下一节课,我必须传递给一些服务:
public class Request
{
public Parameters Parameters { get; set; }
public RequestContent RequestContent { get; set; }
}
public class Parameters
{
public int NewClient { get; set; }
}
public class RequestContent
{
public int Id { get; set; }
public int InnerId { get; set; }
public string Session { get; set; }
public string Clerk { get; set; }
public bool Private { get; set; }
public PersonalDetails PersonalDetails { get; set; }
public Phones Phones { get; set; }
public ElectonicCommunication ElectonicCommunication { get; set; }
}
public class PersonalDetails
{
public int Name { get; set; }
}
public class Phones
{
public int Phone { get; set; }
}
public class ElectonicCommunication
{
public int Email { get; set; }
}
我创建了一个新的 AutoMapper 配置类(从 Global.asax 中调用):
public class AutoMapperConfig
{
public static void Configure()
{
MapperConfiguration MapperConfiguration = new MapperConfiguration(cfg => {
cfg.AddProfile<Out>();
cfg.AddProfile<In>();
cfg.CreateMap<MvcModel, Request>();
});
MapperConfiguration.AssertConfigurationIsValid();
}
}
public class Out: Profile
{
protected override void Configure()
{
CreateMap<MvcModel, Request>()
.ForMember(dest => dest.Parameters, opt => opt.MapFrom(src => src.Params))
.ForMember(dest => dest.RequestContent, opt => opt.MapFrom(src => src.Steps));
}
}
public class In: Profile
{
protected override void Configure()
{
CreateMap<Request, MvcModel>()
.ForMember(dest => dest.Params, opt => opt.MapFrom(src => src.Parameters))
.ForMember(dest => dest.Steps, opt => opt.MapFrom(src => src.RequestContent));
}
}
它们在示意图上很相似,尽管真实的物体要大一些并且名称不同。
预期: MvcModel 被映射到 Request 并向后映射。
更准确地说:
-
MvcModel.Params映射到Request.Parameters并向后映射 -
MvcModel.Steps映射到Request.RequestContent并向后映射 -
InnerId,Session,Clerk,PrivatefromRequest.RequestContent必须被忽略
问题:在应用程序启动时出现错误:
无法映射 ... 上的以下属性:
添加自定义映射表达式、忽略、添加自定义解析器或修改 目的地类型... 语境: 映射到属性 ... 从 ... 到 ... 从类型 ... 到 ... 的映射 从源类型 AutoMapperMessageBugTests.SourceChild 映射到类型 引发了“AutoMapper.AutoMapperConfigurationException”类型的异常。
我没有找到关于如何在应用程序中全局使用 AutoMapper 的良好文档,只是不知道如何正确使用它以及我到底做错了什么。
我找不到一个很好的复杂对象映射以太的例子......
有人可以帮我解决这个问题吗?
【问题讨论】:
-
您还需要告诉 AutoMapper 如何映射每个属性的类,因为它们不同 - 所以定义其他类之间的映射,即
Params <=> Parameters和RequestContent <=> Steps。 -
@stuartd 你的意思是,我必须映射每个单独的类,
MvcModel和Request在内部分层,然后才映射它们的父级,然后映射它们的父级......? -
AutoMapper 需要知道如何映射每个类,是的。
-
@stuartd 谢谢。还有一件事:我真的需要创建 2 个配置文件才能拥有“双向映射”吗?
-
您不需要有两个配置文件,但是是的,您需要以两种方式定义映射:
ReverseMap()只处理简单的情况 - 你的肯定不是......
标签: c# .net automapper