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

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

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

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

1、启用

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

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

2、配置自定义转换逻辑

你能够经过映射设置上的AddConvert来配置对应设置实体转换的后置逻辑,以下所示。设计模式

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

3、使用

你能够经过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);

4、经过特性指定属性映射关系

默认映射按照属性名称进行,你也能够经过MapperPropertyNameAttribute特性进行指定。app

MapperPropertyNameAttribute:ide

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

经过SourceType或TargetType你能够根据需求灵活的在源类型或目标类型上设置映射关系。性能

5、拷贝

实体映射也提供了拷贝方法,经过该方法能够将源实体属性拷贝到目标实体。ui

  • 经过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);

6、示例

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

相关文章
相关标签/搜索