欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-02-27 15:57:57
出于安全考虑,在后台与前台进行数据传输时,往往不会直接传输实体模型,而是使用dto(data transfer object 数据传输对象),这样在后台往前台传递数据时可以...

出于安全考虑,在后台与前台进行数据传输时,往往不会直接传输实体模型,而是使用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实现自动映射的实例代码,希望对大家有所帮助