使用AutoMapper进行对象间映射

简介: 在开发过程中,难免遇到下面这种情况:两个(或多个)对象所拥有的大多数属性是重复的,我们需要在对象间进行映射(即将一个对象的属性值赋给另一个对象。通常我们可以进行如下操作: 1 A a=new A(); 2 a.Name=b.Name; 3 a.Age=b.Age; 但若对象拥有较多属性,采用着用方法将会显得十分繁琐。

在开发过程中,难免遇到下面这种情况:两个(或多个)对象所拥有的大多数属性是重复的,我们需要在对象间进行映射(即将一个对象的属性值赋给另一个对象。通常我们可以进行如下操作:

1 A a=new A();
2 a.Name=b.Name;
3 a.Age=b.Age;

但若对象拥有较多属性,采用着用方法将会显得十分繁琐。那么有没有一些框架可以帮助我们完成这个过程呢?答案是肯定的。

这里小编使用的是AutoMapper框架,这是一个轻量级的解决对象间映射问题的框架,并且AutoMapper允许我们根据自己的实际需求进行映射配置,使用起来较灵活。

1. 一对一映射

首先使用NuGet添加对AutoMapper的引用,然后创建两个类Human和Monkey

class Human
{
    public string Name { set; get; }
    public int Age { set; get; }
    public string Country { set; get; }
}


class Monkey
{
    public string Name { set; get; }
    public int Age { set; get; }
}

现在我们进行Huamn实例和Monkey实例间的映射:

Monkey monkey = new Monkey() { Name = "monkey", Age = 100 };
//使用AutoMapper时要先进行初始化
Mapper.Initialize(cfg => cfg.CreateMap<Monkey, Human>()
//我们可以根据实际需要来进行初始化,Monkey类没有Country属性
//这里我们给Human对象的Country属性指定一个值
.ForMember(h => h.Country, mce => mce.UseValue("china"))
);
Human human = Mapper.Map<Human>(monkey);
Console.WriteLine("姓名:{0},国籍:{1}", human.Name, human.Country);

程序运行结果:

可以看到,我们已经成功的将monkey对象的属性值映射到了human上。

2. 多对多映射

向对于一对一的映射而言,多对多的映射略显复杂。这里通过一个自定义类来封装具体的映射过程,代码如下:

   static class EntityMapper
    {
        public static List<TDestination> Mapper<TDestination>(object[] source) where TDestination : class
        {
            if (source != null && source.Length > 0)
            {
                List<TDestination> results = new List<TDestination>();
                foreach (var s in source)
                {
                    results.Add(Mapper<TDestination>(s));
                }
                if (results.Count > 0)
                {
                    return results;
                }
            }
            return null;
        }


        public static TDestination Mapper<TDestination>(object source) where TDestination : class
        {
            Type sourceType = source.GetType();
            Type destinationType = typeof(TDestination);
            AutoMapper.Mapper.Initialize(cfg => cfg.CreateMap(sourceType, destinationType));
            var result = AutoMapper.Mapper.Map(source, sourceType, destinationType);
            return (TDestination)result;
        }

    }

执行映射:

 1 Monkey[] monkeys =
 2 {
 3     new Monkey() {Name="monkey1",Age=1 },
 4     new Monkey() {Name="monkey2",Age=2 },
 5     new Monkey() {Name="monkey3",Age=3 },
 6     new Monkey() {Name="monkey4",Age=4 }
 7 };
 8 
 9 List<Human> humans = EntityMapper.Mapper<Human>(monkeys);
10 
11 foreach (var h in humans)
12 {
13     Console.WriteLine(h.Name);
14 }

程序运行结果:

这里虽然成功实现了映射,但无法给某个具体的human对象的Country属性赋值,若读者有更好的实现多对多映射的方式,望告知小编。

3. 多对一映射

 

 1 Monkey monkey1 = new Monkey() { Name = "monkey1" };
 2 Mapper.Initialize(cof => cof.CreateMap<Monkey, Human>());
 3 Human human = Mapper.Map<Human>(monkey1);
 4 
 5 Monkey monkey2 = new Monkey() { Age = 100 };
 6 Mapper.Initialize(cof => cof.CreateMap<Monkey, Human>()
 7 .ForMember(h => h.Name, mc => mc.UseValue(human.Name))
 8 );
 9 human = Mapper.Map<Human>(monkey2);
10 
11 Console.WriteLine("姓名:{0},年龄:{1}", human.Name, human.Age);

程序运行结果:

这里小编仅仅实现了二对一的映射,至于N对一的映射,小编未找到好的解决方案,若读者有好的解决方案,望告知小编,小编不胜感激。

 

版权声明

本文为作者原创,版权归作者雪飞鸿所有。 转载必须保留文章的完整性,且在页面明显位置处标明原文链接

如有问题, 请发送邮件和作者联系。

目录
相关文章
|
搜索推荐 Java 程序员
对象映射你用哪个
对象映射你用哪个
83 0
直接取配置文件对应数据映射到对象中,可在代码中直接使用
直接取配置文件对应数据映射到对象中,可在代码中直接使用
|
数据库 C#
Entity Framewor简单属性映射
Entity Framewor简单属性映射
99 0
Entity Framewor简单属性映射
|
SQL 监控 索引
AutoMapper自动映射
十年河东,十年河西,莫欺少年穷。 学无止境,精益求精。 不扯犊子,直接进入正题: AutoMapper自动映射常用于EF中,能很好的解决DTO和Model之间相互映射的问题。在未使用AutoMapper之前,我们回顾下传统的对象相互映射的方法。
2126 0
|
前端开发
8分钟学会使用AutoMapper
原文:8分钟学会使用AutoMapper 一.什么是AutoMapper与为什么用它。 它是一种对象与对象之间的映射器,让AutoMapper有意思的就是在于它提供了一些将类型A映射到类型B这种无聊的实例,只要B遵循AutoMapper已经建立的惯例,那么大多数情况下就可以进行相互映射了。
1052 0
AutoMapper 使用总结1
原文:AutoMapper 使用总结1 初识AutoMapper 在开始本篇文章之前,先来思考一个问题:一个项目分多层架构,如显示层、业务逻辑层、服务层、数据访问层。层与层访问需要数据载体,也就是类。
887 0