ASP.NET Core扩展库之实体映射

摘要:
您可以直接使用UseExtensions使用IHosthost=Host。CreateDefaultBuilder()//UseExtensions将自动注入Mapper。使用扩展()。配置服务(sc=>

在分层设计模式中,各层之间的数据通常通过数据传输对象(DTO)来进行数据的传递,而大多数情况下,各层数据的定义结构大同小异,如何在这些定义结构中相互转换,之前我们通过使用AutoMapper库,但AutoMapper功能庞大,使用较为复杂,而在很多场景下,可能我们只需要一些基础的对象映射功能,那么此时你可以选择扩展库中的轻量级AutoMapper实现。

实体映射包含以下核心功能:

  • 在使用之前无需手动定义类型之间的映射关系
  • 采用动态编译、缓存转换委托,提升性能。
  • 支持通过特性定义属性映射关系
  • 支持插入自定义的转换处理方法
  • 支持列表转换
  • 支持嵌套类型转换
  • 支持循环引用及引用关系维持
  • 支持转换模式或拷贝模式
  • 支持生成预定义的拷贝委托
  • 为了保持其轻量性,目前支持以下转换
    • 值类型转换
    • 数值类型之间的兼容转换(如int-->uint)
    • 支持值类型与其可空类型间的兼容转换
    • 字典类型转换
    • 列表类型转换
    • 枚举类型与string类型间的转换
    • 不支持结构体之间的转换以及结构体与类之间的转换

一、启用

启用轻量级的实体映射,有两种方式:

  • 如果你是和扩展库其他功能同时使用,可直接通过UseExtensions即可
    using IHost host = Host.CreateDefaultBuilder()
                         // UseExtensions会自动注入Mapper
                         .UseExtensions()
                         .ConfigureServices(sc =>
                         {
                             // 通过ConfigureLightweightMapper来配置映射
                             sc.ConfigureLightweightMapper(options =>
                             {
                                //
                             });
                         })
                         .Build();
  • 如果你需要单独使用,可通过IServiceCollection上的AddLightweightMapper方法启用
    //实体转换
    serviceDescriptors.AddLightweightMapper()
        .ConfigureLightweightMapper(options =>
                             {
                                //
                             });

二、配置自定义转换逻辑

你可以通过映射设置上的AddConvert来配置对应设置实体转换的后置逻辑,如下所示。

    //实体转换
    serviceDescriptors.AddLightweightMapper()
        .ConfigureLightweightMapper(options =>
        {
            // 通过AddConvert可自定义转换逻辑
            // 以下定义从SourceA转换到TargetB时,自动设置属性C的值
            options.AddConvert<SourceA, TargetB>((mapper, a, b) =>
            {
                b.C = "C";
            });
        });

三、使用

你可以通过IMapperProvider的GetMapper方法或IMapper<,>直接获取Mapper实例。

  • 通过IMapperProvider
// 通过IMapperProvider
var mapperProvider = host.Services.GetRequiredService<IMapperProvider>();
var mapper = mapperProvider.GetMapper<SourceA, TargetA>();
var targetA = mapper.Convert(sourceA);
  • 通过IMapper<,>
var mapperB = host.Services.GetRequiredService<IMapper<SourceA, TargetB>>();
var targetB = mapperB.Convert(sourceA);

四、通过特性指定属性映射关系

默认映射按照属性名称进行,你也可以通过MapperPropertyNameAttribute特性进行指定。

MapperPropertyNameAttribute:

属性名类型说明
NameString目标或源的名称
TargetTypeType映射到的目标类型
SourceTypeType映射到当前类型的来源类型

通过SourceType或TargetType你可以根据需求灵活的在源类型或目标类型上设置映射关系。

五、拷贝

实体映射也提供了拷贝方法,通过该方法可以将源实体属性拷贝到目标实体。

  • 通过IMapper<,>的CopyTo方法进行默认拷贝:
var mapperB = host.Services.GetRequiredService<IMapper<SourceA, TargetB>>();
var targetB1 = new TargetB();
mapperB.CopyTo(sourceA, targetB1);
  • 通过DefineCopyTo方法定义排除字段外的拷贝委托
var mapperB = host.Services.GetRequiredService<IMapper<SourceA, TargetB>>();
 // 只拷贝指定字段之外的属性
var copyProc = mapperB.DefineCopyTo(a =>
new
{
    a.A //忽略属性A
});
var targetB2 = new TargetB();
copyProc(sourceA, targetB2);

六、示例

以上示例完整项目,请参考GitHub示例

免责声明:文章转载自《ASP.NET Core扩展库之实体映射》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇firfox中"content-disposition", "attachment;filename=“+filename不能显示文件名字静态页面使用ajax刷新页面访问量,通过easyui实现下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

使用Nginx+Lua实现waf

使用Nginx+Lua实现waf 软件包需求: 1 、Nginx兼容性【最后测试到1.13.6】 wget http://nginx.org/download/nginx-1.13.6.tar.gz 2 、PCRE为Nginx编译安装关系的依赖 wget https://jaist.dl.sourceforge.net/project/pcre/pcre...

php中处理换一换的简单实例

微博中,有很多标签供用户选择,点击换一换的时候,都会不断切换。 php程序的简单实现如下: //查询所有标签 $labels = Labels::find()->setColumns('id,w_name,w_uid')->order('w_time desc')->group('w_name')->getAll(); $label...

java 序列化时排除指定属性

ava 序列化对象如何排除指定属性呢? java 中序列化对象有多种方式:struts2 ,jackson,json-lib (1)使用struts2 json插件 依赖的jar包:struts2-json-plugin-2.3.15.3.jar,xwork-core-2.3.15.3.jar,当然还有servlet-api.jar 范例: private...

js实现图片向上播放(轮番滚动)

js实现图片向上播放(轮番滚动)   实现方式,多种多样,这里我们来看javascript实现方式,重点是研究里面的源代码; 看看别人是如何写出“优雅的代码” <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/...

if的用法

if用法举例:求分数的等级 1 # include <stdio.h> 2 3 int main(void) 4 { 5 float score; //score分数 6 7 printf("请输入您的考试成绩: "); 8 scanf("%f", &score); 9 10 if...

WPF 使用用户控件UserControl来切换界面(二)

在上一篇文章中https://www.cnblogs.com/lizhiqiang0204/p/12367553.html我们使用按键Button来切换界面的,这次我们使用自定义的ItemsControl数据模板来切换页面。MainWindow.xaml如下 <Window.DataContext> <local:Mai...