2009-06-11 22 views
1

最近、比較的小さな時間枠で複数回特定のクラスにアクセスする機会がいくつかありました。VB.Net System.ReflectionとSystem.Typeを使用してクラスを初期化してセッションベースのシングルトン拡張メソッドを作成する

私はセッションにクラスの値を格納していて、新しいインスタンスを作成してセッションに保存できない場合は、ページの読み込みにアクセスしようとしています。

別のページの異なるクラスの同じコードを常に複製するのではなく、私のためにこれを行う拡張メソッドを作成しようとしています。

<Extension()> _ 
    Public Sub SessionSingleton(ByRef ClassObject As Object) 
     Dim objType As Type = ClassObject.GetType 
     Dim sessionName As String = objType.FullName 
     If TypeOf HttpContext.Current.Session(sessionName) Is objType And HttpContext.Current.Session(sessionName) <> "" Then 
      ClassObject = HttpContext.Current.Session(sessionName) 
     Else 
      Dim singleton As Object = New objType??????? 

      HttpContext.Current.Session(sessionName) = singleton 
      ClassObject = singleton 

     End If 
    End Sub 

私は私が私の新しい作るときに何をすべきかにこだわっている:

は、私がこれまでのところ、これは私が私の拡張メソッドのために持っているものである。この

Dim objName as MyClass 

objName.SessionSingleton() 

ようにそれを使用したいです私のクラスのインスタンス(新しい()サブを持つ必要があります)

私はここからどこに行くのかわかりません...もしこれが最善の方法であっても。

+0

あなたのクラスにオブジェクトファクトリが必要だと思います。 – RBarryYoung

+0

これは正しい軌道上にあるかもしれないと私は思います。それは私には新しい概念ですので、私はいくつかの研究をしています。クラス/オブジェクトファクトリを正しく理解している場合は、クラスが何であるかを事前に知る必要があり、名前空間/タイプに基づいてクラスの新しいインスタンスを作成する方法はありませんか? – Birk

答えて

1

私はそれを理解し、参照用にコードを投稿しています。クラス/オブジェクトファクトリ(RBarryに感謝します)についてのページを掘り下げながら、私はSystem.ReflectionクラスのActivator.CreateInstance()への参照をいくつか見つけました。

Imports Microsoft.VisualBasic 
Imports System.Runtime.CompilerServices 
Imports System.Reflection 

Public Module enviornmentUtilities 
    <Extension()> _ 
    Public Function SessionSinglton(ByVal objType As Type) As Object 
     Dim sessionName As String = objType.FullName.ToString 
     If Not HttpContext.Current.Session(sessionName) Is Nothing Then 
      HttpContext.Current.Trace.Write(HttpContext.Current.Session(sessionName).ToString) 
      Return HttpContext.Current.Session(sessionName) 
     Else 
      Dim ss = Activator.CreateInstance(objType) 
      HttpContext.Current.Session(sessionName) = ss 
      Return ss 
     End If 
    End Function 
End Module 

これは私が単純なクラスを作ったかをテストするには(仕事にこれは必要ありません)新しいメソッド

のパラメータを必要としない任意のクラスからセッションベースのシングルトンを作成できます:

Public Class HasNew 
     Public FreshInstance As Boolean = True 
     Public Sub New() 
      HttpContext.Current.Trace.Warn("This Class has a new method") 
     End Sub 
     Public Sub CheckFreshness() 
      If FreshInstance Then 
       HttpContext.Current.Trace.Warn("Fresh HasNew Instance") 
       FreshInstance = False 
      Else 
       HttpContext.Current.Trace.Warn("NotFresh HasNew Instance") 
      End If 
     End Sub 
     Public Shared Function type() As Type 
      Return GetType(HasNew) 
     End Function 
     Public Shared Function SessionSinglton() As HasNew 
      Return GetType(HasNew).SessionSinglton 
     End Function 
    End Class 

上記の拡張メソッドを呼び出す2つのパブリック共有メソッドtype()とSessionSingltonがわかります。

Dim HN As HasNew 

HN = HasNew.SessionSinglton 
HN.CheckFreshness() 

HN = HasNew.type.SessionSinglton 
HN.CheckFreshness() 

HN = GetType(HasNew).SessionSinglton 
HN.CheckFreshness() 

を次のようにこのファイルのトレース出力は次のとおりです:

This Class has a new method 
Fresh HasNew Instance 
NotFresh HasNew Instance 
NotFresh HasNew Instance 

これら二つの機能を持つ

たちは、セッションSingltonを開始するには、3つの方法がここに証明されている追加しましたクラスnew()メソッドはSessionSingltonメソッドへの最初の呼び出しでアクセスされ、その後の呼び出しはインスタンスが実際にメモリから取得されていることを反映します。

私はこれが将来他の誰かに役立つことを願っています。

+0

+1とても良い解決策です。私はこれを保つつもりです。 – RBarryYoung

1

ジェネリックを使用した場合は、New T()を実行するだけで済みます。また、SessionSingletonは "オブジェクト"型を返し、キャストが必要です。私はこれをテストしなかったが、うまくいくはずだ。

Imports Microsoft.VisualBasic 
Imports System.Runtime.CompilerServices 
Imports System.Reflection 

Public Module enviornmentUtilities 
    <Extension()> _ 
    Public Function SessionSinglton(Of T As {Class, New})(ByVal obj As T) As T 
     Dim sessionName As String = obj.GetType.Name 
     If Not HttpContext.Current.Session(sessionName) Is Nothing Then 
      HttpContext.Current.Trace.Write(HttpContext.Current.Session(sessionName).ToString) 
      Return HttpContext.Current.Session(sessionName) 
     Else 
      Dim ss = New T() 
      HttpContext.Current.Session(sessionName) = ss 
      Return ss 
     End If 
    End Function 
End Module 
+0

これは面白いです、私はジェネリックの使用に関するいくつかのさらなる研究を行う必要があります。このエクステンションの使い方を理解できません。私の試したクラスを使ってみました: Dim HN As HasNew HN = HasNew.SessionSinglton2():非共有メンバーへの参照にはオブジェクト参照が必要です。また、 Dim HN As HasNew HN = HN.SessionSinglton2():オブジェクト参照がオブジェクトのインスタンスに設定されていません。 – Birk

+0

さて、はい、拡張メソッドは、拡張している型のインスタンスを必要とするので、あなたがしようとしているものは動作しません。 – epitka

関連する問題