ITOO框架简单了解

2024-08-26 03:18
文章标签 简单 框架 了解 itoo

本文主要是介绍ITOO框架简单了解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、回顾三层

这里写图片描述

二、D层重构

我们在敲D层的时候,UserDAL和RoleDAL中都包含实现对数据库的操作,也就是增删改查,那么我们可以将这些公共的东西抽象出来实现一个固定的功能的基类(BaseDAL),然后我们对其进行继承操作。

  • BaseDAL
public class BaseRepository<T> where T : class{ //创建EF上下文private LYZJEntities dbLYZJ = new LYZJEntities();
#region 实现对数据库的修改功能+UpdateEntity+王娜+2016年1月9日16:38:30/// <summary>/// 实现对数据库的修改功能+UpdateEntity+王娜+2016年1月9日16:38:30/// </summary>/// <param name="entity"></param>/// <returns></returns>public bool UpdateEntity(T entity) {dbLYZJ.Set<T>().Attach(entity);dbLYZJ.Entry<T>(entity).State = EntityState.Modified;return dbLYZJ.SaveChanges() > 0;}#endregion}

这里写图片描述

  • 针对面向接口编程

    这里写图片描述

三、B层重构

  • BaseService类
    在B层中的每个类,都有实例化D层的过程,现在我们将这个过程进行封装,建立一个基类(BaseService)
public abstract class BaseService<T>where T:class,new(){public IDAL.IBaseRepository<T> CurrentRepository { get; set; }//构造函数public BaseService(){SetCurrentRepository();//构造函数里面去调用,设置当前DAL的抽象 }public abstract void SetCurrentRepository();//必须由子类实现}
  • UserInfoService类
public class UserInfoService:BaseService<UserInfo>{public override void SetCurrentRepository(){CurrentRepository = DAL.UserInfoRepository;}public bool UpdateEntity(T entity){return CurrentReository.UpdateEntity(entity);}}

因为,子类调用哪个D层,只有子类(UserInfoService)清楚,父类(BaseService)不知道,所以,我们调用一个抽象方法public abstract void SetCurrentRepository()让子类自己进行实现;因为我们所有的D层类都间接的继承于IBaseDAL,所以我们可以使用IBaseDAL类接收当前的DAL。

  • 针对面向接口编程

这里写图片描述

四、B层对于D层的引用

之前,我们是B层直接调用D层,现在我们立一个数据层的统一入口——Factory来进行封装。

  • RepositoryFactory
public class RepositoryFactory{#region 王娜+2016年1月10日16:30:59public static IUserInfoRepository UserInfoRepository{get { return new UserInfoRepository(); }}#endregion#region 王娜+2016年1月10日16:31:12public static IRoleRepository RoleRepository{get { return new RoleRepository(); }}#endregion
  • 业务逻辑层实例化D层的代码:
private IUserInfoRepository _userInfoRepository = RepositoryFactory.UserInfoRepository;

五、D层对EF上下文的管理

在此之前,我们先了解一下EF,EF是跟踪实体变化,然后将此变化映射到数据库的表中。EF上下文(DbContext)是与数据库的一次会话,我们要保证DbContext的线程唯一性。
原因
这里写图片描述
如何保证EF上下文的唯一性呢?我们创建一个EFContextFactory工厂,让工厂中的GetCurrentDbContext()方法返回实例。

  • EFContextFactory
public partial class EFContextFactory{/// <summary>/// 帮我们返回当前线程内的数据库上下文,如果当前线程内没有上下文,那么创建一个上下文,并保证/// 上下文是实例在线程内部唯一 /// 在EF4.0以前使用ObjectsContext对象/// </summary>/// <returns></returns>public static DbContext GetCurrentDbContext(){//当第二次执行的时候直接取出线程嘈里面的对象//CallContext:是线程内部唯一的独用的数据槽(一块内存空间)//数据存储在线程栈中//线程内共享一个单例DbContext dbcontext = CallContext.GetData("DbContext") as DbContext;//判断线程里面是否有数据if (dbcontext == null)  //线程的数据槽里面没有次上下文{dbcontext = new DataModelContainer();  //创建了一个EF上下文//存储指定对象CallContext.SetData("DbContext", dbcontext);}return dbcontext;}}
  • BaseDAL修改为:
public partial class BaseDAL<T> where T : class{//EF上下文的实例保证,线程内唯一//实例化EF框架//DataModelContainer db = new DataModelContainer();//修改部分//获取的实当前线程内部的上下文实例,而且保证了线程内上下文实例唯一private DbContext db = EFContextFactory.GetCurrentDbContext();}
  • DbSession(之前的工厂RepositoryFactory):
public class DbSession //代表应用程序跟数据库之间的一次会话,也是数据库访问层的统一入口
{public IDAL.IRoleDAL RoleDAL{ get{ return new RoleDAL();} }public IDAL.IUserInfoDAL UserInfoDAL{get{return new UserInfoDAL();}} public int SaveChanges()  //UintWork单元工作模式{   //调用EF上下文的SaveChanges的方法return DAL.EFContextFactory.GetCurrentDbContext().SaveChanges();}
}

现在,我们实现了对于EF上下文的线程唯一性管理,那么为什么我们要在DbSession中调用EF上下文的SaveChanges方法呢?这里的SaveChanges方法相当于直接把当前线程内部所有实体的改变提交到数据库里面。当我们把BaseDAL中增删改方法中的SaveChanges方法删除掉时,我们的数据库访问层虽然调用了增删改的方法,但是没有真正的保存到数据库里面,这时,因为RepositoryFactory是数据层的统一入口,将SaveChanges全部给放到DbSession中去实现,DbSession我们就能够看成一个真正的会话了。也就是说我们在前面调用了很多次的增删改的实体之后(操作很多表),而只需要去DbSession中调用一个SaveChanges方法,就可以把所有的表实体的变化都放到数据库中去。

