项目架构开发:数据访问层之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. 上述二者的 ...
 
随机推荐
- 怎样在Spark、Flink应用中使用Protobuf 3的包
			
如果在在Spark.Flink应用中使用Protobuf 3的包,因为Spark默认使用的是2.5版本的包,提交任务时,可能会报如下异常: com.google.protobuf.CodedInput ...
 - 数据加密,android客户端和服务器端可共用
			
安卓中,不管是内网还是外网,数据的传输首要考虑就是安全问题,尤其是用户信息,以及各种密码等敏感信息. 所以说,对数据的加密是很有必要的,尤其是当下物联网蓬勃发展的今天,数据安全尤为重要. 数据加密的方 ...
 - Oracle数据库部分迁至闪存存储方案
			
Oracle数据库部分迁至闪存存储方案 1.实施需求 2.确认迁移表空间信息 3.确认redo信息 4.确认undo信息 5.表空间迁移到闪存 6.redo迁移到闪存 7.undo迁移到闪存 8.备库 ...
 - SVO环境搭建
			
我是装了双系统,实验OS:Ubuntu14.04 Installation: Plain CMake (No ROS) 首先,建立一个工作目录比如:workspace,然后把下面的需要的都在该目录下进 ...
 - MST系列
			
1.POJ2485 Highways 蛮水的 数组一开始开小了卡了一会儿 我可能是个傻逼 #include<iostream> #include<cstdio> #includ ...
 - 关于《Web接口开发与自动化测试--基于Python语言》
			
关于封面logo 首先,你会被书封上面logo吸引,这么炫酷?双蛇杖?嗯,这是Requests的新logo. 旧的logo是一只乌龟. 新logo是双蛇杖: 看到新logo我首先想到的是 火爆全网页游 ...
 - tomcat部署项目时省略项目名
			
大家也许知道在eclipse上通过新建server来部署项目到tomcat,并且通过server来管理项目的启动配置.server会自动创建启动该项目的xml 如: <Context docBa ...
 - centos7 部署dns服务器
			
=============================================== 2017/12/6_第2次修改 ccb_warlock 20 ...
 - FPGA 设计总结(1)
			
1. set_input_delay和set_output_delay的选项-max和-min的理解 首先 input/output其实是模拟数据在端口外的延时,是一个外部约束条件,目的是为了约束FP ...
 - 5、员工上班时间的问题 - CEO之公司管理经验谈
			
员工上班时间一般是根据公司的规章制度来制定的.当然,在不同的地点也有不同的做法.比如北京.上海.广州.深圳这些重点的大点的城市,加班的时间就相对比较多一些.但是按照笔者的想法,一般是一天7-8小时工作 ...