2009-06-11 41 views
1

我最近有几次在相对较小的时间范围内多次访问特定的类。VB.Net使用System.Reflection和System.Type初始化一个类来创建一个基于会话的单例扩展方法

因此,我一直在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 

我卡上时,我让我的新做什么我的班级的实例(它必须有一个新的()子)

我不知道该从哪里去......或者即使这是最好的办法。

+0

我认为你需要你的类的对象工厂。 – RBarryYoung 2009-06-12 01:04:49

+0

我认为这可能是正确的轨道...这是一个新概念,所以我正在做一些研究。如果我正确理解类/对象工厂,我仍然需要提前知道类是什么,并且没有办法根据其名称空间/类型创建类的新实例? – Birk 2009-06-12 13:52:54

回答

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 

你会注意到两个公共共享方法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方法的第一次调用中访问类new()方法,随后的调用反映该实例实际上是从内存中提取的。

我希望这可以帮助别人在未来。

+0

+1非常好的解决方案。我会保持这一点。 – RBarryYoung 2009-06-12 21:09:15

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 
相关问题