VB.Net Инициализация класса с использованием System.Reflection и System.Type для создания одноэлементного метода расширения на основе сеанса - PullRequest
1 голос
/ 11 июня 2009

Недавно у меня было несколько раз, чтобы получить доступ к определенному классу несколько раз за относительно небольшой промежуток времени.

Итак, я сохранял значение класса в Session и пытался получить к нему доступ при загрузке страницы, если он недоступен, создав новый экземпляр и сохранив его в сеансе.

Поэтому вместо того, чтобы постоянно копировать один и тот же код для разных классов на разных страницах, я пытаюсь создать метод расширения, чтобы сделать это для меня.

Я хочу использовать это так

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

Я застрял на том, что делать, когда я делаю свой новый экземпляр моего класса (он должен иметь подпрограмму New ())

Я не уверен, куда идти отсюда ... или даже если это лучший способ сделать это.

Ответы [ 2 ]

1 голос
/ 15 июня 2009

Если вы использовали дженерики, вы можете просто сделать 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
1 голос
/ 12 июня 2009

Я понял это и выкладываю свой код для справки. Копая страницы о фабриках классов / объектов (спасибо RBarry), я нашел несколько ссылок на Activator.CreateInstance() в классе System.Reflection, который я придумал.

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

К классу new () обращаются при первом вызове метода SessionSinglton, и последующие вызовы отражают, что экземпляр фактически извлекается из памяти.

Надеюсь, это поможет кому-то еще в будущем.

...