2012-07-31 36 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