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

相关文章

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu2289(简单二分)

虽说是简单二分,但是我还是wa死了  题意:已知圆台的体积,求高度 首先要知道圆台体积怎么求:设上下底的半径分别为r1,r2,高为h,V = PI*(r1*r1+r1*r2+r2*r2)*h/3 然后以h进行二分 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#includ

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

uva 10387 Billiard(简单几何)

题意是一个球从矩形的中点出发,告诉你小球与矩形两条边的碰撞次数与小球回到原点的时间,求小球出发时的角度和小球的速度。 简单的几何问题,小球每与竖边碰撞一次,向右扩展一个相同的矩形;每与横边碰撞一次,向上扩展一个相同的矩形。 可以发现,扩展矩形的路径和在当前矩形中的每一段路径相同,当小球回到出发点时,一条直线的路径刚好经过最后一个扩展矩形的中心点。 最后扩展的路径和横边竖边恰好组成一个直

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu

uva 10130 简单背包

题意: 背包和 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <queue>#include <map>

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

数据治理框架-ISO数据治理标准

引言 "数据治理"并不是一个新的概念,国内外有很多组织专注于数据治理理论和实践的研究。目前国际上,主要的数据治理框架有ISO数据治理标准、GDI数据治理框架、DAMA数据治理管理框架等。 ISO数据治理标准 改标准阐述了数据治理的标准、基本原则和数据治理模型,是一套完整的数据治理方法论。 ISO/IEC 38505标准的数据治理方法论的核心内容如下: 数据治理的目标:促进组织高效、合理地