当前位置: 移动技术网 > IT编程>开发语言>Java > Automapper实现自动映射的实例代码

Automapper实现自动映射的实例代码

2019年07月19日  | 移动技术网IT编程  | 我要评论

win732位系统下载,汽车音响论坛,麻城星烨

出于安全考虑,在后台与前台进行数据传输时,往往不会直接传输实体模型,而是使用dto(data transfer object 数据传输对象),这样在后台往前台传递数据时可以省略不必要的信息,只保留必要的信息,大大增强数据安全性。

下面给出两个相互对应的关系模型user、userdto

public class user
{
  private const int namemaxlength = 20;
  private const int passwordmaxlength = 16;
  [key]
  public long id { get; }
  [maxlength(namemaxlength)]
  public string name { get; set; }
  [maxlength(passwordmaxlength)]
  [datatype(datatype.password)]
  public string password { get; set; }
}
public class userdto
{
  private const int namemaxlength = 20;
  private const int passwordmaxlength = 16;
  [maxlength(namemaxlength)]
  public string name { get; set; }
  [maxlength(passwordmaxlength)]
  public string password { get; set; }
}

这里将 id 定义为自增长主键,在注册页面,这个 id 应不可见,这个时候使用dto的好处就体现出来了,这个时候,在存入数据库时会涉及到 userdto 往 user 的类型转换,按照之前的经验,肯定可以按照下面这样来写:

user.name=userdto.name;
user.password=userdto.password;

这样的转换固然可以,但是如果一个 user 对象足够复杂,有十几个甚至二十几个属性,这个时候这种写法就会显得十分笨拙。

这个时候我们就可以借助automapper来帮助我们完成 userdto 到 user 的转换了。

首先安装nuget包

在 tools - nuget package manage - package manage console 输入

install-package automapper 

安装相应的nuget包。

根据 github 上给出的帮助文档来看,有两种方法可以创建映射,一种是静态的 initalize 一种是动态创建。

下面使用两种不同的方法来进行单元测试

public void using_initlalize_test()
  {
    userdto dto = new userdto
    {
      name = "niko",
      password = "1234",
    };
    mapper.initialize(ctx => ctx.createmap<userdto, user>());
    user user = mapper.map<userdto, user>(dto);
    user.name.shouldbe("niko");
    user.password.shouldbe("1234");
    user.id.tostring().shouldbe("0");
  }
  public void using_mapperconfiguration_test()
  {
    var config = new mapperconfiguration(ctx => ctx.createmap<userdto, user>());
    var mapper = config.createmapper();
    // var mapper = new mapper(config);
    userdto dto = new userdto
    {
      name = "niko",
      password = "1234",
    };
    user user = mapper.map<user>(dto);
    //user user = mapper.map<user>(dto);
    user.name.shouldbe("niko");
    user.password.shouldbe("1234");
    user.id.tostring().shouldbe("0");
  }

这里使用到 shouldly 断言框架,具体用法参考官方文档。

写完规则之后 通常会调用 assertconfigurationisvalid 方法,检查规则是否完整 

  mapper.assertconfigurationisvalid();

两种方法,单元测试均通过。这样的话,借助 automapper 处理复杂的对象映射,将大大简化我们的代码量。

为了更加便捷地使用 automappper ,对automapper进行扩展

public static class automapperextension
{
  /// <summary>
  /// 对象到对象
  /// </summary>
  /// <typeparam name="t"></typeparam>
  /// <param name="obj"></param>
  /// <returns></returns>
  public static t mapto<t>(this object obj)
  {
    if (obj == null) return default(t);
    mapper.initialize(ctx=>ctx.createmap(obj.gettype(),typeof(t)));
    return mapper.map<t>(obj);
  }
  /// <summary>
  /// 集合到集合
  /// </summary>
  /// <typeparam name="t"></typeparam>
  /// <param name="obj"></param>
  /// <returns></returns>
  public static list<t> mapto<t>(this ienumerable obj )
  {
    if (obj == null) throw new argumentnullexception();
    mapper.initialize(ctx => ctx.createmap ( obj.gettype(), typeof(t))) ;
    return mapper.map<list<t>>(obj);
  }
}

使用上面的方法进行单元测试:

 public void testme()
  {
    userdto dto = new userdto
    {
      name = "niko",
      password = "1234",
    };
    user user=dto.mapto<user>();
    user.name.shouldbe("niko");
    user.password.shouldbe("1234");
    user.id.tostring().shouldbe("0");
  }

总结

以上所述是小编给大家介绍的automapper实现自动映射的实例代码,希望对大家有所帮助

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网