0

私はこれに頭を悩ませようとしていますが、できません。

カスタムというクラスがあるとしましょう。User_ID という名前の変数があり、これを使用してユーザーのセッションを取得します (そのため、セッション変数を何度も呼び出し続ける必要はありません)。このようなもの:

Public Class custom

Public Shared User_ID as integer

Public Shared sub GatherUserID()

   User_ID = Session ("user_ID")

end sub

end class

はい、これは非常に単純な例ですが、私の主張は理解できます。私は従来の ASP (クラスではなくインクルードを使用) でこれと同様のことを行いましたが、User_ID は、その時点で問題のページにアクセスしていた人に固有のものです。

何らかの理由で、これは私が理解していないことです。カスタム クラスで custom.User_ID を使用すると、全員が共有されます。それは私がしたくないことです。私が望むのは、そのような変数を使用して、ユーザー固有のものにできるようにすることです。クラス (データベース接続文字列など) 間で変数を共有する利点はわかりますが、セッションを常に呼び出さなくても、そのユーザーだけに使用できるカスタム クラスでカスタム変数を設定する方法がわかりません。

共有変数ではなくプロパティとして宣言できることがわかりますが、それが何を達成することを意図しているのか正確にはわかりません。誰も明確な説明を持っていないようです。プロパティはユーザー/セッション固有ですか? その結果、特定の問題を解決できますか? これは私が得られないものです。

EDIT : 明確にするために、この例の user_ID は、ページの作成中に呼び出されるいくつかの場所 (マスター ファイル、ページ自体、さまざまなクラスなど) で使用するつもりのものです。カスタム変数。

ありがとう。

4

2 に答える 2

1

共有とは、アプリ ドメイン内のすべてのユーザーと共有されていることを意味します。メソッドを呼び出して共有変数を設定すると、共有変数を使用するすべてのものに同じ値が返されます。

できることは、Session オブジェクトへのアクセスをラップすることです。モジュールまたは私の好みの方法のいずれかを使用して、拡張メソッドと、セッションからぶら下がっている共有カスタム クラスを使用します。これにより、セッションからのものであることがわかりますが、Session.vars.UserID のようにアクセスし、UserID は vars クラスのプロパティです。

Module SessionExt

    Public Class SessionVars
        Private this as HttpSessionState
        Public New (ths as HttpSessionState)
            this = ths
        End New
        Public Property Example as Integer
            Get
               Static nm as String = MethodBase.GetCurrentMethod().Name.Substring(4)
               return CType(this(nm), Integer)
            End Get
            Set (value as Integer)
               Static nm as String = MethodBase.GetCurrentMethod().Name.Substring(4)
               this(nm) = value
            End Set
        End Property 
    End Class
    <Extension()>
    Public Function vars(ByVal this as HttpSessionState) as SessionVars
        return New SessionVars(this)
    End Function
End Module

これで、すべてのセッション変数が適切なクラスにまとめられました。新しいプロパティを追加するのは簡単な定型コードです。名前を変更してタイプを設定するだけです。より良い名前にリファクタリングしたり、使用されている場所を確認したり、より複雑な構造 (データテーブル、他のクラスや構造など) を含めるために使用したりできます。

注: global.asax を使用している場合、コードの実行時にセッションがまだ確立されていない可能性があります。そこから呼び出すプロパティがセッション状態を使用しないか、最初に null をチェックするように注意してください。

于 2012-10-16T23:13:29.487 に答える
0
Public Class custom

Public User_ID as integer

Public sub GatherUserID()

   User_ID = Session ("user_ID")

end Sub

end Class

次に、セッションを開始する新しいユーザーごとに:


Dim userSpecificCustom as New Custom()
userSpecificCustom.GatherUserID()

私は C# 派なので、構文が 100% 正しくなくても気にしないでください。

User_ID を public フィールドではなくプロパティにすることもお勧めします。(例: http://www.vbdotnetheaven.com/uploadfile/manish1231/fields-and-properties-in-vb-net/またはhttp://blogs.msdn.com/b/vbteam/archive/2009/09を参照) /04/properties-vs-fields-why-does-it-matter-jonathan-aneja.aspx )

于 2012-10-16T21:29:53.527 に答える