Automapper - 如何映射依赖于当前Session对象

时间:2012-07-31 16:17:58

标签: asp.net-mvc-3 automapper

我在ASP.Net MVC应用程序中使用Automapper将DTO映射到ViewModel对象。

在我的一个映射中,我需要访问存储在Session对象中的对象。

public override void OnAuthorization(AuthorizationContext filterContext)
        {
...
    SecurityToken token = SecurityTokenFactory.CreateSecurityToken(userNode);
    filterContext.HttpContext.Session[securityToken] = token;
...
}

在我的控制器的构造函数中,我设置了Automapper映射。

  Mapper.CreateMap<UserReportDTO, UserDefinedReportModel>()
     .ForMember(dest => dest.IsEditable, opt=>opt.ResolveUsing(src => this.IsEditable(src)));

 private bool IsEditable(UserReportDTO report)
 {
    if (this.GetCurrentUserToken().UserVisibilityLevel == VisibilityLevel.Root)
    {
         return true;
    }
    return false;
 }


 public JsonResult GetVisibleUserReports()
        {
            ...
            int ID = this.GetCurrentUserToken().UserId; //This works!
            var reports = Mapper.Map < UserReportDTO[], UserDefinedReportModel[] >(inputarray); //This doesn't work
            ...
         }

上下文是context.Session为空。

我猜这与Automapper解析映射的方式有关 - 可能在创建映射时设置了对一个Context的引用,然后在映射时不再存在此Context?

如何解决问题 - 有没有办法将参数传递给映射操作?

我的临时解决方法是映射所有其他字段,然后手动循环遍历映射集合,设置需要当前上下文的字段,但我不愿意采用这种方法。

1 个答案:

答案 0 :(得分:0)

一些想法可能会让你走上正轨:

  • 如果将ResolveUsing替换为MapFrom,会有什么不同吗?两者似乎都接受了Func<TSource, TMember>,但也许存在微妙的差异。
  • 是否可以将IsEditable方法转换为IValueResolver,然后使用AutoMapper的ConstructedBy()功能将所需的会话数据传递到构造函数中?这是relevant documentation。滚动到“自定义构造函数方法”部分。