大神勿喷,小神默默学。

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

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

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

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

我不是话唠,我只把重点点出来,细枝末节的不懂的可以留言探讨。这个系列的最后,我会再统一的把大家的问题,列在一篇新的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
{
//继承接口①接口要编译过,②引入接口所用的程序集+ using
class 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; }
}
}

  

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. 【python】argparse模块

    来源:http://www.2cto.com/kf/201412/363654.html argparse是python用于解析命令行参数和选项的标准模块,用于代替已经过时的optparse模块.ar ...

  2. 【USACO】sprime

    有了前面的基础,做这道题真是so easy啊. 因为要分解后每个数都是素数,所以采用先生成短的素数,长的素数在短素数的基础上生成. 比如长度为1的素数只有 2 3 5 7, 那么符合要求的长度为2的素 ...

  3. redhad借用CentOs yum 安装

    RedHat linux 默认是安装了yum软件的,但是由于激活认证的原因让redhat无法直接进行yum安装一些软件,如果我们需要在redhat下直接yum安装软件,我们只用把yum的源修改成Cen ...

  4. OOP 7大原则

    1.  开闭原则(Open-Closed Principle,OCP) 1)定义:一个软件实体应当对扩展开放,对修改关闭( Software entities should be open for e ...

  5. Javascript模块化编程之路——(require.js)

    转自:http://www.ruanyifeng.com/blog/2012/10/javascript_module.html Javascript模块化编程(一):模块的写法 随着网站逐渐变成&q ...

  6. 最新版Duilib在VS2012下编译错误的解决方法

            svn了好几次最新版本的项目源代码, 在VS2012下编译老是出错, 改了后没记录, 结果又忘记, 所以在此记录下.        这个问题很普遍, 非常多的人遇到.       至于 ...

  7. 修改ViewPager调用setCurrentItem时,滑屏的速度

    原文摘自: 修改ViewPager调用setCurrentItem时,滑屏的速度 在使用ViewPager的过程中,有需要直接跳转到某一个页面的情况,这个时候就需要用到ViewPager的setCur ...

  8. hihoCoder挑战赛14 -1223

    描述 给定n个关于X的不等式,问最多有多少个成立. 每个不等式为如下的形式之一: X < C X <= C X = C X > C X >= C 输入 第一行一个整数n. 以下 ...

  9. PHP扩展开发

    安装好php,进入安装目录. zbseoag@ubuntu:/usr/local/php-5.6.28/ext$ ./ext_skel --extname=mytest zbseoag@ubuntu: ...

  10. lr数据库参数化取数:The query result is empty and same is the parameter file问题原因

    出现这个问题的原因: 是因为我们的查询结果存在中文 如果查询结果没有中文,显示正常 解决办法: 新建一个数据源: 重新再选择这个数据源,再次查询: 说明不是连接字符串的问题或者是mysql驱动的问题 ...