如何使用自动映射器嵌套对象

本文关键字:嵌套 对象 映射 何使用 | 更新日期: 2023-09-27 18:07:23

我正面临使用Auto Mapper方法映射嵌套对象的问题有谁能给出使用auto mapper映射源类和目标类的建议吗

示例代码:

来源:

Main Class:
public class EMP {
  public int empid {get;set;}
  public int Name {get;set;}
  public EMPDetails Employeedata {get;set;}//Here is inner object in main class
  public EmpContact EmpContactdetails {get;set;}//Here is other inner object in main class
}
public Class EMPDetails {
  public String Name {get;set;}
  public EmpAdd EmpAddress {get;set;}//Here is inner Object in one class
}
public class EmpAdd {
  public int id {get;set;}
  public int Street {get;set;}
}
public class EmpContact {
  public int id {get;set;}
  public int Mobile {get;set;}
}
目标:

Main Class:    
public class EMPInfo {
  public int id {get;set;}
  public int EmpName {get;set;}
  public EMPPerdata Employeedata {get;set;}//Here is inner object in main class
  public EmpContact EmpContactdetails {get;set;}//Here is other inner object in main class
}
public class EMPPerdata {
  public String FullName {get;set;}
  public EmpAdressInfo EmpAddress {get;set;}//Here is inner Object in one class
}
public class EmpAdressInfo {
  public int id {get;set;}
  public int Street {get;set;}
}
public class EmpContact {
  public int id {get;set;}
  public int Mobile {get;set;}
}

如何使用自动映射器嵌套对象

原始回答

你需要为外部类和内部类创建映射。

,

Mapper.CreateMap<Emp,EmpInfo>();
Mapper.CreateMap<EmpDetails,EMPPerdata>();

等等……

:

EmpInfo Dest = Mapper.Map<Emp, EmpInfo>(srcObj);

应该可以。

编辑(因为这不是一个很好的答案)

所以,我只是想添加这个编辑来展示一些AutoMapper的最佳实践,因为如果你遵循这些最佳实践,使用起来会容易得多。

AutoMapper概要文件

当使用Automapper时,除非你映射的是非常非常简单的对象,否则设置映射的最佳方式是使用配置文件。要使用这些配置文件,请确保将using AutoMapper;添加到您的程序中,然后您可以创建一个映射配置文件,如下所示:

public class MappingProfile : Profile
{
  public MappingProfile()
  {
    CreateMap<EMP, EMPInfo>();
  }
}

现在,在任何你想要使用这个配置文件的类中,你可以这样使用它:

Mapper.Initialize(cfg =>
{
  cfg.AddProfile<MappingProfile>();
});
EMPInfo empInfo = Mapper.Map<EMP, EMPInfo>(emp);

现在…你为什么要费这么大的劲来做这件事?你也可以简单地说Mapper.CreateMap<EMP, EMPInfo>(); Mapper.Map<EMP, EMPInfo(src);,它也会做同样的事情。

这样做的好处有三:

  1. 集中映射表达式。在我的例子中,我通常只有一个MappingProfiles类,它包含我可以使用的所有Mapping配置文件。这种做法比其他任何方法都更有助于组织你的代码。
  2. 可重用性。在你的程序中,无论何时你需要使用映射配置文件(可能不止一个CreateMap()行),你都可以初始化该配置文件,然后使用它。
  3. 单元测试。加载配置文件使AutoMapper的单元测试变得非常容易。并且,单元测试将帮助您准确地找出如何映射嵌套对象。

Unit Testing AutoMapper

在你的单元测试项目中(如果你没有的话添加一个,它是visual studio的默认项目模板),你应该有一个类来保存以下单元测试:

[TestMethod]
public void AutoMapperConfigIsValid()
{
  Mapper.Initialize(cfg => 
  {
    cfg.AddProfile<MappingProfile>();
    // add all profiles you'll use in your project here
  });
  Mapper.AssertConfigurationIsValid();
}

现在,如果我要使用上面列出的类和上面的映射配置文件运行单元测试,它会给我错误:

Unmapped Properties:
id
EmpName

这不是完整的错误,只是最重要的部分。现在的情况是……AutoMapper无法找出EMPInfo Type上的idEmpName字段应该从哪里映射。

要解决这个错误,我们需要在配置文件中添加特定成员的映射。我们的配置文件变成:

CreateMap<Source.EMP, Target.EMPInfo>()
    .ForMember(dest => dest.id, opt => opt.MapFrom(src => src.empid))
    .ForMember(dest => dest.EmpName, opt => opt.MapFrom(src => src.Name));

我们在…再次运行测试…获取一个新的错误。

Add a custom mapping expression, ignore, add a custom resolver, or modify the destination type TestStuff.Target.EmpContact.
Context:
    Mapping from type TestStuff.Source.EmpContact to TestStuff.Target.EmpContact
Exception of type 'AutoMapper.AutoMapperConfigurationException' was thrown.

这告诉我们需要为正在映射的对象的嵌套成员添加一个映射。

要解决这个问题,我们将以下映射添加到映射配置文件中:

CreateMap<Source.EmpContact, Target.EmpContact>();

现在你需要做的是,这是一个艰巨但必要的过程,就是继续运行配置测试并修复它给你的问题,直到测试没有失败。

当所有问题都解决后,映射配置文件看起来像这样:

public class MappingProfile : Profile
{
  public MappingProfile()
  {
    CreateMap<Source.EMP, Target.EMPInfo>()
      .ForMember(dest => dest.id, opt => opt.MapFrom(src => src.empid))
      .ForMember(dest => dest.EmpName, opt => opt.MapFrom(src => src.Name));
    CreateMap<Source.EmpContact, Target.EmpContact>();
    CreateMap<Source.EMPDetails, Target.EMPPerdata>()
      .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.Name));
    CreateMap<Source.EmpAdd, Target.EmpAdressInfo>();
  }
}

这个映射配置文件可以很好地映射你的两个对象。

现在,这个地图似乎是为了一个小东西做了很多工作,但是这样做的好处是有规模的。如果你曾经在一个大型的"适配器"类型的项目中使用过AutoMapper,那么以这种方式构建的代码将更容易导航、阅读和测试。

希望这对你有所帮助。对不起,如果我在这里讲得太远了,但希望这个答案可以帮助任何试图使用AutoMapper的人。

您也可以在AutoMapper文档中找到关于我上面提到的一些东西的文档:https://github.com/AutoMapper/AutoMapper/wiki/Configuration

您将需要为所有模型创建映射

Mapper.CreateMap<EMP,EmpInfo>();
Mapper.CreateMap<EmpDetails,EMPPerdata>();
Mapper.CreateMap<EmpContact,EmpContact>();
Mapper.CreateMap<EmpAdd,EmpAdressInfo>();

:

Mapper.Map<Emp, EmpInfo>(someEmp);