2012-07-31 53 views
2

我在ASP.Net MVC应用程序内使用Automapper将DTO映射到ViewModel对象。Automapper - 如何映射依赖当前会话对象

在我的一个映射中,我需要访问存储在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在映​​射时不再存在?

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

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

回答

0

可能把你在正确的轨道上一对夫妇的想法:

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

我先试过MapFrom--但切换到ResolveUsing没有区别。我会尝试使用IValueResolver方法 - 我没有尝试过,因为它看起来不像它给我提供任何不同的东西,但我没有看到ConstructedBy功能,它看起来像我可以直接指向工厂功能 - 感谢提示! – BonyT 2012-08-01 10:50:24