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 的源代码
对象中有值,因为它们是在调用 Mapping.Map 函数之后调用的,这是传递具有值的实际对象的地方,然后调用 AfterMap 函数,这就是它在其中具有值的方式。
谁能解释一下 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 的源代码对象中有值,因为它们是在调用 Mapping.Map 函数之后调用的,这是传递具有值的实际对象的地方,然后调用 AfterMap 函数,这就是它在其中具有值的方式。