0

是否可以配置 Automapper,以便它可以根据运行时参数从集合映射到单个实例?

在我们的应用程序中,我们的实体具有每种语言的标签。根据当前用户的偏好,应该显示一个值。

DepartmentEntity
  Labels: Label[]
    Value: string
    Culture: CultureInfo

DepartmentViewModel
  Label: string

鉴于我在映射实体时知道当前的用户文化,我是否可以配置 Automapper 以便它可以从 DepartmentEntity 映射到 DepartmentViewModel?

就像是

var department = Mapper.Map<DepartmentEntity, DepartmentViewModel>(user.Culture);

像这样的其他答案似乎想要传递一个参数以直接用作目标值。我想将其用作将列表减少为单个字段的一种方式。

4

1 回答 1

3

您可以按照您提到的答案执行此操作:

var department = Mapper.Map<DepartmentEntity, DepartmentViewModel>(departmentEntity,
  opt => opt.AfterMap((src, dest) => dest.Label = src.Labels.FirstOrDefault(x=> 
                                       x.CultureInfo.Name == user.Culture.Name)?.Value));

请记住,您必须ignore在定义地图时进行调用。

更新

您是对的,经过更多研究后,使用 Automapper 实现这一目标实际上是可能的并且相当容易。我从这个SO answer得到的功能。

cfg.CreateMap<DepartmentEntity, DepartmentViewModel>().ForMember(x => x.Label, opt => 
opt.ResolveUsing((src, dest, member, context) => 
                  src.Labels.FirstOrDefault(x=> x.Culture.Name == 
                           context.Items["userCulture"].ToString())?.Value));

并且在转换对象时使用

var userCulture = new CultureInfo("en-US");
var department = Mapper.Map<DepartmentViewModel>(depEntity,
            opt => opt.Items["userCulture"] = userCulture.Name);
于 2017-12-08T13:52:56.137 回答