我已经连接了我的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