注意:项目通过两次搭建,因此截图中顶级命名空间有ZHH和ZHH2区别,可是架构的内容是同样的,能够将ZHH和ZHH2视为同一命名空间spring
一:权限管理数据库
二:搜索服务器
|-Lucene.net(速度快)+盘古分词(搜索词拆分)---比模糊查询更模糊session
|-模糊查询like效率慢,全盘扫描,不能拆分架构
盘古分词,分出来的词,用文件存在磁盘内 ,文件并发 ----lock锁->新的问题,效率慢,用户须要等待并发
生产者消费者模式---优化文件并发框架
*sesion只能在一台服务器存储信息性能
-进程外数据库中存session,性能差,没人用测试
分布式存储Session数据
1-Memcached 内存操做,速度快.
2-分布式文件(图片)存储
3.反向代理服务器:Nginx
4.WebService wcf
|-热词统计
三:工做流 WF
01IDao层
引用Model层,接口规范,查询返回IQueryable<T>,延迟加载,调用才会去生成查询,优化性能
Expression--Lambda树
查询:
IQueryable<UserInfo> LoadEntities(Expression<Func<UserInfo,bool>>where);
分页:
IQueryable<UserInfo> LoadPageEntities<Tkey>(int pageIndex, int pageSIze, out int totalCount, Expression<Func<UserInfo, bool>> where, Expression<Func<UserInfo, Tkey>> orderBy);
增:
UserInfo AddEntity(UserInfo entity);
删:
bool DeleteEntity(UserInfo entity);
改:
bool UpdateEntity(UserInfo entity);
因为每个接口,都须要定义CURD,那么形成重复,so,封装Base接口
继承基接口
对外提供会话接口IDBSession
02Dao层
引用IDao层和Model层,Dao实现IDao中的接口规范,由于涉及具体数据库操做,so,引用EF组件
Dao层引用EntityFramework组件
引起问题:再一次请求内不能屡次建立上下文实例
单例虽然能够解决,可是新的问题
,当前应用程序全部的用户都用同一个对象,而且追加数据操做到上下文对象中,会致使内存占用愈来愈大,难以释放
每次请求建立一个EF上下文实例,(线程内惟一)
当请求结束释放
HttpContext 是一个线程内惟一对象
在Dao层定义DBContextFactory.cs(定义在Dao层,防止循环引用)上下文工厂
以上专业写法
CallContext是HttpContext.Items内部对象(线程内惟一)
因为全部的DAO都实现了CRUD,so,封装一个基类BaseDao.cs,并使用上下文工厂类建立对象
重点是DbSet<T>的使用
Dao层子类继承超类,并实现IUserInfoDao接口
DAO和BLL直接须要通讯,so,新建一个会话层(工厂),目的是解耦合
定义一个利用反射的抽象工厂DAOAbsFactory.cs反射
在Bll层中调用工厂类,以接口类型返回dao层的实例,下降Bll层和Dao层耦合度
抽象工厂类----数据会话层
抽象工厂(反射) 业务层与数据访问层解耦
-只须要改配置文件,就能够切换dao层
抽象工厂引用程序集
建立会话类实现Idao中的会话接口
有了会话层以后,新建一个会话工厂(内部涉及到EF操做,线程内惟一)
DBSessionFactory.cs
03IBLL
引用
封装IBLL层接口超类
子接口继承
04BLL
引用
子类
05WebApp
引用
MVC(测试略)