代码之家  ›  专栏  ›  技术社区  ›  Birk

使用System.Reflection和System.Type初始化类以创建基于会话的单实例扩展方法

  •  1
  • Birk  · 技术社区  · 15 年前

    我最近有好几次在相对较短的时间内访问特定的类。

    所以我一直在会话中存储类的值,并尝试在页面加载时访问它,如果它不可用,那么创建一个新实例并将其存储在会话中。

    因此,我尝试创建一个扩展方法来实现这一点,而不是在不同的页面上为不同的类不断地复制相同的代码。

    我想这样用

    Dim objName as MyClass
    
    objName.SessionSingleton()
    

    到目前为止,这是我的扩展方法:

        <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
    

    当我创建类的新实例时,我一直在做什么(它必须有一个新的()子实例)

    我不知道从这里到哪里……或者即使这是最好的方法。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Birk    15 年前

    我想出来了,正在发布我的代码以供参考。在翻阅有关类/对象工厂的页面时(感谢Rberry),我发现了一些对 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
    

    您将注意到两个公共共享方法type()和sessionsinglton,它们调用上述扩展方法。

    添加这两个功能后,我们有三种方法来启动会话singlton,如下所示:

    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
    

    在第一次调用sessionsinglton方法时访问classes new()方法,随后的调用反映实例实际上是从内存中提取的。

    我希望这能在将来帮助别人。

        2
  •  1
  •   epitka    15 年前

    如果您使用泛型,您可以只做新的t()。同时,sessionsingleton返回“object”类型,需要强制转换。我没有测试这个,但它应该可以工作。

    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