• 【AutoMapper基础】值解析器--Custom value resolvers


    【简介】:

    虽然AutoMapper已经覆盖了大部分的映射场景,但是还有1%~5%的情况需要值解析器的帮助。

    很多时候,值解析器实现的功能可以直接在实体层通过逻辑代码直接实现,然而,如果这种逻辑只是映射时需要,这就会混乱我们的源类型以及带来不必要的操作。

    这种情况下,AutoMapper允许成员配置自定义值解析器以达到想要的效果。

    【示例】

    接上例:【AutoMapper基础】简单示例--Flatenning

    如果computer中有多个InternalMemory,那么在ComputerMainInfo中要取得InternalMemorySize时就需要将所有的InternalMemory的Size相加。

    【类图】

    【Code】

    Computer:

    public class Computer
        {
            public string Name { get; set; }
            public double Price { get; set; }
            public DateTime ProduceDate { get; set; }
            public CPU CPU { get; set; }
            public List<InternalMemory> InternalMemories { get; set; }
            public Monitor Monitor { get; set; }
        }
    View Code

    值解析器CustomResolver:

    public class CustomResolver : ValueResolver<Computer, double>
        {
            protected override double ResolveCore(Computer source)
            {
                double totalSize = 0.0;
                foreach (var item in source.InternalMemories)
                {
                    totalSize += item.Size;
                }
                return totalSize;
            }
        }
    View Code

    Program:

    class Program
        {
            static void Main(string[] args)
            {
                Computer computer = new Computer()
                {
                    Name = "联想Y450",
                    Price = 5199.00,
                    ProduceDate = new DateTime(2009, 10, 10),
                    CPU = new CPU()
                    {
                        MainFrequency = 2.2,
                        ModelName = "Core T6600",
                        ProducerName = "Intel"
                    },
                    InternalMemories = new List<InternalMemory>(){
                        new InternalMemory()
                        {
                            Frequency = 1333,
                            ModelName = "DDR3",
                            ProducerName = "尔必达",
                            Size = 4.0
                        },
                        new InternalMemory()
                        {
                            Frequency = 1333,
                            ModelName = "DDR3",
                            ProducerName = "尔必达",
                            Size = 4.0
                        }
                    },
                    Monitor = new Monitor()
                    {
                        ProducerName = "LG",
                        Size = 14.0
                    }
                };
    
                // 添加值解析器映射
                AutoMapper.Mapper.CreateMap<Computer, ComputerMainInfo>().ForMember(dest => dest.InternalMemorySize,
                                opt => opt.ResolveUsing<CustomResolver>()
                            );
    
                ComputerMainInfo computerMainInfo = AutoMapper.Mapper.Map<Computer, ComputerMainInfo>(computer);
    
                Console.WriteLine(computerMainInfo.CPUModelName);
                Console.WriteLine(computerMainInfo.InternalMemorySize);
                Console.Read();
            }
        }
    View Code

    这样通过值解析器就能计算出内存的总大小了。

  • 相关阅读:
    J2EE学习笔记:Filter
    J2EE学习笔记:HTTP协议
    J2EE学习笔记:JSP
    Hibernate 笔记(二) 数据关系
    top命令总结
    让gdb能打印C++中的容器类型
    ps命令注意事项
    自己动手写一个自动登录脚本gg
    request 中url拼接排序参数与签名算法
    python3.7 AES.MODE_ECB(128位) pkcs5padding 加密算法
  • 原文地址:https://www.cnblogs.com/fb-boy/p/3480659.html
Copyright © 2020-2023  润新知