Automapper AfterMap 函数正在初始化 类

Automapper AfterMap function initialising classes

谁能解释一下 AfterMap 函数是如何初始化在 lambda 表达式中传递的 class 对象的?当我 运行 这段代码作为我自己时,它会用我的详细信息填充 dest 对象。我不知道它是怎么做到的?但是如果有人能告诉我它是如何初始化 classes 的,那将帮助我朝着正确的方向前进。

    AutoMapper.Mapper.CreateMap(Of Service.User, Models.User)() _
        .ForMember(Function(dest As Models.User) dest.EmployeeNumber, Sub(opt) opt.MapFrom(Function(src As Service.User) src.IdentityNumber)) _
    .AfterMap((Sub(src As Service.User, dest As Models.User)

                   'Extract the group names for the current application.
                   dest.Groups = New List(Of String)

                   Using service = ApplicationSecurityManager.Service.Factory.GetService()

                       Dim applicationPermissions = service.LoadPermissionsForUser(dest.Username, MyBase.EnvironmentCode)

                       If (Not applicationPermissions Is Nothing AndAlso applicationPermissions.Any(Function(x) x.Code = MyBase.ApplicationCode)) Then

                           dest.Groups = applicationPermissions.Single(Function(x) x.Code = MyBase.ApplicationCode).GroupNames.ToList()

                       End If

                   End Using

               End Sub))

--------编辑了答案----

对象中有值,因为它们是在调用 Mapping.Map 函数之后调用的,这是传递具有值的实际对象的地方,然后调用 AfterMap 函数,这就是它在其中具有值的方式。

您可能会注意到 AfterMap 是 Lambda 表达式(动作),使用反射将输入作为源对象和目标对象,可以轻松地将值从一个对象复制到 another.in 这种情况下,只需执行动作,因为 Func 只是一个委托,你刚刚定义了那个方法(在 Lambda 中)。事实上,上面的语句可以重写为

 AutoMapper.Mapper.CreateMap(Of Service.User, Models.User)() _
    .ForMember(Function(dest As Models.User) dest.EmployeeNumber, Sub(opt) opt.MapFrom(Function(src As Service.User) src.IdentityNumber)) _
.AfterMap(AfterProc)

.....

Public Sub AfterProc(ByVal src As Service.User,ByVal dest As Models.User)
 'Extract the group names for the current application.
               dest.Groups = New List(Of String)

               Using service = ApplicationSecurityManager.Service.Factory.GetService()

                   Dim applicationPermissions = service.LoadPermissionsForUser(dest.Username, MyBase.EnvironmentCode)

                   If (Not applicationPermissions Is Nothing AndAlso applicationPermissions.Any(Function(x) x.Code = MyBase.ApplicationCode)) Then

                       dest.Groups = applicationPermissions.Single(Function(x) x.Code = MyBase.ApplicationCode).GroupNames.ToList()

                   End If

               End Using

           End Sub
End Sub

您可以在

看到 AutoMapper 的源代码

https://github.com/AutoMapper/AutoMapper/blob/32959279d8b81087d1c84903f56755cc57d35740/src/AutoMapper/Mappers/TypeMapObjectMapperRegistry.cs(第 98 行)

对象中有值,因为它们是在调用 Mapping.Map 函数之后调用的,这是传递具有值的实际对象的地方,然后调用 AfterMap 函数,这就是它在其中具有值的方式。