• 又一个轮子--QMapper


    1 前言

    我喜欢造轮子,一是造的时候就是深刻学习的时候,二是造着造着,说不定某天比世面上的其它轮子都要好呢。比如造过Networksocket,也造过WebApiClient,现在我也要造一个Mapper,由于已经有好多Mapper存在,所以这个项目只能叫偏门的QMapper了。

    2 QMapper的定位

    2.1 约定限制

    • 属性名称相同的才能映射
    • 属性名称大小写不敏感
    • 不支持嵌套属性映射

    2.2 功能要求

    • 无预先配置,性能要好
    • 支持映射时传入要映射的属性名
    • 支持映射时传入忽略映射的属性名
    • 封装的调用Api使用简单

    2.3 应用场景

    • PO、VO、DTO相互转换
    • PO、VO、DTO相互转换时保护一些字段
    • 根据前端提交的字段,动态PO、VO、DTO相互转换

    2.4 使用例子

    var a = new A();
    
    var b = a.AsMap().To<B>();
    var b = a.AsMap("Name","Age").To<B>();
    var b = a.AsMap().Ignore(item=>item.Id).To<B>();
    
    

    3 Benchmark

    BenchmarkDotNet=v0.11.5, OS=Windows 10.0.17134.885 (1803/April2018Update/Redstone4)
    Intel Core i3-4150 CPU 3.50GHz (Haswell), 1 CPU, 4 logical and 2 physical cores
    .NET Core SDK=3.0.100-preview6-012264
      [Host]     : .NET Core 3.0.0-preview6-27804-01 (CoreCLR 4.700.19.30373, CoreFX 4.700.19.30308), 64bit RyuJIT
      DefaultJob : .NET Core 3.0.0-preview6-27804-01 (CoreCLR 4.700.19.30373, CoreFX 4.700.19.30308), 64bit RyuJIT
    
    
    |                          Method |           Mean |          Error |        StdDev |         Median |
    |-------------------------------- |---------------:|---------------:|--------------:|---------------:|
    |                            QMap |       201.0 ns |       4.368 ns |      11.74 ns |       198.2 ns |
    |                         EmitMap |       832.6 ns |      42.569 ns |     119.37 ns |       780.7 ns |
    | AutoMap_Singleton_Configuration |       428.1 ns |      12.006 ns |      33.86 ns |       415.0 ns |
    | AutoMap_Transient_Configuration | 4,694,588.0 ns | 117,854.402 ns | 341,916.99 ns | 4,559,848.4 ns |
    
    

    3.1 特殊性说明

    AutoMap_Singleton_Configuration和其它三个测试条件不一样,为了能够进行测试,只能直接调用它配置好的IMapper实例,但在应用环境中,我们必须从DI或缓存中根据类型映射获取类型对应的IMapper实例,一般的缓存查找将消耗3倍数的时间。

    3.2 QMap为什么快

    QMap存在必须的约定和限制,其在架构设计时就可以抛弃缓存,使用泛型类型的静态方法或静态属性取代缓存功能,从而获取到比使用缓存更高的性能。另外,QMap在属性类型转换时,构造Expression时分析使用最优的转换方法,从而在运行时的转换逻辑包含最少的IL指令,同时将装箱拆箱操作降低到最少。

    4 github源代码

    https://github.com/xljiulang/QMapper
    目前QMapper还是初期,功能少,代码也少,阅读容易。

  • 相关阅读:
    记账本开发记录——第十三天(2020.1.31)
    《构建之法——现代软件工程》读书笔记(二)
    记账本开发记录——第十二天(2020.1.30)
    记账本开发记录——第十一天(2020.1.29)
    记账本开发记录——第十天(2020.1.28)
    记账本开发记录——第九天(2020.1.27)
    记账本开发记录——第八天(2020.1.26)
    记账本开发记录——第七天(2020.1.24)
    记账本开发记录——第六天(2020.1.23)
    记账本开发记录——第五天(2020.1.22)
  • 原文地址:https://www.cnblogs.com/kewei/p/11281084.html
Copyright © 2020-2023  润新知