服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - 详解c# AutoMapper 使用方式

详解c# AutoMapper 使用方式

2022-02-13 15:40大稳·杨 C#

本篇文章主要介绍了详解c# AutoMapper 使用方式 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

安装方式:使用vs自带的nuget管理工具,搜索automapper ,选择第一个安装到你的项目即可。

先说说dto

dto是个什么东东?

dto(data transfer object)就是数据传输对象,说白了就是一个对象,只不过里边全是数据而已。

为什么要用dto?

1、dto更注重数据,对领域对象进行合理封装,从而不会将领域对象的行为过分暴露给表现层

2、dto是面向ui的需求而设计的,而领域模型是面向业务而设计的。因此dto更适合于和表现层的交互,通过dto我们实现了表现层与领域model之间的解耦,因此改动领域model不会影响ui层

3、dto说白了就是数据而已,不包含任何的业务逻辑,属于瘦身型的对象,使用时可以根据不同的ui需求进行灵活的运用

我从网上找了一些资料,

automapper

现在我们既然知道了使用dto的好处,那么我们肯定也想马上使用它,但是这里会牵扯一个问题:怎样实现dto和领域model之间的转换?

有两个思路,我们要么自己写转换代码,要么使用工具。不过就应用而言,我还是觉得用工具比较简单快捷,那就使用工具吧。其实这样的转换工具很多,不过我还是决定使用automapper,因为它足够轻量级,而且也非常流行,国外的大牛们都使用它。使用automapper可以很方便的实现dto和领域model之间的转换,它是一个强大的object-object mapping工具。

下载了个demo,然后自己又写了一遍,我把automapper 的使用分为两种:

1、viewmodel与实体的字段名字是一致的,viewmodel的字段可以比实体中的字段少,但是不能多。

还有一种情况是:源实体中的字段名字是getxxx,那么viewmodel中对应的字段可以是xxx,也会自动对应赋值,比如我写的demo中源实体中geta,viewmodel中的a;

再有一种情况就是实体中的实体赋值,在我写的这个例子中,源实体中包含的实体类字段为sub,里面包含的字段名字为age,

那么destmodel中对应的字段名字可以是:subage,那么automapper就可以自动为你赋值了,大家看最后的运行结果。

给大家看下我建的源实体:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class source1
{
  public string name { set; get; }
 
  public string geta { set; get; }
  public string getd { set; get; }
 
 
  public string setb { set; get; }
 
  public string c { set; get; }
 
  public subsource1 sub { set; get; }
}
 
 
public class subsource1
{
  public string age { set; get; }
 
}

还有viewmodel(要转化成为你想要的模型):

?
1
2
3
4
5
6
7
8
9
10
11
12
public class dest1
{
  public string name { set; get; }
 
  public string a { set; get; }
 
  public string c { set; get; }
 
  public string subage { set; get; }
 
  public string d { set; get; }
}

我封装的扩展方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/// <summary>
/// 类型映射,默认字段名字一一对应
/// </summary>
/// <typeparam name="tdestination">转化之后的model,可以理解为viewmodel</typeparam>
/// <typeparam name="tsource">要被转化的实体,entity</typeparam>
/// <param name="source">可以使用这个扩展方法的类型,任何引用类型</param>
/// <returns>转化之后的实体</returns>
public static tdestination mapto<tdestination, tsource>(this tsource source)
  where tdestination:class
  where tsource :class
{
  if (source == null) return default(tdestination);
  var config = new mapperconfiguration(cfg => cfg.createmap<tdestination, tsource>());
  var mapper = config.createmapper();
  return mapper.map<tdestination>(source);
}

使用方式:

?
1
2
3
4
5
6
7
8
9
10
var source1 = new source1
{
  name = "source",
  sub = new subsource1 { age = "25" },
  c = "c",
  geta = "a",
  setb = "b"
};
 
var destviewmodel = source1.mapto<dest1, source1>();

运行结果:

详解c# AutoMapper 使用方式

2.viewmodel与实体字段名字没有全部对应,只有几个字段的名字和源实体中的字段名字是一样的,其他的字段是通过实体中的几个字段组合或者是格式或者是类型转化而来的,

使用方法:不能再使用这个扩展方法了,只能自己额外写代码,代码如下:

?
1
2
3
4
5
6
7
8
9
var config2 = new mapperconfiguration(
  cfg => cfg.createmap<sourceuser, destuser2>()
    .formember(d => d.destname, opt => opt.mapfrom(s => s.name))  //指定字段一一对应
    .formember(d => d.birthday, opt => opt.mapfrom(src => src.birthday.tostring("yy-mm-dd hh:mm")))//指定字段,并转化指定的格式
    .formember(d => d.age, opt => opt.condition(src => src.age > 5))//条件赋值
    .formember(d => d.a1, opt => opt.ignore())//忽略该字段,不给该字段赋值
    .formember(d => d.a1, opt => opt.nullsubstitute("default value"))//如果源字段值为空,则赋值为 default value
    .formember(d => d.a1, opt => opt.mapfrom(src => src.name + src.age * 3 + src.birthday.tostring("d"))));//可以自己随意组合赋值
