ASP.NET MVC系列 框架搭建(二)之仓储层的优化
大神勿喷,小神默默学。
会了就是不值一提的东西,不会就是绝对的高大上。
最后上传源码。希望能给读者带来一些新的认识及知识。
还没上过头条。。各位大神,请点支持一下小弟。
陆续更新。更新到你会为止!!
我不是话唠,我只把重点点出来,细枝末节的不懂的可以留言探讨。这个系列的最后,我会再统一的把大家的问题,列在一篇新的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系列 框架搭建(二)之仓储层的优化的更多相关文章
- ASP.NET MVC系列 框架搭建(三)之服务层的搭建
邯郸学步 吾虽是一不知名的菜鸟,但,吾亦有一个从后台程序员成为一名小小架构师梦想,深知架构师不是想想就成的. 吾已工作过一阵子,吾妄想在真正毕业之后工作一年左右就能拿到那个数ten thousand的 ...
- ASP.NET MVC系列 框架搭建(一)之仓储层的搭建
大神勿喷,小神默默学. 会了就是不值一提的东西,不会就是绝对的高大上. 最后上传源码.希望能给读者带来一些新的认识及知识. 还没上过头条..各位大神,请点支持一下小弟. 陆续更新.更新到你会为止!! ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 (2 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(1)-框架搭建
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(1)-框架搭建 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) 前言:这篇博客开始我们便一步一步的来实现这 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(18)-过滤器的使用和批量删除数据(伪删除和直接删除)
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(18)-过滤器的使用和批量删除数据(伪删除和直接删除) ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(24)-权限组的设计和实现(附源码)(终结)
ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 (2):数据库访问层的设计Demo (3):面向接口编程 (4 ):业务逻辑层的封装 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(23)-设置角色遗留问题和为权限设置角色以及EasyUI Tabs的使用
ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 (2):数据库访问层的设计Demo (3):面向接口编程 (4 ):业务逻辑层的封装 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(22)-为用户设置角色
ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 (2):数据库访问层的设计Demo (3):面向接口编程 (4 ):业务逻辑层的封装 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列
http://www.cnblogs.com/hanyinglong/archive/2013/03/22/2976478.html ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开 ...
随机推荐
- 【python】继承时注意事项
1. __init__ 注意事项 如果父类有__init__函数,子类没有,则子类自动调用父类__init__函数 如果父类有__init__函数,子类也有,则子类必须主动调用父类__init__函数 ...
- ***PHP类型转换实例:$this->input->get()返回的结果是字符串类型(数字字符串转数字)
一个GET的REST API,请求有三个参数,且都是数字 用$this->input->get()方法获取后的结果是字符串,需要转换为数字:如果没有获取到数据,则会返回false,需要用e ...
- JS输入框邮箱自动提示(带有demo和源码)(转载)
今天在javascriptQQ群里面 有童鞋问到 有没有 "JS输入框邮箱自动提示"插件,即说都找遍了github上源码 都没有看到这样类似的插件,然后我想了下 "JS输 ...
- Hierachy Viewer 使用 monitor命令
使用 Hierachy Viewer 可视化调试工具 Hierachy Viewer 能很方便地在开发者设计,调试和调整界面时,快速定位问题,解决问题,提高开发效率. Hierarchy Viewer ...
- Sql server之路 (四)添加本地数据库MDF文件
安装环境 VS2008 Vs2008 Sp1 安装系统 Win8 1.创建窗体 右键添加新项 上一步 上一步 点击确定 双击Database1.mdf文件 在列名出填写字段名 保存 Ctrl+S 点 ...
- 布局文件中fill_parent、match_parent和wrap_content有什么区别?
fill_parent 宽度或者高度 布满整个屏幕从Android 2.2开始fill_parent改名为match_parent.wrap_content布局元素将根据内容更改大小.
- ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component解决
第一:先确定一下开发流程是否正确 1.写好servlet组件类 2.写好web.xml文件--向服务器介绍组件 3.发布--就是拷贝 注意:要拷贝包结构,不要只拷贝组件类文件 另外,拷贝的是.clas ...
- HDFS机架感知功能原理(rack awareness)
转自:http://www.jianshu.com/p/372d25352d3a HDFS NameNode对文件块复制相关所有事物负责,它周期性接受来自于DataNode的HeartBeat和Blo ...
- Loadrunner关联
学习LoadRunner之关联(二) Lr学习之关联-随机删除一行数据和全部删除数据 录制一个系统,我录制的是一个交通方面的系统,登陆到系统里面,查询车牌颜色,将其中一条数据删除. "Nam ...
- android native开发时:java.lang.UnsatisfiedLinkError: Native method not found的处理
这个异常一般是由于JNI的链接器不能正常识别C++的函数名造成的.处理的方法是用exern "C" {},来包裹需要export的C++的native方法. 如果native的方法 ...