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在映射時不再存在?
我該如何解決問題 - 有沒有辦法將參數傳遞給映射操作?
我的臨時解決方法是映射所有其他字段,然後手動循環映射集合,設置需要當前上下文的字段,但我不喜歡保持這種方法。
我先試過MapFrom--但切換到ResolveUsing沒有區別。我會嘗試使用IValueResolver方法 - 我沒有嘗試過,因爲它看起來不像它給我提供任何不同的東西,但我沒有看到ConstructedBy功能,它看起來像我可以直接指向工廠功能 - 感謝提示! – BonyT 2012-08-01 10:50:24