0

基本コントローラーと OnActionExecuting を使用して、ほとんどのページ (名前、ID など... 4/5 フィールド以下) で表示および維持したい「共通」サイト データを取得します。

OnActionExecuting のメソッドは、データベースを読み取り、ビューで取得した ViewBag に保存しますが、OnActionExecuting ごとに DB 呼び出しが必要なため、これは無駄だと思わずにはいられません。

これらの DB 呼び出しを統合し、DB アクセスをスリム化するにはどうすればよいでしょうか?

4

4 に答える 4

1

共通データ値をリポジトリ レイヤーにキャッシュします。

于 2012-04-13T17:31:58.917 に答える
1

最近のプロジェクトで行ったことは、ログイン中に「共通」データを取得することです。この場合、UserID、FirstName、および ImageName でした。次のように認証チケットに保存しました。

UserData = pModel.PartyId.ToString() + "|" + pModel.BusinessName + "|" + pModel.FirstName + "|" + pModel.LastName + "|" + pModel.ImageUrl + "|" + UsersRole + "|" + IsAct;//PID, BusName, FirstName, LastName, imgUrl, Role, IsAct

// Create the cookie that contains the forms authentication ticket
HttpCookie authCookie = FormsAuthentication.GetAuthCookie(UN, true);
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(authCookie.Value);
FormsAuthenticationTicket newTicket = new FormsAuthenticationTicket(ticket.Version, ticket.Name, ticket.IssueDate, ticket.Expiration, ticket.IsPersistent, UserData);
authCookie.Value = FormsAuthentication.Encrypt(newTicket);
System.Web.HttpContext.Current.Response.Cookies.Add(authCookie);

次に、データが必要なときにこの Cookie を取得し、次のようにデータを取得します。

var cookie = context.Request.Cookies[FormsAuthentication.FormsCookieName];
dynamic UN = FormsAuthentication.Decrypt(cookie.Value);
string UserData = UN.UserData;//PID, BusName, FirstName, LastName, imgUrl, Role, IsAct
string[] pFields = UserData.Split('|');
string[] MyRoles = { pFields[5] };

注意: これは、ログイン セッション中に変更されないことがわかっている静的データにのみ適しています。この Cookie に投稿する内容には注意してください。

フィールドを最小に保つか、Cookie を肥大化させないでください。最大は 4K ですが、私は 500 ~ 1000 バイトを目指しています。

于 2012-04-13T17:38:49.070 に答える
0

この目的でSystem.Runtime.Caching.MemoryCacheを使用できます。

いくつかの例:

キャッシュは、各キャッシュ アイテムの有効期限が切れるまで、リクエスト間で保持されます。

于 2012-04-13T18:03:10.803 に答える
0

ベース コントローラーから継承しても、リクエスト間で状態を共有しているわけではありません。各リクエストにより、新しいコントローラー インスタンスが作成されます。

毎回取得したくない場合は、このデータを何らかの状態 (キャッシュ、セッション、アプリケーション) に保存する必要があります。次に、それを格納するメカニズムをベース コントローラーからアクセスできるようにします。

次に、免責事項があります...データベースへのこれらの旅行は高価ですか?最小限のレイテンシーの問題をメモリ管理の問題と引き換えにするつもりですか?

アップデート:

4 ~ 5 個のフィールド (ユーザー固有のように見え、ユーザーのセッション中に変更されないように見える) だけの場合は、それらをセッション状態に保存するだけです。

ここでの個人的な好みですが、次のようなもののために、ベースコントローラー/ページに強く型付けされたアクセサーが好きです:

    protected string Name
    {
        get
        {
            if (Session["Name"] == null)
            {
                var results = GoLoadFields();                    
                return Session["Name"].ToString();
            }

            return Session["Name"].ToString();
        }

        set
        {
            Session["Name"] = value;
        }
    }

次に、基本コントローラーから継承するすべてのコントローラーで、これらのプロパティを参照できます。

myAwesomeViewModel.Name = this.Name;

メモリ管理の免責事項は、データベースにクエリを実行して同じ大きな結果セットを取得し、それを各ユーザーのセッションに押し込むことを回避することを目的としています。何かを記憶に残す前に、必要なものだけを必要な期間だけ保持していることを確認してください。

于 2012-04-13T17:38:48.367 に答える