本文共 3082 字,大约阅读时间需要 10 分钟。
事情是这样的,前台网站有些数据不希望每次都从数据库里读,所以,应该做个缓存,而引起缓存更新的入口来自网站的后台管理,而前台和后台被部署在不同的网站中,这时缓存的更新就成了问题,前台的缓存与后台的操作不能联系到一起,为了解决这个问题,我引入了WCF作为中间件,所以与数据库的操作,读,写都来自一个入口,那就是WCF,WCF用户告诉你是否从缓存取数据,所有缓存的数据也缓存在WCF中,OK,想法不错,下面来说一下具体的实现步骤。
一 首先看一下结构图:
注意看我的结构图,前台aop_cache和后台aop_cache_background项目都引用aop_cache_webservice项目,而它们没有对数据层aop_cache_data的引用,这个aop_cache_webservice是一个WCF项目,主要实现与数据层的通讯工作,当然也可以与BLL业务层通讯,这个架构主要是讲如何实现前后台共享缓存,而并非讲架构,所以重要不再架构,而在实现共享缓存。
二 WCF层实现所需要的DLL,主要是unity,cache,interception,log4net等,如图:
三 对于unity,wcf,cache的调用上,我进行了二次封装,如图:
四 看了这些,我们再来看一下,WEB层调用WCF层的代码片断:
public ActionResult Index() { // 通过WCF获取远程数据,不走缓存, 走config中的using (ServiceProxy proxy = new ServiceProxy ()) { return View(proxy.Channel.GetClassroom_Info()); } }
web层的配置文件包含了对WCF的调用
五 WCF层调用DAL层的代码,使用unity来做方法拦截与依赖注入,将cache功能注入到指定方法中
IClassroom_InfoRepository _iClassroom_InfoRepository = ServiceLocator.Instance.GetService(); public void InsertClassroom_Info(Classroom_Info entity) { _iClassroom_InfoRepository.InsertClassroom_InfoData(entity); } public List GetClassroom_Info() { return _iClassroom_InfoRepository.GetClassroom_InfoData(); }
六 对于WCF的配置文件,我们要重要看一下,它包含了数据库连接串的配置和unity的配置
七 DAL层的实现,由接口和实现两部分组成,接口的方法上规定了是否要进行cache操作
public interface IClassroom_InfoRepository { [Caching(CachingMethod.Remove, "GetClassroom_InfoData")] void InsertClassroom_InfoData(Classroom_Info entity); [Caching(CachingMethod.Get)] ListGetClassroom_InfoData(); }
实现很简单,只是一个测试而以
public class Classroom_InfoRepository : TsingDa_NewLearningBarRepository, IClassroom_InfoRepository { public void InsertClassroom_InfoData(Classroom_Info entity) { base.Insert(entity); } public List GetClassroom_InfoData() { return base.GetModel().ToList(); } }
本文转自博客园张占岭(仓储大叔)的博客,原文链接:DDD~WCF做中间件,,如需转载请自行联系原博主。