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;

      }
   }
}

  

时间: 2024-10-06 00:12:18

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

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

邯郸学步 吾虽是一不知名的菜鸟,但,吾亦有一个从后台程序员成为一名小小架构师梦想,深知架构师不是想想就成的. 吾已工作过一阵子,吾妄想在真正毕业之后工作一年左右就能拿到那个数ten thousand的工资.勿喷! 我们成长的环境不同,也许有人一手栽培,也许只能一个人默默奋斗.不论怎样, 我们要先学会造轮子,但我只会造4个高质量的轮子.让我的车子稳健地跑起来! 深知实现这些规划,我必须要付出常人难以付出的努力! 这些东西,会了就是不值一提的东西,不会就是高大上. 更希望能给读者带来一些新的认识及知

ASP.NET MVC教程 框架搭建(一)之仓储层的搭建

大神勿喷,小神默默学. 会了就是不值一提的东西,不会就是绝对的高大上. 最后上传源码.希望能给读者带来一些新的认识及知识. 还没上过头条..各位大神,请点支持一下小弟. 陆续更新.更新到你会为止!! 仓储层:待优化 基接口:约束 子接口:实现基接口.进一步约束子仓储中特殊的方法. *基仓储:具体实现,子类继承接口的方法. 这步最难,最重要! ①db不能直接点出具体的Model,只能db.CreateObjectSet<T>().AddObject(entity);将实体“附加”到上下文. ②w

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

原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(1)-框架搭建 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) 前言:这篇博客开始我们便一步一步的来实现这个权限系统的初步设计-框架搭建,首先我要说的是我们需要开发工具Visual Studio 2012或者10也行,其次是我们要有SQL Server数据库,如果是Visual Studio 2010的话,你还要安装MVC4的开发文件,这个是吗?我不记得了,谁可以回答我一下的,我一直用2012,都是集成

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

http://www.cnblogs.com/hanyinglong/archive/2013/03/22/2976478.html ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开篇 前言:博客又有一段时间没有更新了,心里感觉这段时间空空的,好像什么都没有学下,所以就想写博客,所以就有了这个系列,这里当然也要感谢大家了,因这个 项目我已经上传了,得到了很多网友的评价,也有好多人发邮件给我说这个框架容易出现问题,不能访问,这也是支持我写这个系列的动力,我将这个项目写成一个 系列

ASP.NET MVC+EF框架+EasyUI实现权限管理系列(5)-前台JqueryEasyUI前台实现

原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(5)-前台JqueryEasyUI前台实现 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程   (4 ):业务逻辑层的封装 前言:今天经理买了一个诺基亚的Windows Phone 8系统,特感兴趣,所以在哪里看了很长时间,这篇文章就写的有点迟, 从这个Demo开始到现在我已经写了4篇博客了,终于可以看到页面的东

ASP.NET MVC+EF框架+EasyUI实现权限管理系列(4)-业务逻辑层的封装

原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(4)-业务逻辑层的封装 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程 前言:前面几篇博客我们基本已经介绍完了搭建整个项目和数据库访问层以及一些业务逻辑层的实现,当然了,我们的数据库访问层这样还是可以在进行封装的,但是我到这里就行了吧,项目也不大,不需要那么麻烦的,那么我们今天开始介绍我们需要介绍的内容,那就是我

ASP.NET MVC+EF框架+EasyUI实现权限管理系列(2)-数据库访问层的设计Demo

原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(2)-数据库访问层的设计Demo ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1)框架搭建 前言:这篇博客我们继续来实现我的权限系列,这个博客一段时间也没有写了,重点是我在想还写不写,最终我决定还是写下去,因为我们是为了学习,当别人提出意见的时候,我们可以参考和采纳,但是我们不一定非要采纳,上几篇博客大家都说用CodeFirst来实现,是啊,现在基本很少有人用我的这种方法来实现了,都是用CodeF

ASP.NET MVC+EF框架+EasyUI实现权限管理系列(6)- EF上下文实例管理

原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(6)- EF上下文实例管理 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程   (4 ):业务逻辑层的封装  (5):前台Jquery easyUI实现 前言:通过前面的五篇博客我们已经对权限系统的后台架构进行了详细的说明,那么我再前面的博客中也说到了我们的后台架构还会再改的,我准备这段时间我们继续完善我们的后台

ASP.NET MVC+EF框架+EasyUI实现权限管理系列(7)-DBSession的封装

原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(7)-DBSession的封装 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程   (4 ):业务逻辑层的封装  (5):前台Jquery easyUI实现   (6):EF上下文实例管理 前言:上篇博客中我们重新对EF框架实现上下文进行了重新的操作,而且我们也建立了DbSession,使用CallContext