【问题标题】:Automapper - How to map with dependency on current Session objectAutomapper - 如何映射依赖于当前 Session 对象
【发布时间】:2012-08-01 02:29:08
【问题描述】:

我在 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 不再存在?

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

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

【问题讨论】:

    标签: asp.net-mvc-3 automapper


    【解决方案1】:

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

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

    【讨论】:

    • 我首先尝试了 MapFrom - 但切换到 ResolveUsing 没有任何区别。我将尝试 IValueResolver 方法 - 我没有尝试过,因为它看起来并没有为我提供任何不同的东西,但我没有看到 ConstructedBy 功能,看起来我可以直接使用工厂功能 - 感谢您的提示!
    猜你喜欢
    • 2017-07-20
    • 1970-01-01
    • 2021-05-05
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    相关资源
    最近更新 更多