2

ASP.Net MVC アプリケーション内で Automapper を使用して、DTO を ViewModel オブジェクトにマップしています。

私のマッピングの 1 つで、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 が null です。

これは、Automapper がマッピングを解決する方法と関係があると思います。おそらく、マッピングの作成時に 1 つのコンテキストへの参照が設定され、マッピング時にこのコンテキストが存在しなくなりますか?

問題を解決するにはどうすればよいですか? パラメータをマッピング操作に渡す方法はありますか?

私の一時的な回避策は、他のすべてのフィールドをマップし、マップされたコレクションを手動でループして、現在のコンテキストを必要とするフィールドを設定することですが、このアプローチを維持するのは嫌いです。

4

1 に答える 1

0

あなたを正しい軌道に乗せるかもしれないいくつかの考え:

  • に置き換えても違いはResolveUsingありMapFromますか?どちらも a を受け入れるようですがFunc<TSource, TMember>、微妙な違いがあるかもしれません。
  • AutoMapper の機能を使用して、IsEditableメソッドを に変換し、必要なセッション データをコンストラクターに渡すことは可能でしょうか? 関連するドキュメントは次のとおりです。「カスタム コンストラクター メソッド」セクションまでスクロールします。IValueResolverConstructedBy()
于 2012-07-31T18:29:08.050 に答える