在.NET中缓存单个属性或方法

在.NET中缓存单个属性或方法,.net,caching,.net,Caching,在ASP.NET Web窗体中使用VB.NET 我有一个属性,它通过实体框架从数据库中读取列表,如下所示: Public ReadOnly Property MyProperty As List(Of MyType) Get Using service As New MyDatabaseService Return service.GetMyTypeList() End Using End Get End Property

在ASP.NET Web窗体中使用VB.NET

我有一个属性,它通过实体框架从数据库中读取列表,如下所示:

Public ReadOnly Property MyProperty As List(Of MyType)
    Get
        Using service As New MyDatabaseService
            Return service.GetMyTypeList()
        End Using
    End Get
End Property
Private Property _myProperty As List(Of MyType)
Public ReadOnly Property MyProperty As List(Of MyType)
    Get
        If _myProperty Is Nothing Then
            Using service As New MyDatabaseService
                _myProperty = service.GetMyTypeList()
            End Using
        End If

        Return _myProperty
    End Get
End Property
因为此服务需要往返数据库,所以我希望缓存结果,以便在同一页面生命周期内(不需要ViewState)将来进行访问。我知道这可以通过以下方式实现:

Public ReadOnly Property MyProperty As List(Of MyType)
    Get
        Using service As New MyDatabaseService
            Return service.GetMyTypeList()
        End Using
    End Get
End Property
Private Property _myProperty As List(Of MyType)
Public ReadOnly Property MyProperty As List(Of MyType)
    Get
        If _myProperty Is Nothing Then
            Using service As New MyDatabaseService
                _myProperty = service.GetMyTypeList()
            End Using
        End If

        Return _myProperty
    End Get
End Property
现在,问题是:有没有办法通过属性利用缓存,“自动”缓存此属性的输出,而不必如图所示显式声明、测试和设置缓存对象?

答案有点像,但您需要使用技术来实现这一点。或者有两个优秀的.net框架可以帮助您实现这一目标,但无论如何这都不是一个轻松的主题

基本上,AOP涉及到将常见的样板功能包装到可以用来修饰代码的方面,只留下您想要的本质。这可以像Castle一样在运行时动态完成,也可以通过IL编织(将新代码动态编译到程序集中)在编译时完成


每种方法都有其优缺点,但我敦促您研究这个主题,因为它所涵盖的范围不仅仅是缓存。许多常见任务(如异常处理和日志记录)可以轻松地重构为方面,以使代码更加干净。

“自动”缓存?不可以。最好是让要缓存的对象从定义可缓存功能的接口/抽象类继承。@William-Postsharp提供100%免费的入门版/社区版。它甚至可以用于商业产品: