2

グローバルな状態に代わるものについて利用できる投稿はたくさんありますが、Web環境での実装に関しては長引く質問があります。

Session[]ASP.NETでは、セッションに格納される値は実質的にグローバル変数ですが、コレクションに頼らずに、ページやイベント間で認証されたユーザー名やアクセス許可などを合理的に格納することはできないようです。(私は通常、依存性注入を使用しますが、これらの値をviewstate / urlでクライアントに渡したくないでしょう。)

したがって、私は、グローバル状態はWeb開発に必要な悪であると考えています(HTTPのステートレスな性質のため)。答えは、責任を持ってそれを使用することです。実装に適したファサードパターンは何ですか?以下のような静的クラスは、セッション内getのsとsetsの値だけでは、グローバル状態をマスクするのにあまり効果がありません。

public class SessionWrapper
{
    public static string UserName
    {
        get { return Convert.ToString(Session["UserName"]); }
        set { Session["UserName"] = value; }
    }
    public static bool IsAuthenticated
    {
        get { return Convert.ToBoolean(Session["IsAuthenticated"]); }
        set { Session["IsAuthenticated"] = value; }
    }
}
4

3 に答える 3

2

グローバル変数には問題がありますが、グローバルは問題ありません。したがって、グローバル状態の「問題」を軽減したい場合は、それらのオブジェクトを不変にするだけです(DIがどのように関連しているかはわかりません)。

オブジェクトのUserプロパティは、HttpContextアプリケーションのすべての部分で使用可能である必要がありますが、パイプラインの早い段階でのみ割り当てることができるため、このような状態を格納するのに役立ちます。

したがって、必要な追加のプロパティを備えた独自の実装を考え出し、たとえばイベント中にSystem.Security.Principal.IPrincipal割り当てるだけです。HttpContext.Current.UserAuthenticateRequest

于 2013-02-05T21:15:32.303 に答える
0

これについて私が気に入っているのは、グローバルに共有される状態変数の固定セットを定義していることです。制御されていない使用でSessionは、同じエンティティの異なる名前でそこに到達するあらゆる種類のがらくたがあります。

もちろん、それがSession直接使用されていないことを何らかの方法で確認する必要があります。

于 2013-02-05T21:02:57.867 に答える
0

ここで使用するのはグローバル変数ではありませんが、セッション変数にアクセスするための優れた「インターフェース」です。

セッションがロックメカニズムなしで処理された場合は問題が発生する可能性がありますが、asp.netセッションはすべてのページでセッションへのフルアクセスをロックしているため、問題が発生します。

于 2013-02-05T21:36:50.980 に答える