有些场景需要在映射发生之前或者映射完成之后执行自定义逻辑。这类场景应当尽量少用,把该部分逻辑放到AutoMapper外部处理会更加清晰易懂。你可以为映射配置全局的映射前/映射后操作:
Mapper.Initialize(cfg => {
cfg.CreateMap<Source, Dest>()
.BeforeMap((src, dest) => src.Value = src.Value + 10)
.AfterMap((src, dest) => dest.Name = "John");
});Code language: JavaScript (javascript)
也可以在映射定义时编写映射前、映射后的回调逻辑:
using AutoMapper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Mapper.Initialize(cfg => {
cfg.CreateMap<Source, Dest>()
.BeforeMap((src, dest) => src.Value = "前缀_" + src.Value )
.AfterMap((src, dest) => dest.Value = dest.Value + "_后缀");
});
var s = new Source() { Value = "foxdevelop"};
var d = Mapper.Map<Dest>(s);//前缀_北盟网校_后缀
Console.ReadKey();
}
}
public class Source
{
public string Value { get; set; }
}
public class Dest
{
public string Value { get; set; }
}
}Code language: JavaScript (javascript)
当你需要在映射操作的前后传入上下文相关信息时,就适合使用上面这种配置方式。
说明
BeforeMap:映射开始之前执行回调,可以修改源对象数据AfterMap:映射完成之后执行回调,可以修改目标对象数据- 执行顺序:
BeforeMap→ AutoMapper属性映射赋值 →AfterMap