大神勿喷,小神默默学。

会了就是不值一提的东西,不会就是绝对的高大上。

最后上传源码。希望能给读者带来一些新的认识及知识。

还没上过头条。。各位大神,请点支持一下小弟。

陆续更新。更新到你会为止!!

我不是话唠,我只把重点点出来,细枝末节的不懂的可以留言探讨。这个系列的最后,我会再统一的把大家的问题,列在一篇新的Blog。工作需要规划,写博客也是如此。

需求

①请保持EF上下文的线程唯一。防止脏临时数据的出现

②请对程序扩展性做好设计。以后ef框架可能改为Spring框架

③服务层调用仓储层时。DBContext为统一入口

③.1 方便程序员开发,提供统一入口。把ef封装到此入口里面。

③.2防止脏临时数据的出现,“也”请保持这个入口的线程内唯一。

③.3要这个统一入口去除服务层和仓储层的耦合

思路

①把ef放进CallContext内。键值对形式存放。

②面向接口的思想

 新建一个工厂接口+工厂。用一个“工厂方法”模式,非“简单工厂”,也非“抽象工厂”设计模式。如果您对工厂的几个设计模式不了解,请参考我写过的设计模式一篇blog。

③ ③.1新建一个类,命名DBContact里面的一个属性类型为ObjectContext,因为上下文继承ObjectContext,继而“点”多个仓储。

③.2放进CallContext内。键值对存储。

③.3新建一个IDBContact接口,让DBContact继承。用一个工厂继承一个接口工厂创建。“工厂方法”设计模式

思想

面向接口+工厂模式+线程唯一 2个抽象方法工厂作用:线程唯一+扩展性(面向接口)

详情代码

ISingleEFCntextFactory.cs

using System.Data.Objects;namespace LKBS.CommunicationPlatform.IDAL
{public interface ISingleEFCntextFactory{//no public
 ObjectContext GetCurrentEFContext();}
}

SingleEFCntextFactory.cs

