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

【簡介】:html

雖然AutoMapper已經覆蓋了大部分的映射場景,可是還有1%~5%的狀況須要值解析器的幫助。app

不少時候,值解析器實現的功能能夠直接在實體層經過邏輯代碼直接實現,然而,若是這種邏輯只是映射時須要,這就會混亂咱們的源類型以及帶來沒必要要的操做。ide

這種狀況下,AutoMapper容許成員配置自定義值解析器以達到想要的效果。spa

【示例】3d

接上例:【AutoMapper基礎】簡單示例--Flatenningcode

若是computer中有多個InternalMemory,那麼在ComputerMainInfo中要取得InternalMemorySize時就須要將全部的InternalMemory的Size相加。htm

【類圖】blog

【Code】內存

Computer:get

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

 

這樣經過值解析器就能計算出內存的總大小了。

相關文章
相關標籤/搜索