本文实现Dapper操作数据统一提交和事物的AOP操作

1、新建个core项目

2、添加DbSession类

using System;
using System.Data;
using System.Data.Common;namespace DapperUowTests.Data
{public sealed class DbSession : IDisposable{public IDbConnection Connection { get; }public IDbTransaction Transaction { get; set; }public DbSession(DbConnection connection){Connection = connection;Connection.Open();}public void Dispose() => Connection?.Dispose();}
}

2、添加IUnitOfWork接口

using System;namespace DapperUowTests.Data
{public interface IUnitOfWork : IDisposable{void BeginTransaction();void Commit();void Rollback();}
}

3、实现接口UnitOfWork

using System.ComponentModel.Composition;
using System.Data;namespace DapperUowTests.Data
{public sealed class UnitOfWork : IUnitOfWork{private readonly DbSession _session;public UnitOfWork(DbSession session){_session = session;}public void BeginTransaction(){_session.Transaction = _session.Connection.BeginTransaction();}public void Commit(){_session.Transaction.Commit();Dispose();}public void Rollback(){_session.Transaction.Rollback();Dispose();}public void Dispose() => _session.Transaction?.Dispose();}
}

4、添加数据操作类NotificationRepository

using System;
using System.Collections.Generic;
using Dapper;namespace DapperUowTests.Data
{public class NotificationRepository{private DbSession _session;public NotificationRepository(DbSession session){_session = session;}public IEnumerable<NotificationModel> Get(){return _session.Connection.Query<NotificationModel>("SELECT * FROM [Notifications]", null, _session.Transaction);}public void Save(NotificationModel model){_session.Connection.Execute("INSERT INTO [Notifications] VALUES(NEWID(), 'Title', 'URL', GETDATE())", null, _session.Transaction);}}public class NotificationModel{public Guid Id { get; set; }public string Title { get; set; }public string Url { get; set; }public DateTime Date { get; set; }}
}

5、Startup添加以上注入

services.AddScoped<DbConnection>(provider =>{return new System.Data.SqlClient.SqlConnection("Data Source=.;Initial Catalog=dbTest;UID=sa;PWD=123456;MultipleActiveResultSets=True");});
services.AddScoped<DbSession>();
services.AddTransient<IUnitOfWork, UnitOfWork>();
services.AddTransient<NotificationRepository>();

6、添加事物AOP TransactionsAttribute,这里是用的PostSharp做的一个AOP实现,他的底层是IL写的,这是他的官方文档PostSharp Documentation - PostSharp 6.10 Documentation

/// <summary>/// 事物AOP/// </summary>[PSerializable][ProvideAspectRole(StandardRoles.TransactionHandling)][AspectRoleDependency(AspectDependencyAction.Order, AspectDependencyPosition.After, StandardRoles.Caching)]public class TransactionsAttribute : MethodInterceptionAspect{public override void OnInvoke(MethodInterceptionArgs args){if (args.Instance is ControllerBase cb){var unitOfWorkService = cb.HttpContext.RequestServices.GetService(typeof(IUnitOfWork)) as IUnitOfWork;//必须要用当前的作用域进行手动的获取注入接口,因为我上面的DbSession是Scoped的注入方式unitOfWorkService.BeginTransaction();base.OnInvoke(args);unitOfWorkService.Commit();}}}

