大神勿喷,小神默默学。

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

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

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

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

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

需求

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

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

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

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

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

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

思路

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

②面向接口的思想

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

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

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

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

思想

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

详情代码

ISingleEFCntextFactory.cs

  1. using System.Data.Objects;
  2.  
  3. namespace LKBS.CommunicationPlatform.IDAL
  4. {
  5. public interface ISingleEFCntextFactory
  6. {//no public
  7. ObjectContext GetCurrentEFContext();
  8. }
  9. }

SingleEFCntextFactory.cs

  1. using LKBS.CommunicationPlatform.IDAL;
  2. using System.Data.Objects;//添加引用 System.Data.Entity
  3. using System.Runtime.Remoting.Messaging;
  4. using LKBS.CommunicationPlatform.Model;
  5.  
  6. namespace LKBS.CommunicationPlatform.Factory
  7. {
  8. public class SingleEFCntextFactory : ISingleEFCntextFactory
  9. {
  10. public ObjectContext GetCurrentEFContext()
  11. {
  12. //把上下文(基类)放在一个线程内。让一次请求(一个ACTION)可能执行CRUD中的几步,公用一个上下文.
  13. ObjectContext callEFContext = (ObjectContext)CallContext.GetData("efContext");//线程槽 存放“键值对”
  14. //先读后写。没有就new一个上下文
  15. if (callEFContext == null)
  16. {
  17. callEFContext = new ModelContainer();
  18. }
  19. CallContext.SetData("efContext", callEFContext);
  20. return callEFContext;
  21. }
  22. }
  23. }

BaseRespository.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. using System.Data.Entity;
  7. using LKBS.CommunicationPlatform.Model;
  8. using LKBS.CommunicationPlatform.IDAL;
  9. using System.Data;
  10. using LKBS.CommunicationPlatform.Factory;
  11. using System.Data.Objects;
  12.  
  13. namespace LKBS.CommunicationPlatform.DAL
  14. {
  15. public class BaseRespository<T> where T : class,new()
  16. {
  17. ISingleEFCntextFactory singleEFFactory = new SingleEFCntextFactory();
  18. //中间加一个工厂,这里“去除”ef和具体仓储的耦合。可以更换ef。而Respositiry db不用变
  19. ObjectContext db;//如果没赋值,那就是赋值的问题。找对应赋值的工厂 或者工厂还没编译
  20. public BaseRespository()
  21. {
  22. ObjectContext db = singleEFFactory.GetCurrentEFContext();
  23. }
  24.  
  25. //ModelContainer db = efFactory.GetCurrentEFContext();
  26. //字段初始值无法引用非静态字段、方法或属性.
  27. //那我们在构造方法内赋值
  28. ....CRUD
  29. }
  30. }

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

IDBContact.cs

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

DBContact.cs

  1. using LKBS.CommunicationPlatform.IDAL;
  2. using System.Data.Objects;//上下文的命名空间
  3. using LKBS.CommunicationPlatform.Factory;
  4.  
  5. namespace LKBS.CommunicationPlatform.DAL
  6. {
  7. public class DBContact : IDBContact
  8. {
  9. public ObjectContext currentEFContext { get; set; }
  10. ISingleEFCntextFactory singleEFCntextFactory = new SingleEFCntextFactory();//SingleEFCntextFactory做到单一上下文
  11. public DBContact()
  12. {
  13. currentEFContext = singleEFCntextFactory.GetCurrentEFContext();//
  14. }
  15. public IUserInforRespository userinforResponsity { get; set; }
  16. }
  17. }

ISingleDBContactFactory.cs

  1. namespace LKBS.CommunicationPlatform.IDAL
  2. {
  3. public interface ISingleDBContactFactory
  4. {
  5. IDBContact CreateDBCotactUseEF();
  6. }
  7. }

SingleDBContactFactory.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. using LKBS.CommunicationPlatform.IDAL;
  7. using System.Data.Objects;
  8. using System.Runtime.Remoting.Messaging;
  9. using LKBS.CommunicationPlatform.DAL;
  10.  
  11. namespace LKBS.CommunicationPlatform.Factory
  12. {
  13. //继承接口①接口要编译过,②引入接口所用的程序集+ using
  14. class SingleDBContactFactory : ISingleDBContactFactory
  15. {
  16. public IDBContact CreateDBCotactUseEF()
  17. {
  18. //ObjectContext currentEFContext = new ObjectContext("currentEFContext");
  19. //return currentEFContext;
  20. IDBContact dbCotact = (DBContact)CallContext.GetData("currentDBContact");
  21. if (dbCotact==null)
  22. {
  23. dbCotact = new DBContact();
  24. }
  25. CallContext.SetData("currentDBContact", dbCotact);
  26. return dbCotact;
  27.  
  28. }
  29. }
  30. }

  

