2017-03-03 6 views
0

私は過去に多くのことをしてきましたが、変数を扱う上でこのベストプラクティスをいくつかロールアップしたいと思います。私のMVC4アプリケーションの周りのユーザー固有の変数を共有する最良の方法

状況は私がログインしているユーザーです(ログオンすると、Windowsユーザーの名前がユーザーテーブルのユーザーと一致するWindows認証を意味します)。そのユーザーには、「canViewReports」、「canEditPerson」などのプロファイルオプションのセットが付属しています。

これらのプロファイルオプションには2つのプロングがあります。まず、私のプレゼンテーション層は、提示される内容に応じてカスタマイズする必要があります。したがって、プロファイル1はcanViewReportをfalseに設定しているため、レポートのタブは非表示になります。プロファイル2はそれが本当のので、タブが表示されます。

第二の突起は、私の精通したユーザーは/レポート/インデックスを入力した場合、現時点では私が使用していますので、私は、プロファイル2.

[OK]をそれをピックアップし、プロファイル1のためのブロックアクセスは許可する必要があるということです[UserDataFilter]で装飾されたベースコントローラーで、そのユーザーデータフィルターは、現在のセッションでキーのセットをチェックし、見つからない場合にそれらを割り当てます。現在のユーザーのプロファイルオプションをそれぞれセッションに入れます。プレゼンテーションレイヤーやコードでセッション変数を使用することができます。私ができることをそこに私を導く

(bool)session["canViewReports"] everywhere in my razor. 

をアプリケーション変数をviewstart.cshtmlを使用して設定しようとする:

私の関心は、それはどこにでもこの種のものを入れて持つ私のコードで見て厄介であるということです私のカミソリで少しきれいに使う。 viewstartで私が設定:私は、あまりにも多くのトラブルもなくeveryhwere私の見解でApp.canViewreportsを使用することができます

App.canViewReports = (bool)HttpContext.Current.Session["canViewReports"]; 

私の質問は以下のとおりです。

1)は、IISのレベルでアプリケーション全体のApp.canViewReportsです、またはIISへの各接続は、アプリケーションの独自のプールを取得しています。変数。私が避けたいのは、変数を設定した最初のユーザーと、その後にその値を取得するアプリケーションを使用するすべてのユーザーです。 (別のコンピュータで)

2)これを行うには良い方法がありますか?

感謝

イアン

答えて

1

私は非表示とメニュー項目を表示するには、私のかみそりのロジックでUser.IsInRole(「canViewReports」)を使用します。レイアウトにメニューを作成する場合は、これを一度だけ行う必要があります。

私はその後さらに と方法を飾ることでアクションメソッドを保護する[AuthorizeUser(「canViewReports」)]

+0

これはデータベースのクエリの点で高価ですか?私はUser.IsInRoleが呼び出されるたびにデータベースにアクセスすると思いますか? –

+0

dBへのクエリに関してはかなり小さいです。私はこれを高価と呼ぶつもりはない。私はそれがより安価で、その後、セッションで複数のユーザーのcanViewReport状態を保持すると言うでしょう。 – KevDevMan

0

あなたはこの方法をneed.Inセッション情報を格納ISessionServiceを作成することができ、あなたが実装することができますしかし、あなたはそれを完全にコントロールしたいと思っています。それはDIコンテナを介して簡単に取り出せ、嘲笑するのは簡単です。

関連する問題