6、添加HomeController

    [ApiController][Route("")]public class HomeController : ControllerBase{[HttpGet("")]public IEnumerable<NotificationModel> Get([FromServices] NotificationRepository repository){return repository.Get();}[HttpPost("")][Transactions]//这里保存运用事物操作public IActionResult Post([FromServices] NotificationRepository repository){repository.Save(new NotificationModel{Date = DateTime.Now,Id = Guid.NewGuid(),Title = "Teste",Url = "Teste"});return Ok();}}

数据库表结构

CREATE TABLE [dbo].[Notifications] ([Id] uniqueidentifier  NOT NULL,[Title] varchar(255) COLLATE Chinese_PRC_CI_AS  NULL,[Url] varchar(255) COLLATE Chinese_PRC_CI_AS  NULL,[Date] datetime  NULL
)

Dapper UOW+事物AOP相关推荐

  1. Spring aop切面插入事物回滚

    <!-- tx标签配置 事物--> <tx:advice id="txadvice" transaction-manager="transactionM ...

  2. Spring AOP 的底层实现

    实例代码 demo code 创建一个配置类去扫描包,开启 AspectJ 的自动代理支持 @Configuration @EnableAspectJAutoProxy @ComponentScan( ...

  3. Springboot集成Shiro+Redis后,@Transactional注解不起作用

    为什么80%的码农都做不了架构师?>>>    使用Springboot构建 mybatis+Shiro+Redis+Druid 的前后端分离web项目, 具体可以参考博客https ...

  4. SpringBoot-AOP切面处理

    2019独角兽企业重金招聘Python工程师标准>>> 应用Spring的过程中,最大最核心的必须要数AOP啦,比如,向同一水平面上的相同业务操作,我们就可以使用AOP来完成,快速方 ...

  5. myeclipse搭建SSH框架

    搭建SSH框架 Struts+hibernater+spring架构(myeclipse) 右击,首先加入spring,加入hibernater,再加入struts2 复制jar包(把tomcat发布 ...

  6. java 数据源调用_实战分享: Spring boot 调用之间实现动态数据源

    需求: 根据项目部署在不同的域名,在同一套系统下,分别访问不同的数据库 (当然在看别人帖子的时候,也发现了不同接口访问不同数据源问题,就是分库动态数据源需求了,其实实现都一样) 业务描述: 部署的时候 ...

  7. SpringCloud学习笔记027---SpringBoot集成MyBatis_实现多数据源_可以自定义数据库类型

    JAVA技术交流QQ群:170933152 1.可以静态配置数据库 2.也可以动态切换数据库 项目提交测试,趁着中当间的这个空档期,把springboot的多数据源配置学习一下,总体来说多数据源配置有 ...

  8. 去年12月份挑错经验总结

    接手别人做了一半的项目时,由于不了解会犯个种问题,以下12月份个人出bug及学习总结的情况,高手见笑了 IFrame部分: Iframe标记的使用格式是: <Iframe src="U ...

  9. Sping的基础知识总结(01)

    配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://w ...

最新文章

  1. 转载:《TypeScript 中文入门教程》 4、类
  2. 除了工作怎么交朋友_《隐秘的角落》该如何看待孩子在学校交朋友?
  3. 它又来了!Fastjson 被发现其用于安全控制的开关autotype限制可被绕过...你方了没?...
  4. 【BLE MIDI】MIDI 文件格式分析 ( FF 03 轨道名称 | FF 51 03 四分音符时长 )
  5. Shell脚本详细介绍
  6. Kubernetes学习之路(四)之Node节点二进制部署
  7. 360手机卫士大数据驱动犯罪打击 配合警方破案成果显著
  8. pdo调用mysql存储过程_获取out参数值问题_调用Oracle存储过程并获取out参数值-阿里云开发者社区...
  9. 查看Python第三方库的帮助文档
  10. python web开发实战pdf 百度网盘_python web开发实战 pdf
  11. python 人脸打卡系统
  12. 类的继承------C++
  13. 【抽象代数】半群、子群、商群
  14. win7桌面运行html,win7系统多桌面切换的解决方案
  15. centos7 mysql dump还原_CentOS 7.6使用mysqldump备份恢复MariaDB
  16. 解决因cocosStudio发布的csb文件过大导致的加载游戏界面卡的问题
  17. html请求资源不可用,HTTP状态404 – 请求的资源(/)不可用
  18. outlook 签名_如何在Outlook 2013中创建新签名
  19. 读写文件时缓冲区多大好呢?我来告诉大家哈
  20. Linux基础之的权限数字含义

热门文章

  1. [笔记分享] [eMMC] 内核eMMC分区及对应名字读取
  2. 建立完善的区块链游戏新生态——HTML5区块链游戏大会在京举行
  3. 用python输出_python 输出输出用法
  4. 烤氏历史第9集:《世通兴衰录:被遗忘的帝国》-4.大江东流
  5. PlantUML绘制活动图
  6. 自定义 remoteView
  7. 三极管基本放大电路解析
  8. php制作cms视频教程下载,PHPCMS V9 实战模板制作视频教程+仿站超级工具
  9. UCML异常提示:无效URI
  10. JS常见加密 AES、DES、RSA、MD5、SHAI、HMAC、Base64(编码) - Python/JS实现