linq-to-sql – ASP.NET MVC – 有一种简单的方法可以将数据缓存添加到我的服务层吗?

我已经连接了我的MVC应用程序,以便Repository Layer查询LINQ to SQL类,Service Layer查询Repository Layer,Controllers调用Service层.

基本上我的代码如下

知识库

    Public Function GetRegions() As IQueryable(Of Region) Implements IRegionRepository.GetRegions
        Dim region = (From r In dc.Regions
                 Select r)
        Return region.AsQueryable
    End Function

服务

    Public Function GetRegionById(ByVal id As Integer) As Region Implements IRegionService.GetRegionById
        Return _RegionRepository.GetRegions() _
            .Where(Function(r) (r.ID = id _
                                And r.isActive)) _
            .FirstOrDefault()
    End Function

    Public Function GetRegionByNameAndParentID(ByVal region As String, ByVal parentid As Integer) As Region Implements IRegionService.GetRegionByNameAndParentID
        Return _RegionRepository.GetRegions() _
            .Where(Function(r) (r.Region = region _
                                And r.ParentID = parentid _
                                And r.isActive)) _
            .FirstOrDefault()
    End Function

    Public Function GetActiveRegions() As List(Of Region) Implements IRegionService.GetActiveRegions
        Return _RegionRepository.GetRegions() _
            .Where(Function(r) r.isActive) _
            .ToList
    End Function

    Public Function GetAllRegions() As List(Of Region) Implements IRegionService.GetAllRegions
        Return _RegionRepository.GetRegions().ToList
    End Function

我想知道是否有一种很好/有效的方法将缓存添加到服务层,这样如果调用相同,它就不必总是调用REPO.

最佳答案 由于缓存是一个跨领域的问题(在维基百科中进行搜索),您可以使用策略注入在存储库层上实现缓存,但约束是您使用像Castle,Unity这样的DI框架……这个概念的优势是您在存储库层中保留干净的代码.

我将从It Depends开始,但在简单的场景中,不需要与其他服务代理进行交互,只建议缓存对数据库的访问,因为数据库访问是最慢的.这就是为什么我建议不要缓存对服务层的访问,而是缓存存储库层.这也是Martin Fowler在他的数据映射器模式中描述的内容.

如果您处于分布式方案中,即您的控制器和服务在不同的服务器上运行,您可以选择在控制器上进行缓存,以防止每次加载时参考数据的序列化,例如您的国家/地区列表下拉列表或税码值.

在您的场景中,我会将CachingHandler附加到您的存储库GetRegions(),并创建一个CacheKey,它结合了例如方法和参数(如果有的话).以简单的方法,将CacheKey和结果列表保存到Hashtable(在现实生活中,使用模式和实践缓存应用程序块或System.Web.Cache),并将每个请求保存到存储库,查看缓存密钥在您的Hashtable中,然后返回缓存列表.

在谷歌快速搜索让你开始这个:
http://entlib.codeplex.com/Thread/View.aspx?ThreadId=34190

点赞