怎么在网站上做seo,制作网站公司多少钱,如何修改wordpress站名,买友情链接有用吗访问数据库、IPC 通信、业务模型、视图模型……对于同一个业务的同一种数据#xff0c;经常会使用多种数据模型工作在不同的代码模块中。这时它们之间的互相转换便是大量的重复代码了。使用 AutoMapper 便可以很方便地在不同的模型之间进行转换而减少编写太多的转换代码#…访问数据库、IPC 通信、业务模型、视图模型……对于同一个业务的同一种数据经常会使用多种数据模型工作在不同的代码模块中。这时它们之间的互相转换便是大量的重复代码了。使用 AutoMapper 便可以很方便地在不同的模型之间进行转换而减少编写太多的转换代码如果这一处的代码对性能不太敏感的话。关于 AutoMapper 的系列文章使用 AutoMapper 自动在多个数据模型间进行转换使用 AutoMapper 自动映射模型时处理不同模型属性缺失的问题安装 AutoMapper 库这是 AutoMapper 的官方 GitHub 仓库AutoMapper/AutoMapper: A convention-based object-object mapper in .NET.安装 AutoMapper 的 NuGet 包即可在项目中使用 AutoMapper。入门以下是一个最简单的控制台演示程序的代码。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24// Program.cs
var mapper InitializeMapper();var dao new Walterlv1Dao
{Id 2ed3558ac938438fb2c1d2de71d7bb90,Name walterlv,Text blog.walterlv.com,
};
var vo mapper.MapWalterlv1Vo(dao);
Console.WriteLine($Name {vo.Name}, Text {vo.Text});static IMapper InitializeMapper()
{var configuration new MapperConfiguration(cfg {cfg.CreateMapWalterlv1Dao, Walterlv1Vo();});
#if DEBUGconfiguration.AssertConfigurationIsValid();
#endifvar mapper configuration.CreateMapper();return mapper;
}在这段代码中我们定义了一个方法 InitializeMapper在里面初始化 IMapper 的新实例。初始化 MapperConfiguration定义类型的映射关系在 DEBUG 下验证 MapperConfiguration 的映射是否正确创建一个 IMapper 的映射器用于后续映射使用我们初始化了一个 Walterlv1Dao 类的实例我们调用 mapper.Map 将其映射到 Walterlv1Vo 类型这两个类型的定义如下虽然无关紧要。1
2
3
4
5
6
7
8
9
10
11
12public class Walterlv1Dao
{public string? Id { get; set; }public string? Name { get; set; }public string? Text { get; set; }
}
public class Walterlv1Vo
{public string? Id { get; set; }public string? Name { get; set; }public string? Text { get; set; }
}如果你的应用程序中会使用到依赖注入那么只需要把拿到的 IMapper 加入即可。如果希望两个类型之间能够双向映射那么在初始化 IMapper 的时候也应该再额外调用一下 ReverseMap 方法否则就会抛出异常 AutoMapper.AutoMapperMappingException:“Missing type map configuration or unsupported mapping.”。1cfg.CreateMapWalterlv1Dao, Walterlv1Vo().ReverseMap();复杂类型和集合现在我们让模型稍复杂一些1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22public class Walterlv1Dao
{public string? Id { get; set; }public string? Name { get; set; }public FriendDao? Friend { get; set; }
}
public class FriendDao
{public string? Id { get; set; }public string? Name { get; set; }
}
public class Walterlv1Vo
{public string? Id { get; set; }public string? Name { get; set; }public FriendVo? Friend { get; set; }
}
public class FriendVo
{public string? Id { get; set; }public string? Name { get; set; }
}AutoMapper 能处理这样的属性嵌套情况只需要设置嵌套类型也能映射即可1
2cfg.CreateMapWalterlv1Dao, Walterlv1Vo().ReverseMap();
cfg.CreateMapFriendDao, FriendVo().ReverseMap();如果两个模型中子模型的类型是一样的那么只会进行简单的赋值而不会创建新的对象。例如上面例子里如果 FriendDao 和 FriendVo 合并成 Friend 类型两个类型都使用这个合并的类型那么映射之后Friend 将是同一个对象。除了复杂类型列表也是可以的1
2
3
4
5
6
7
8
9
10
11
12public class Walterlv1Dao
{public string? Id { get; set; }public string? Name { get; set; }public ListFriendDao? Friend { get; set; }
}
public class Walterlv1Vo
{public string? Id { get; set; }public string? Name { get; set; }public ListFriendVo? Friend { get; set; }
}参考资料AutoMapper/AutoMapper: A convention-based object-object mapper in .NET.