【问题标题】:Mapping two classes easily in C#在 C# 中轻松映射两个类
【发布时间】:2011-09-16 12:51:57
【问题描述】:

我有一个 web 应用程序和一个在不同地方运行的服务层,并且都有自己的业务实体,这意味着它们都有自己的类来表示员工、订单等(例如,服务层中的 Emp 和 web 应用程序中的 Employee )。当 Web 应用程序调用服务层来获取员工列表时,我想将服务返回的员工列表转换为 Web 应用程序的员工类型列表。

我正在寻找一种方法来轻松地做到这一点。任何想法都会很棒。顺便说一句,我使用的是 ASP.NET 和 WCF。

【问题讨论】:

    标签: c# wcf


    【解决方案1】:

    使用AutoMapper

    AutoMapper 是一个简单的小库,用于解决欺骗性问题 复杂的问题 - 摆脱将一个对象映射到的代码 其他。这种类型的代码写起来相当枯燥乏味,所以 为什么不发明一种工具来为我们做这件事呢?

    一般特点

    • 展平
    • 投影
    • 配置验证
    • 列表和数组
    • 嵌套映射
    • 自定义类型转换器
    • 自定义值解析器
    • 自定义值格式化程序
    • 空替换

    这是sample from : wlegant Code

    在自动映射器之前

    var meeting = _repository.GetMeetingById(meetingId);
    var dto = new MeetingDto();
    dto.Begins = meeting.Begins;
    dto.End = meeting.End;
    dto.Attendees = meeting.Attendees;
    dto.AttendeesCount = meeting.Attendees.Count;
    //do something meaningful
    

    并使用自动映射器

    var meeting = _repository.GetMeetingById(meetingId);
    var dto = Mapper.Map<Meeting, MeetingDto>(meeting);
    

    【讨论】:

    • 感谢您的详细解释。我很感激。
    • 不要忘记 Mapper.CreateMap(),否则你会得到非常无用的异常“缺少类型映射配置或不支持的映射”。
    【解决方案2】:

    您可以使用 Automapper:

    https://github.com/AutoMapper/AutoMapper

    它可以帮助您将一种类型映射到另一种类型。您的输入对象 (WCF) 将被转换为另一种类型的对象(Web 应用程序)。 Automapper 能够(在很大程度上)自动解决这个问题。几乎不需要配置。

    映射两种类型:

    Mapper.CreateMap<WcfEmployee, WebAppEmployee>();
    

    将一种类型转换为另一种:

    WebAppEmployee employee = Mapper.Map<WcfEmployee, WebAppEmployee>(employee);
    

    在大多数情况下,Automapper 使用基于名称的约定来映射两种类型,但 IIRC 你当然可以调整它。为此,您需要告知 Automapper 您的约定规则。换句话说,它应该如何映射您的类型的规则。

    【讨论】:

      【解决方案3】:
      receivedEmployesArray.Select(x => new MyWinFormsEmploeType(x)); // if you create intializaion in constructor
      
      receivedEmployesArray.Select(x => new MyWinFormsEmploeType() { 
         Name = x.Name,
         Position = x.Position
      }); // trasfering property to property
      

      或者最先进的方式——使用automapper

      【讨论】:

        【解决方案4】:

        就我个人而言,我不建议以一种简单的方式来做,而是以一种非常有意识的方式来做。仅将服务中的事物映射到应用程序实际需要的应用程序,并且仅公开绝对需要公开的内容。换句话说,保留尽可能多的,最好是服务在 eapp 对象内部公开的所有数据。

        通常使用来自服务的数据作为功能的基础。公开功能而不是数据。这将使您可以完全更改数据结构(只要它支持相同的心智模型/功能要求),而无需基于应用程序端对象重写任何内容。您当然需要重写应用程序端类。

        【讨论】:

          【解决方案5】:

          如果类属性共享相同的名称并键入最简单的方法是通过 JsonSerializer:

            using System.Text.Json;
          
            public class MappingService
            {
              /// <summary>
              /// Converts model from class F to class T
              /// </summary>
              /// <typeparam name="T">To Class</typeparam>
              /// <typeparam name="F">From Class</typeparam>
              /// <returns>model of type class T</returns>
              public T Map<F, T>(F from)
              {
                  var json = JsonSerializer.Serialize(from);
                  var to = JsonSerializer.Deserialize<T>(json);
          
                  return to;
              }
            }
          

          【讨论】:

          • 所有序列化重载方法都需要2个或更多参数
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-06-07
          • 2021-05-30
          • 2011-08-19
          • 2010-09-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多