【问题标题】:Automapper mapping nested objectsAutomapper 映射嵌套对象
【发布时间】:2017-07-20 02:32:18
【问题描述】:

我有以下类结构

public class ClassA
{
    public ClassB objB;
}

Public class ClassB
{
    public ListOfData objListofData;
}

public class ListOfData 
{
    public Employee objEmp;
}

public class Employee
{
    public string FirstName;
    public string LastName;
}

上述层次结构的返回类型将是

"ClassA":{
    "classB":{
        "ListOfData":{
            "employee":{
                "FirstName":"David",
                "LastName" :"Peter"
            }
        }
    }
}

我想将员工类映射到 EmployeeViewModel,其中员工的名字和姓氏将映射到employeeViewModel FullName 属性。我可以通过以下代码来实现这一点

public class EmployeeViewModel
{
    public FullName;
}


CreateMap<Employee,EmployeeViewModel>()
                         .ForMember(dest => dest.FullName,
                                    opts => opts.MapFrom(
                                        src => string.Format("{0} {1}",
                                        src.FirstName, src.LastName)));

现在如何返回具有 EmployeeViewModel 映射的原始 classA 对象。像这样的??

"ClassA":{
    "classB":{
        "ListOfData":{
            "EmployeeViewModel":{
                "FullName":"David Peter"
            }
        }
    }
}

【问题讨论】:

    标签: c# asp.net-web-api .net-core automapping


    【解决方案1】:

    在花费大量时间阅读文档后,我发现解决方案是我的方法

    a)像这样创建类源类和目标类

    public class ClassA
    {
        public ClassB objB;
    }
    
    Public class ClassB
    {
        public ListOfData objListofData;
    }
    
    public class ListOfData 
    {
        public Employee objEmp;
    }
    
    public class Employee
    {
        public string FirstName;
        public string LastName;
    }
    ------------------------------------
    public class DestClassA
    {
        public DestClassB objB;
    }
    
    Public class DestClassB
    {
        public DestListOfData objListofData;
    }
    
    public class DestListOfData 
    {
        public DestEmployee objEmp;
    }
    
    public class EmployeeViewModel
    {
        public string FullName;
    }
    

    b)创建映射

    var config = new MapperConfiguration(cfg => {
    
        cfg.CreateMap<Employee, EmployeeViewModel>().
                    ForMember(dest => dest.FullName, opts => opts.MapFrom(
                        src => string.Format("{0} - {1}",
                        src.FirstName, src.LastName)));
        cfg.CreateMap<ListOfData, DestListOfData>();
        cfg.CreateMap<GetFundFamilyOutOfBalanceTotalsResponse, GetFundFamilyOutOfBalanceTotalsResponseMapped>();
        cfg.CreateMap<ClassB, DestClassB>();
        cfg.CreateMap<ClassA, DestClassA>();
    });
    

    //这是为了确保你的映射是正确的

    config.AssertConfigurationIsValid();
    

    //你可以测试预期的objected是否是automapper创建的,映射后添加如下代码

    var mapper = config.CreateMapper();
    var output = new ClassA
    {
        objClassB = new ClassB
        {
            objListofData = new ListOfData 
            {
                Employee = new []
                   {
                        new Employee  { FirstName = "David", LastName ="Peter" }
                   }
            }
        }
    };
    
    var destMap = mapper.Map<DestClassA>(output);
    

    //如果你探索这个对象,你会发现像这样的对象结构

    "ClassA":{
        "classB":{
            "ListOfData":{
                "EmployeeViewModel":{
                    "FullName":"David Peter"
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-06
      • 2020-04-03
      • 1970-01-01
      • 2012-02-25
      • 1970-01-01
      • 2020-07-17
      • 1970-01-01
      • 2017-06-11
      相关资源
      最近更新 更多