ASP.NET MVC系列 框架搭建(二)之仓储层的优化的更多相关文章

  1. ASP.NET MVC系列 框架搭建(三)之服务层的搭建

    邯郸学步 吾虽是一不知名的菜鸟,但,吾亦有一个从后台程序员成为一名小小架构师梦想,深知架构师不是想想就成的. 吾已工作过一阵子,吾妄想在真正毕业之后工作一年左右就能拿到那个数ten thousand的 ...

  2. ASP.NET MVC系列 框架搭建(一)之仓储层的搭建

    大神勿喷,小神默默学. 会了就是不值一提的东西,不会就是绝对的高大上. 最后上传源码.希望能给读者带来一些新的认识及知识. 还没上过头条..各位大神,请点支持一下小弟. 陆续更新.更新到你会为止!! ...

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

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

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

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(1)-框架搭建 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) 前言:这篇博客开始我们便一步一步的来实现这 ...

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

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

  6. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(24)-权限组的设计和实现(附源码)(终结)

    ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程   (4 ):业务逻辑层的封装    ...

  7. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(23)-设置角色遗留问题和为权限设置角色以及EasyUI Tabs的使用

    ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程   (4 ):业务逻辑层的封装    ...

  8. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(22)-为用户设置角色

    ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程   (4 ):业务逻辑层的封装    ...

  9. ASP.NET MVC+EF框架+EasyUI实现权限管理系列

    http://www.cnblogs.com/hanyinglong/archive/2013/03/22/2976478.html ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开 ...

随机推荐

  1. Android 设置旋转朝向

    在AndroidMenifest.xml中activity标签中,添加一个属性 android:screenOrientation="landscape"

  2. hadoop中常见的问题

    一.在root下进行格式化 这样很糟糕 这样的话,若是第一次装的话,我的建议是将生成的文件都删掉,恢复到最开始的状态, 1. 首先你需要删除 vi conf/hdfs-site.xml   配置文件的 ...

  3. 安装win7或win8系统时UEFI和Legacy模式的设置

    很多新型号的笔记本或台式机主板都开始支持UEFI模式,比起原来的Legacy启动减少了BIOS自检,加快平台启动,如下图所示Legacy,UEFI启动过程: 安装系统,建议选择Legacy模式,在UE ...

  4. 使用rsync 的 --delete参数删除目标目录比源目录多余的文件

    root@v01 ~]# mkdir dir01 dir02 [root@v01 ~]# ls anaconda-ks.cfg dir02 framework install.log.syslog m ...

  5. PHPcms怎么调用二级栏目

    {pc:content action=" siteid="$siteid" order="listorder ASC"}             {l ...

  6. SAE上传web应用(包括使用数据库)教程详解及问题解惑

    转自:http://blog.csdn.net/baiyuliang2013/article/details/24725995 SAE上传web应用(包括使用数据库)教程详解及问题解惑: 最近由于工作 ...

  7. 深入理解 KVC\KVO 实现机制 — KVC

    KVC和KVO都属于键值编程而且底层实现机制都是isa-swizzing,所以本来想放在一起讲的.但是篇幅有限所以就分成了两篇博文 KVO实现机制传送门 KVC概述 KVC是Key Value Cod ...

  8. NDK开发

    1 CDT 是 Eclipse 插件,它将把 Eclipse 转换为功能强大的 C/C++ IDE. C/C++在Eclipse平台下的开发工具.它提供的功能包括:C/C++编辑器(一些基本的功能:语 ...

  9. Linphone iOS客户端编译时打开G729支持

    Assuming you were able to compile the SDK and the linphone XCode project, here is what you need to d ...

  10. 基于Extjs的web表单设计器 第六节——界面框架设计

    基于Extjs的web表单设计器 基于Extjs的web表单设计器 第一节 基于Extjs的web表单设计器 第二节——表单控件设计 基于Extjs的web表单设计器 第三节——控件拖放 基于Extj ...