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

相关文章

GSON框架下将百度天气JSON数据转JavaBean

《GSON框架下将百度天气JSON数据转JavaBean》这篇文章主要为大家详细介绍了如何在GSON框架下实现将百度天气JSON数据转JavaBean,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言一、百度天气jsON1、请求参数2、返回参数3、属性映射二、GSON属性映射实战1、类对象映

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

python连接sqlite3简单用法完整例子

《python连接sqlite3简单用法完整例子》SQLite3是一个内置的Python模块,可以通过Python的标准库轻松地使用,无需进行额外安装和配置,:本文主要介绍python连接sqli... 目录1. 连接到数据库2. 创建游标对象3. 创建表4. 插入数据5. 查询数据6. 更新数据7. 删除

Jenkins的安装与简单配置过程

《Jenkins的安装与简单配置过程》本文简述Jenkins在CentOS7.3上安装流程,包括Java环境配置、RPM包安装、修改JENKINS_HOME路径及权限、启动服务、插件安装与系统管理设置... 目录www.chinasem.cnJenkins安装访问并配置JenkinsJenkins配置邮件通知

解决若依微服务框架启动报错的问题

《解决若依微服务框架启动报错的问题》Invalidboundstatement错误通常由MyBatis映射文件未正确加载或Nacos配置未读取导致,需检查XML的namespace与方法ID是否匹配,... 目录ruoyi-system模块报错报错详情nacos文件目录总结ruoyi-systnGLNYpe

Python yield与yield from的简单使用方式

《Pythonyield与yieldfrom的简单使用方式》生成器通过yield定义,可在处理I/O时暂停执行并返回部分结果,待其他任务完成后继续,yieldfrom用于将一个生成器的值传递给另一... 目录python yield与yield from的使用代码结构总结Python yield与yield

Python Web框架Flask、Streamlit、FastAPI示例详解

《PythonWeb框架Flask、Streamlit、FastAPI示例详解》本文对比分析了Flask、Streamlit和FastAPI三大PythonWeb框架:Flask轻量灵活适合传统应用... 目录概述Flask详解Flask简介安装和基础配置核心概念路由和视图模板系统数据库集成实际示例Stre

Java中使用 @Builder 注解的简单示例

《Java中使用@Builder注解的简单示例》@Builder简化构建但存在复杂性,需配合其他注解,导致可变性、抽象类型处理难题,链式编程非最佳实践,适合长期对象,避免与@Data混用,改用@G... 目录一、案例二、不足之处大多数同学使用 @Builder 无非就是为了链式编程,然而 @Builder

Olingo分析和实践之OData框架核心组件初始化(关键步骤)

《Olingo分析和实践之OData框架核心组件初始化(关键步骤)》ODataSpringBootService通过初始化OData实例和服务元数据,构建框架核心能力与数据模型结构,实现序列化、URI... 目录概述第一步:OData实例创建1.1 OData.newInstance() 详细分析1.1.1

Spring 框架之Springfox使用详解

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