using LKBS.CommunicationPlatform.IDAL;
using System.Data.Objects;//添加引用 System.Data.Entity
using System.Runtime.Remoting.Messaging;
using LKBS.CommunicationPlatform.Model;namespace LKBS.CommunicationPlatform.Factory
{public class SingleEFCntextFactory : ISingleEFCntextFactory{public ObjectContext GetCurrentEFContext(){//把上下文(基类)放在一个线程内。让一次请求(一个ACTION)可能执行CRUD中的几步,公用一个上下文.ObjectContext callEFContext = (ObjectContext)CallContext.GetData("efContext");//线程槽 存放“键值对”//先读后写。没有就new一个上下文if (callEFContext == null){callEFContext = new ModelContainer();}CallContext.SetData("efContext", callEFContext);return callEFContext;}}
}

BaseRespository.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;using System.Data.Entity;
using LKBS.CommunicationPlatform.Model;
using LKBS.CommunicationPlatform.IDAL;
using System.Data;
using LKBS.CommunicationPlatform.Factory;
using System.Data.Objects;namespace LKBS.CommunicationPlatform.DAL
{public class BaseRespository<T> where T : class,new(){ISingleEFCntextFactory singleEFFactory = new SingleEFCntextFactory();//中间加一个工厂,这里“去除”ef和具体仓储的耦合。可以更换ef。而Respositiry db不用变ObjectContext db;//如果没赋值,那就是赋值的问题。找对应赋值的工厂 或者工厂还没编译public BaseRespository(){ObjectContext db = singleEFFactory.GetCurrentEFContext();}//ModelContainer db = efFactory.GetCurrentEFContext();//字段初始值无法引用非静态字段、方法或属性.//那我们在构造方法内赋值
....CRUD}
}

为方便业务逻辑层调用,建立统一入口。

IDBContact.cs

using System.Data.Objects;//上下文在的空间namespace LKBS.CommunicationPlatform.IDAL
{public interface IDBContact{//接口中的属性要{}ObjectContext currentEFContext { get; set; }IUserInforRespository userinforResponsity { get; set; }//...多个其他表的仓储,在T4模板中加OK
   }
}

DBContact.cs

using LKBS.CommunicationPlatform.IDAL;
using System.Data.Objects;//上下文的命名空间
using LKBS.CommunicationPlatform.Factory;namespace LKBS.CommunicationPlatform.DAL
{public class DBContact : IDBContact{public ObjectContext currentEFContext { get; set; }ISingleEFCntextFactory singleEFCntextFactory = new SingleEFCntextFactory();//SingleEFCntextFactory做到单一上下文public DBContact(){currentEFContext = singleEFCntextFactory.GetCurrentEFContext();//
  }public IUserInforRespository userinforResponsity { get; set; }}
}

ISingleDBContactFactory.cs

namespace LKBS.CommunicationPlatform.IDAL
{public interface ISingleDBContactFactory{IDBContact CreateDBCotactUseEF();}
}

SingleDBContactFactory.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;using LKBS.CommunicationPlatform.IDAL;
using System.Data.Objects;
using System.Runtime.Remoting.Messaging;
using LKBS.CommunicationPlatform.DAL;namespace LKBS.CommunicationPlatform.Factory
{//继承接口①接口要编译过,②引入接口所用的程序集+ usingclass SingleDBContactFactory : ISingleDBContactFactory{public IDBContact CreateDBCotactUseEF(){//ObjectContext currentEFContext = new ObjectContext("currentEFContext");//return currentEFContext;IDBContact dbCotact = (DBContact)CallContext.GetData("currentDBContact");if (dbCotact==null){dbCotact = new DBContact();}CallContext.SetData("currentDBContact", dbCotact);return dbCotact;}}
}

  

转载于:https://www.cnblogs.com/leee/p/4513498.html

ASP.NET MVC系列 框架搭建(二)之仓储层的优化相关推荐

  1. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建

    ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建 原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建    ASP.NET MV ...

  2. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(18)-过滤器的使用和批量删除数据(伪删除和直接删除)...

    ASP.NET MVC+EF框架+EasyUI实现权限管理系列(18)-过滤器的使用和批量删除数据(伪删除和直接删除) 原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(18)-过 ...

  3. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(13)-权限设计

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(13)-权限设计 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据 ...

  4. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(17)-注册用户功能的细节处理(各种验证)...

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(17)-注册用户功能的细节处理(各种验证) ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框 ...

  5. iris-v12 框架搭建二 mvc架构

    iris-v12 框架搭建二 mvc架构 在这里我就默认你已经会了搭建非mvc架构的方法(不懂得看iris-v12 框架搭建一 快速启动). 想要搭建mvc的架构非常简单,只要使用iris的mvc包就 ...

  6. 学习ASP.NET MVC系列 - 还有比这更简炼的吗?把复杂的事情变简单了,贡献啊!...

    转自 学习ASP.NET MVC系列: 学习ASP.NET MVC(一)--我的第一个ASP.NET MVC应用程序 学习ASP.NET MVC(二)--我的第一个ASP.NET MVC 控制器 学习 ...

  7. spring mvc + mybatis 框架搭建 ( idea + gradle)

    spring mvc + mybatis 框架搭建 idea + gradle 刚刚入门,只是个人见解,如有错误或者问题欢迎指出指正. 邮箱: [ wgh0807@qq.com ] 文章引用: [ap ...

  8. ASP.NET MVC+EF框架+EasyUI实现权限管理(附源码)

    前言目录 前言:时间很快,已经快到春节的时间了,这段时间由于生病,博客基本没更新,所以今天写一下我们做的一个项目吧,是对权限的基本操作的操作,代码也就不怎么说了,直接上传源码和图片展示,下面我们直接进 ...

  9. (转)一步一步Asp.Net MVC系列_权限管理设计起始篇

    原文地址:http://www.cnblogs.com/mysweet/archive/2012/07/26/2610793.html 前一段时间,写了一步一步asp.net的一系列博客,最近,也快要 ...

  10. ASP.NET MVC 4框架揭秘

    ASP.NET MVC 4框架揭秘(国内第一部Asp.net MVC 4图书,.NET名家名作,深度剖析) 蒋金楠 著 ISBN 978-7-121-19049-0 2013年1月出版 定价:89.0 ...

最新文章

  1. php删除目录下的所有文件和目录
  2. TP 720N V3 8M flash 无TTL 刷回原厂教程
  3. .Net CF下精确的计时器
  4. suse软件管理程序zypper
  5. js 的 math 函数
  6. 记一次el-input使用的坑
  7. Java基本语法(11)--三元运算符
  8. Docker自动补全容器名
  9. 集训01-03 (c++实现)
  10. centos6.x redhat6.x 升级openssh8.7
  11. 实现简单的字符串队列
  12. 将帐套升级到百万用户纪念版实践教程
  13. 黑莓8900刷机教程 即黑莓如何刷机
  14. UU跑腿前端中台方案
  15. 软考软件设计师(知识产权)
  16. 时间序列-异常检测(Anomaly Detection)(四):深度学习方法
  17. 安卓app保持屏幕常亮
  18. 大数据时代的地理信息科学与科研能力培养
  19. centos部署hadoop完全分布式
  20. python3.8与pyinstaller_pyinstaller 3.5 在python 3.8 环境下出现不兼容的问题

热门文章

  1. OkHttp Interceptors(二)
  2. 第二节:各种路由约束(动态路由、静态路由、组合路由、正则约束、命名空间约束、区域内路由)...
  3. Linux root找回密码的方法
  4. makefile编写---.c .cpp 混合编译makefile 模板
  5. 清除回收站苦闷纠结欣喜
  6. javascript的parseInt函数(转)
  7. [C#][共享网络] Netsh命令实现共享,并查询连接用户
  8. [2018.08.09 T3] 几何题
  9. Luogu2420 让我们异或吧
  10. 项目中一些零碎化总结的