在C#中轻松映射两个类

时间:2011-09-16 12:51:58

标签: c# wcf

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

我正在寻找一种方法来轻松完成这项工作。任何想法都会很棒。顺便说一下,我正在使用ASP.NET和WCF。

7 个答案:

答案 0 :(得分:4)

查找AutoMapper

答案 1 :(得分:3)

您尝试过Automapper吗?

http://automapper.org/

答案 2 :(得分:3)

您可以使用Automapper:

https://github.com/AutoMapper/AutoMapper

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

要映射两种类型:

Mapper.CreateMap<WcfEmployee, WebAppEmployee>();

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

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

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

答案 3 :(得分:3)

使用AutoMapper

  

AutoMapper是一个简单的小型库,用于欺骗性地解决问题   复杂的问题 - 摆脱映射一个对象的代码   另一个。这种类型的代码相当沉闷,写起来很无聊,所以   为什么不为我们发明一个工具?

一般功能

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

这是sample from : wlegant Code

在automapper之前

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);

答案 4 :(得分:1)

就我个人而言,我不建议以简单的方式进行,而是以非常简洁的方式进行。只将服务中的内容映射到应用程序实际需要的应用程序,并且只显示必须公开的内容。换句话说,保持尽可能多,优选服务在eappapp对象内部公开的所有数据。

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

package main

/*
#include<stdbool.h>
typedef const char cchar_t;
*/
import "C"

//export f1
func f1(str *C.cchar_t) C.bool {
    return false
}

func main() {}