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

相关文章

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

springboot简单集成Security配置的教程

《springboot简单集成Security配置的教程》:本文主要介绍springboot简单集成Security配置的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录集成Security安全框架引入依赖编写配置类WebSecurityConfig(自定义资源权限规则

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

Python GUI框架中的PyQt详解

《PythonGUI框架中的PyQt详解》PyQt是Python语言中最强大且广泛应用的GUI框架之一,基于Qt库的Python绑定实现,本文将深入解析PyQt的核心模块,并通过代码示例展示其应用场... 目录一、PyQt核心模块概览二、核心模块详解与示例1. QtCore - 核心基础模块2. QtWid

一文带你了解SpringBoot中启动参数的各种用法

《一文带你了解SpringBoot中启动参数的各种用法》在使用SpringBoot开发应用时,我们通常需要根据不同的环境或特定需求调整启动参数,那么,SpringBoot提供了哪些方式来配置这些启动参... 目录一、启动参数的常见传递方式二、通过命令行参数传递启动参数三、使用 application.pro

如何使用Python实现一个简单的window任务管理器

《如何使用Python实现一个简单的window任务管理器》这篇文章主要为大家详细介绍了如何使用Python实现一个简单的window任务管理器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 任务管理器效果图完整代码import tkinter as tkfrom tkinter i

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

一文带你深入了解Python中的GeneratorExit异常处理

《一文带你深入了解Python中的GeneratorExit异常处理》GeneratorExit是Python内置的异常,当生成器或协程被强制关闭时,Python解释器会向其发送这个异常,下面我们来看... 目录GeneratorExit:协程世界的死亡通知书什么是GeneratorExit实际中的问题案例

最新Spring Security实战教程之Spring Security安全框架指南

《最新SpringSecurity实战教程之SpringSecurity安全框架指南》SpringSecurity是Spring生态系统中的核心组件,提供认证、授权和防护机制,以保护应用免受各种安... 目录前言什么是Spring Security?同类框架对比Spring Security典型应用场景传统