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


    在分层设计模式中,各层之间的数据通常通过数据传输对象(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:

    属性名 类型 说明
    Name String 目标或源的名称
    TargetType Type 映射到的目标类型
    SourceType Type 映射到当前类型的来源类型

    通过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示例

  • 相关阅读:
    java Thread和Runnable区别
    java sleep() 、yield()
    Java Thread.join()方法
    内存管理_深入剖析volatile关键字
    内存管理_JAVA内存管理
    内存管理_原子性、可见性、有序性
    小程序wx.showToast()方法实现文字换行
    常用表单校验(手机号、固话、身份证、真是姓名、邮箱、银行卡)
    通过CSS实现 文字渐变色 的两种方式
    substring和substr的区别
  • 原文地址:https://www.cnblogs.com/xfrog/p/14537340.html
Copyright © 2020-2023  润新知