Asp.net mvc 3 自动映射-如何映射与当前会话对象的依赖关系

Asp.net mvc 3 自动映射-如何映射与当前会话对象的依赖关系,asp.net-mvc-3,automapper,Asp.net Mvc 3,Automapper,我在ASP.NETMVC应用程序中使用Automapper将DTO映射到ViewModel对象 在我的一个映射中,我需要访问存储在会话对象中的对象 public override void OnAuthorization(AuthorizationContext filterContext) { ... SecurityToken token = SecurityTokenFactory.CreateSecurityToken(userNode); filterC

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

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

public override void OnAuthorization(AuthorizationContext filterContext)
        {
...
    SecurityToken token = SecurityTokenFactory.CreateSecurityToken(userNode);
    filterContext.HttpContext.Session[securityToken] = token;
...
}
在控制器的构造函数中,我设置了自动映射

  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
            ...
         }
Mapper.CreateMap()
.ForMember(dest=>dest.IsEditable,opt=>opt.resolvesusing(src=>this.IsEditable(src));
私有bool可编辑(UserReportDTO报告)
{
if(this.GetCurrentUserToken().UserVisibilityLevel==VisibilityLevel.Root)
{
返回true;
}
返回false;
}
公共JsonResult GetVisibleUserReports()
{
...
int ID=this.GetCurrentUserToken().UserId;//这很有效!
var reports=Mapper.Map(inputarray);//这不起作用
...
}
发生的情况是context.Session为null

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

如何解决此问题?是否有方法将参数传递给映射操作


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

一些想法可能会让您走上正确的道路:

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

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

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

      我首先尝试了MapFrom,但切换到ResolveUsing没有任何区别。我将尝试IValueResolver方法-我没有尝试过,因为它看起来没有给我带来任何不同,但我没有看到ConstructedBy功能,它看起来可以直接指向工厂功能-谢谢提示!我从一开始就尝试了MapFrom,但切换到ResolveUsing没有任何区别。我将尝试IValueResolver方法-我没有尝试过,因为它看起来没有给我带来任何不同,但我没有看到ConstructedBy功能,它看起来可以直接指向工厂功能-谢谢提示!