  • D层与EF上下文的关系

这里写图片描述

  • BaseService修改:
public abstract class BaseService<T> where T : class,new()
{//在调用这个方法的时候必须给他赋值public IDAL.IBaseRepository<T> CurrentRepository { get; set; }//DbSession的存放public DbSession _DbSession = new DbSession();       //基类的构造函数public BaseService(){SetCurrentRepository();  //构造函数里面调用了此设置当前仓储的抽象方法}//构造方法实现赋值 public abstract void SetCurrentRepository();  //约束子类必须实现这个抽象方法
}

所以DbSession兼顾了简单工厂模式和SaveChange方法。然后因为DbSession就是我们整个数据库访问层的入口,那么我们DbSession也必须由一个接口的约束,那么我们在数据库访问接口层(LYZJ.UserLimitMVC.IDAL类库)加个接口约束,新建接口IDbSession。

  • 业务逻辑层DbSession线程内唯一

    (1)通过前面的博客我们知道我们将数据库访问层的BaseDAL(仓储)使用简单工厂来实现了线程内唯一的定义,代码如下:

//获取的实当前线程内部的上下文实例,而且保证了线程内上下文实例唯一private DbContext db = EFContextFactory.GetCurrentDbContext();

(2)按照上面的说法的话,那么我们的业务逻辑层来获取DbSession的时候也是使用简单工厂来实现线程内唯一,那么我们修改DbSession的定义如下:

public abstract class BaseService<T> where T : class,new()
{//DbSession的存放public IDbSession _dbSession = DbSessionFactory.GetCurrentDbSession();
}

最后看一下DbSessionFactory的代码:

public class DbSessionFactory{/// <summary>/// 保证了线程内DbSession实例唯一/// </summary>/// <returns></returns>public static IDbSession GetCurrentDbSession(){IDbSession _dbSession = CallContext.GetData("DbSession") as IDbSession;if (_dbSession == null){_dbSession = new DbSession();CallContext.SetData("DbSession", _dbSession);}return _dbSession;}

这篇关于ITOO框架简单了解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1107399

相关文章

Spring 框架之Springfox使用详解

《Spring框架之Springfox使用详解》Springfox是Spring框架的API文档工具,集成Swagger规范,自动生成文档并支持多语言/版本,模块化设计便于扩展,但存在版本兼容性、性... 目录核心功能工作原理模块化设计使用示例注意事项优缺点优点缺点总结适用场景建议总结Springfox 是

Python的端到端测试框架SeleniumBase使用解读

《Python的端到端测试框架SeleniumBase使用解读》:本文主要介绍Python的端到端测试框架SeleniumBase使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录SeleniumBase详细介绍及用法指南什么是 SeleniumBase?SeleniumBase

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

C/C++ chrono简单使用场景示例详解

《C/C++chrono简单使用场景示例详解》:本文主要介绍C/C++chrono简单使用场景示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录chrono使用场景举例1 输出格式化字符串chrono使用场景China编程举例1 输出格式化字符串示

C++ HTTP框架推荐(特点及优势)

《C++HTTP框架推荐(特点及优势)》:本文主要介绍C++HTTP框架推荐的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Crow2. Drogon3. Pistache4. cpp-httplib5. Beast (Boos

windows和Linux安装Jmeter与简单使用方式

《windows和Linux安装Jmeter与简单使用方式》:本文主要介绍windows和Linux安装Jmeter与简单使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows和linux安装Jmeter与简单使用一、下载安装包二、JDK安装1.windows设

SpringBoot基础框架详解

《SpringBoot基础框架详解》SpringBoot开发目的是为了简化Spring应用的创建、运行、调试和部署等,使用SpringBoot可以不用或者只需要很少的Spring配置就可以让企业项目快... 目录SpringBoot基础 – 框架介绍1.SpringBoot介绍1.1 概述1.2 核心功能2

Spring框架中@Lazy延迟加载原理和使用详解

《Spring框架中@Lazy延迟加载原理和使用详解》:本文主要介绍Spring框架中@Lazy延迟加载原理和使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、@Lazy延迟加载原理1.延迟加载原理1.1 @Lazy三种配置方法1.2 @Component

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经