2016-08-26 10 views
1

asp.net identityを持つasp.net core mvcを使用しています。私はapplicationUser.Countryから読み込まれた値にSystem.Threading.Thread.CurrentThread.CurrentCultureを設定したいCountry => 'GB' または 'FR' など...httpリクエスト内で認証されたユーザオブジェクトをあまりにも頻繁にクエリする

ApplicationUserは、プロパティを持っています。ユーザーが設定した日時/数値の値をすべて自分のビューに正しく表示する。私はthis.userManager.GetUserAsync(User);

呼び出す現時点で

public async Task<IActionResult> Index() 
{ 
    var user = await this.userManager.GetUserAsync(User);  
    var todos = await service.GetTodosAsync(user.Id); 
    return View(todos); 
} 

:こののActionFilterは私もこのコードを実行する設定されているアクション/コントローラで

public class LanguageActionFilter : ActionFilterAttribute 
    { 
     private readonly ILogger _logger; 
     private UserManager<ApplicationUser> _userManager; 
     public LanguageActionFilter(ILoggerFactory loggerFactory, UserManager<ApplicationUser> userManager) 
     { 
      _logger = loggerFactory.CreateLogger("LanguageActionFilter"); 
      _userManager = userManager; 
     } 

     public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) 
     { 
      var user = await _userManager.GetUserAsync(context.HttpContext.User); 
      Thread.CurrentThread.CurrentCulture = new CultureInfo(user.Country); 

      await base.OnActionExecutionAsync(context, next); 
     } 
    } 

そこで私は、このアクションフィルタを作成しました

TWO TIMES!

は、その後、私は

context.HttpContext.Items.Add("applicationUser", user); 

にユーザーオブジェクトを渡すとIndex() action方法以内に再度このユーザーオブジェクトをつかむことについて考え:

var user = (ApplicationUser)base.HttpContext.Items["applicationUser"]; 

働いたが、それは良いアイデアですか?あなたはそのアプローチに何か問題を見ますか?あなたがやったことは結構です

答えて

1

...

は私がいるHttpContextクラスの定義から引用しています:

/// <summary> 
     /// **Gets or sets a key/value collection that can be used to share data within the scope of this request.** 
     /// </summary> 
     public abstract IDictionary<object, object> Items { get; set; } 
0

編集:EFコアが第1レベルのキャッシュをサポートしていないようです。だから私のアイデアは無駄になりました

あなたのコードは動作しますが、かなりのパフォーマンスは得られません。

エンティティフレームワークでは、おそらくaspnet IDを使用します。 efはfirst level cacheをサポートしています。 this.userManager.GetUserAsync(User);を複数呼び出すと、efはデータベースからユーザーエンティティを1回だけ取得します。結果として、2つの方法がほぼ同じ効果をパフォーマンスにもたらします。あなたのケースではHttpContext.Itemsを使用しません。

+0

リンクは約EF4,5,6です。 Wetherのasp.netコアID/EF 7キャッシュからのuserManagerメソッドでは、GetUserAsyncはソースコード内にのみ存在します。または、クエリ実行中にSQLプロファイラを有効にします。 – Pascal

+0

コアが第1レベルのキャッシュをサポートしていないようです。だから私の考えは何のためにも行きませんでした –

関連する問題