var mapper2 = config2.createmapper();

注释中都包含了平时常用的几种情况,其他的我就没有再写。

下面再给大家把list转化的扩展方法代码贴上:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/// <summary>
/// 集合列表类型映射,默认字段名字一一对应
/// </summary>
/// <typeparam name="tdestination">转化之后的model,可以理解为viewmodel</typeparam>
/// <typeparam name="tsource">要被转化的实体,entity</typeparam>
/// <param name="source">可以使用这个扩展方法的类型,任何引用类型</param>
/// <returns>转化之后的实体列表</returns>
public static ienumerable<tdestination> maptolist<tdestination, tsource>(this ienumerable<tsource> source)
  where tdestination : class
  where tsource : class
{
  if (source == null) return new list<tdestination>();
  var config = new mapperconfiguration(cfg => cfg.createmap<tdestination, tsource>());
  var mapper = config.createmapper();
  return mapper.map<list<tdestination>>(source);
}

同样的使用方式:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        var source1 = new source1
        {
          name = "source",
          sub = new subsource1 { age = "25" },
          c = "c",
          geta = "a",
          setb = "b"
        };
var source3 = new source1
        {
          name = "source3",
          sub = new subsource1 { age = "253" },
          c = "c3",
          geta = "a3",
          setb = "b3"
        };
        var sourcelist = new list<source1> { source1, source3 };
        var destviewmodellist = sourcelist.maptolist<dest1, source1>();

运行结果:

详解c# AutoMapper 使用方式

 以上就是我个人所得,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:http://www.cnblogs.com/dawenyang/p/7966850.html

延伸 · 阅读

精彩推荐
  • C#VS2012 程序打包部署图文详解

    VS2012 程序打包部署图文详解

    VS2012虽然没有集成打包工具,但它为我们提供了下载的端口,需要我们手动安装一个插件InstallShield。网上有很多第三方的打包工具,但为什么偏要使用微软...

    张信秀7712021-12-15
  • C#如何使用C#将Tensorflow训练的.pb文件用在生产环境详解

    如何使用C#将Tensorflow训练的.pb文件用在生产环境详解

    这篇文章主要给大家介绍了关于如何使用C#将Tensorflow训练的.pb文件用在生产环境的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴...

    bbird201811792022-03-05
  • C#C#设计模式之Strategy策略模式解决007大破密码危机问题示例

    C#设计模式之Strategy策略模式解决007大破密码危机问题示例

    这篇文章主要介绍了C#设计模式之Strategy策略模式解决007大破密码危机问题,简单描述了策略模式的定义并结合加密解密算法实例分析了C#策略模式的具体使用...

    GhostRider10972022-01-21
  • C#三十分钟快速掌握C# 6.0知识点

    三十分钟快速掌握C# 6.0知识点

    这篇文章主要介绍了C# 6.0的相关知识点,文中介绍的非常详细,通过这篇文字可以让大家在三十分钟内快速的掌握C# 6.0,需要的朋友可以参考借鉴,下面来...

    雨夜潇湘8272021-12-28
  • C#SQLite在C#中的安装与操作技巧

    SQLite在C#中的安装与操作技巧

    SQLite,是一款轻型的数据库,用于本地的数据储存。其优点有很多,下面通过本文给大家介绍SQLite在C#中的安装与操作技巧,感兴趣的的朋友参考下吧...

    蓝曈魅11162022-01-20
  • C#C#微信公众号与订阅号接口开发示例代码

    C#微信公众号与订阅号接口开发示例代码

    这篇文章主要介绍了C#微信公众号与订阅号接口开发示例代码,结合实例形式简单分析了C#针对微信接口的调用与处理技巧,需要的朋友可以参考下...

    smartsmile20127762021-11-25
  • C#利用C#实现网络爬虫

    利用C#实现网络爬虫

    这篇文章主要介绍了利用C#实现网络爬虫,完整的介绍了C#实现网络爬虫详细过程,感兴趣的小伙伴们可以参考一下...

    C#教程网11852021-11-16
  • C#深入理解C#的数组

    深入理解C#的数组

    本篇文章主要介绍了C#的数组,数组是一种数据结构,详细的介绍了数组的声明和访问等,有兴趣的可以了解一下。...

    佳园9492021-12-10