2016-08-02 4 views
0

オブジェクトコンテキストの5処分:現在ASP MVC私は次のようにユーザー権限をチェックするために、データベースを照会する必要が拡張メソッド持って

public static bool HasPermission(this IPrincipal user, string permission) 
{ 
    ApplicationUser appUser = ApplicationUserManager.GetUser(user.Identity.GetUserId()); 

    return appUser.HasPermission(permission); 

} 

アプリケーションユーザを取得するための呼び出しを次のように実装された:

public static ApplicationUser GetUser(string userId) 
{ 
     return GetUser(new ApplicationDbContext(), userId); 
} 

public static ApplicationUser GetUser(ApplicationDbContext context, string userId) 
{ 
     ApplicationUser _retVal = null; 
     try 
     { 
      _retVal = context.Users.Where(p => p.Id == userId).FirstOrDefault(); 
     } 
     catch (Exception) 
     { 
     } 

     return _retVal; 
} 

私のビューとコントローラのアクションで、私は頻繁にUser.HasPermission()メソッドを呼び出します。だから私は頻繁にこのメソッドを呼び出すことのパフォーマンスの含意を検討しています。コンテキストを破棄するように、次のようにusingステートメント内にラップしてコールを実装する方が良いでしょうか、すでに上で実装した方法で正しいですか?

public static bool HasPermission(this IPrincipal user, string permission) 
    { 
     using (ApplicationDbContext _context = new ApplicationDbContext()) 
     { 
      var userId = user.Identity.GetUserId(); 
      ApplicationUser applicationUser = _context.Users.Where(p => p.Id == userId).FirstOrDefault(); 
      return applicationUser.HasPermission(permission); 
     } 
    } 
+0

データベースには何人のApplicationUserがいますか?この数字が増えたり、かなり似ていると思いますか?あなたの 'hasPermission'のアプリケーションはうまく見えます、それはガベージコレクタがブロックの最後にコンテキストオブジェクトを破壊することを保証し、メモリを解放します。ただし、同じユーザーのアクセス権を何度も確認している場合は、データベースを常に再クエリするのではなく、そのオブジェクトをメモリに保存する価値があります。 – gudthing

+0

@gudthingなので、それを使用ブロックにまとめる必要はありませんか?ユーザー数は500-1000人の間で増加します。 – adam78

+0

@ gudthingあなたはそれをどのようにメモリに保存しようと思いますか?いくつかのコードサンプルが説明するのに役立ちますか? – adam78

答えて

0

dbコンテキストを削除することをお勧めします。私は、ラッパークラスにコンテキストを置くと、特定のメソッドを介して、アプリケーション固有のdb要求を処理します。例えばGetUsers()、GetAllItems()、GetSingleItem(id)、GetItemsByCategory(category)など。C#ジェネリックを使用すると、リポジトリとベースクラスは、多くの異なるアセットタイプを持つときに、

これにより、dbcontextが必要なインスタンスごとに呼び出され、処分されます。例えば1つのページ要求に

  • GETUSER(オープン処分)
  • はGetSomethingElse(オープン処分AGAIN)
  • SaveSomething(オープン処分AGAIN)

また、 "HasPermission"リクエストごとに別々のDB呼び出しを行うのではなく、ロード時にUserクラスにユーザーの全権限セットを直接追加します。

キャッシュ機構(つまりMemoryCache)を使用して、そのユーザーオブジェクトとその権限セットを格納します。この同じキャッシュメカニズムを使用して、アプリデータも保存できます。そこにいくつかの事前に構築されたものがある場合は、Googleの周りの基本的なものを設定することは困難ではありません。

キャッシュを使用すると、ユーザーは自分のサイトから何かを要求し、DBに触れることなくアクセスできることを既に知っています(やはり)、少なくとも数分間、多くの場合、権限が変更されます5-15分の許可キャッシュはかなり妥当です。キャッシュの削除手法では、権限ストア自体を制御したり、更新を最後までトリガーできるフックを持っていることを前提として、アクセス許可セットが常に正確であることを保証できます。

関連する問題