项目架构开发:数据访问层之UnitOfWork (补充)
应lisansi同学回复(项目架构开发:数据访问层之UnitOfWork)要求,补上Dapper的DbContext实现
using Dapper.Contrib.Extensions;
using HG.Infrastructure.Common;
using System;
using System.Collections.Generic;
using System.Data;
using System.Transactions; namespace HG.Data.Dapper
{
public class DbContext
{
public IDbConnection Conn { get; set; } private Dictionary<object, Action> addEntities;
private Dictionary<object, Action> updateEntities;
private Dictionary<object, Action> deleteEntities; public DbContext()
{
Conn = DbConnectionFactory.CreateConnection(Enums.Core); addEntities = new Dictionary<object, Action>();
updateEntities = new Dictionary<object, Action>();
deleteEntities = new Dictionary<object, Action>();
} public void Add<TEntity>(TEntity entity) where TEntity : class
{
this.addEntities.Add(entity, () =>
{
Conn.Insert<TEntity>(entity);
});
} public void Update<TEntity>(TEntity entity) where TEntity : class
{
this.updateEntities.Add(entity, () =>
{
Conn.Update(entity);
});
} public void Delete<TEntity>(TEntity entity) where TEntity : class
{
this.deleteEntities.Add(entity, () =>
{
Conn.Delete(entity);
});
} public TEntity Get<TEntity>(int id) where TEntity : class
{
return Conn.Get<TEntity>(id);
} public int SaveChanges()
{
int count = ;
using (TransactionScope scope = new TransactionScope())
{
foreach (var entity in deleteEntities.Keys)
{
this.deleteEntities[entity]();
} foreach (var entity in updateEntities.Keys)
{
this.updateEntities[entity]();
} foreach (var entity in addEntities.Keys)
{
this.addEntities[entity]();
} scope.Complete(); count = deleteEntities.Count + updateEntities.Count + addEntities.Count; deleteEntities.Clear();
updateEntities.Clear();
addEntities.Clear(); if (Conn != null)
{
if (Conn.State == ConnectionState.Open)
{
Conn.Close();
} // Conn.Dispose();
}
} return count;
}
}
}
UnitOfWork相应改成如下
using HG.Data.Interface;
using System;
using System.Data; namespace HG.Data.Dapper
{
public class UnitOfWork : DbContext, IUnitOfWork, ICRUDUnitOfWork
{
public void RegisterNew<TEntity>(TEntity entity)
where TEntity : class
{
base.Add<TEntity>(entity);
} public void RegisterDirty<TEntity>(TEntity entity)
where TEntity : class
{
base.Update<TEntity>(entity);
} public void RegisterDeleted<TEntity>(TEntity entity)
where TEntity : class
{
base.Delete<TEntity>(entity);
} public void RegisterClean<TEntity>(TEntity entity)
where TEntity : class
{ } //public TEntity Get<TEntity>(int id)
// where TEntity : class
//{
// return base.Get<TEntity>(id);
//} public bool Commit()
{
return base.SaveChanges() > ;
} public void Rollback()
{
throw new NotImplementedException();
}
}
}
项目架构开发:数据访问层之UnitOfWork (补充)的更多相关文章
- 项目架构开发:数据访问层之UnitOfWork
接上文 项目架构开发:数据访问层之IQuery 本章我们继续IUnitOfWork的开发,从之前的IRepository接口中就可以看出,我们并没有处理单元事务, 数据CUD每次都是立即执行的,这样有 ...
- 企业级应用架构(三)三层架构之数据访问层的改进以及测试DOM的发布
在上一篇我们在宏观概要上对DAL层进行了封装与抽象.我们的目的主要有两个:第一,解除BLL层对DAL层的依赖,这一点我们通过定义接口做到了:第二,使我们的DAL层能够支持一切数据访问技术,如Ado.n ...
- 项目架构开发:数据访问层之Cache
数据访问层简单介绍 数据访问层,提供整个项目的数据访问与持久化功能.在分层系统中所有有关数据访问.检索.持久化的任务,最终都将在这一层完成. 来看一个比较经典的数据访问层结构图 大概可以看出如下信息 ...
- 项目架构开发:数据访问层之Logger
接上文 项目架构开发:数据访问层之Cache 本章我们继续ILogger的开发 ILogger.cs public interface ILogger { void Info(object messa ...
- 项目架构开发:数据访问层之Repository
接上文 项目架构开发:数据访问层之Logger 本章我们继续IRepository开发,这个仓储与领域模式里边的仓储有区别,更像一个工具类,也就是有些园友说的“伪仓储”, 这个仓储只实现单表的CURD ...
- 项目架构开发:数据访问层之Query
接上文 项目架构开发:数据访问层之Repository 上一章我们讲了IRepository接口,这张我们来讲IQuery 根据字面意思就可以知道,这次主要讲数据查询,上一章我们只针对单表做了查询的操 ...
- 随机获得MySQL数据库中100条数据方法 驾照题库项目 MVC架构 biz业务层的实现类 根据考试类型rand或order通过dao数据访问层接口得到数据库中100或全部数据
package com.swift.jztk.biz; import java.util.Collections; import java.util.Comparator; import java.u ...
- 数据访问层之Repository
数据访问层之Repository 接上文 项目架构开发:数据访问层之Logger 本章我们继续IRepository开发,这个仓储与领域模式里边的仓储有区别,更像一个工具类,也就是有些园友说的“伪 ...
- asp.net/wingtip/创建数据访问层
一. 什么是数据访问层 在wingtip项目中,数据访问层是对以下三者的总称:1. product类等数据相关的实体类(class)2. 数据库(database),对实体类成员的存储3. 上述二者的 ...
随机推荐
- Iframe 自适应高度
网页中,经常遇见嵌套问题.我们怎么解决好点,我个人喜欢使用 Html 中的 Iframe 标签.忘记在哪里找的代码了. Iframe 的代码: <iframe src="indexpa ...
- Android开发——使用LitePal开源数据库
前言:之前使用Android内置的数据库,感觉一大堆SQL语句,一不小心就错了,很难受,学习了这个LItePal的开源数据库,瞬间觉得Android内置的数据库简直是垃圾般的存在 LitePal Gi ...
- 【python】type()、instance()
>>> a=520 >>> type(a) <class 'int'> >>> a=' >>> type(a) &l ...
- ASP.NET Core使用SkiaSharp实现验证码
前言 本文并没有实现一个完成的验证码样例,只是提供了在当前.NET Core 2.0下使用Drawing API的另一种思路,并以简单Demo的形式展示出来. Skia Skia是一个开源的二维图形库 ...
- xamarin android checkbox自定义样式
xamarin android checkbox自定义样式 在drawable文件在新建checkbox_bg.xml文件 <?xml version="1.0" encod ...
- bzoj 4446: [Scoi2015]小凸玩密室
Description 小凸和小方相约玩密室逃脱,这个密室是一棵有n个节点的完全二叉树,每个节点有一个灯泡.点亮所有灯 泡即可逃出密室.每个灯泡有个权值Ai,每条边也有个权值bi.点亮第1个灯泡不需要 ...
- Docker -- 安全/部分命令/Daemon
Docker -- 终极指南 1.安装过程 -- Docker -- docker pull 镜像 -- docker images 列出镜像 -- docker run --rm -ti ub ...
- BOOTPROTO=[none|static|bootp|dhcp](引导时不使用协议|静态分配|BOOTP协议|DHCP协议)
BOOTPROTO=[none|static|bootp|dhcp](引导时不使用协议|静态分配|BOOTP协议|DHCP协议)
- 《Django By Example》Chap 4中出现的 “RelatedObjectDoesNotExist”错误
models.py
- maven 打包Could not resolve dependencies for project和无效的目标发行版: 1.8
1.maven 打包Could not resolve dependencies for project 最近项目上使用的是idea ide的多模块话,需要模块之间的依赖,比如说系统管理模块依赖授权模 ...