Dapper UOW+事物AOP

Dapper UnitOfWork Dapper UnitofWork 实例,DDD中的精典部分,可直接测试使用的精典代码,可以使用到你的项目中哟. 立即下载

本文实现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
)

DapperUnitOfWorkk:Dapper工作单元模式 DapperUnitOfWorkk 精巧的工作单元模式 立即下载

相关推荐

ORM框架 整合asp.net core mvc和Dapper、Autofac实现依赖注入和AOP,同时结合Redis实现 _缓

ORM框架 整合asp.net core mvc和Dapper、Autofac实现依赖注入和AOP,同时结合Redis实现 _缓

Dapper+UOW+Repository示例代码

DataAccess IRepositories public interface IGenericRepository&lt;TEntity&gt; where TEntity : class { TEntity Get(int Id); IEnumerable&lt;TEntity&gt; GetAll(); void Add(T...

wujingang的专栏 1729

使用 Cynthion 与 Packetry 进行 USB 抓包与协议分析

Cynthion 是 Great Scott Gadgets 推出的USB 流量分析与注入设备。它具备以下特点:通过 FPGA 实现高速 USB 流量捕获;能够同时作为 USB Host 和 Device,进行调试和测试;支持输出 pcap 文件,可直接用 Wireshark 分析;提供 Python API,方便与上层软件联动。简单来说,Cynthion 是一个USB 协议分析仪 + 注入工具。硬件层捕获:实时拦截 USB 总线上的数据包;软件层解析。

YIMUleizi的博客 1264

Dapper——分布式跟踪系统

当代的互联网的服务,通常都是用复杂的、大规模分布式集群来实现的。互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发、可能使用不同的编程语言来实现、有可能布在了几千台服务器,横跨多个不同的数据中心。 面对解耦成大量的分布式微服务时,监控、预警、定位故障就变困难了。因此,就需要一些可以帮助理解系统行为、用于分析性能问题的工具。

讨论与分享 1048

第零章 序 Chisel教程汇总

笔者目前西安交通大学微电子硕士在读,研究方向为数字集成电路设计与体系结构。鉴于目前RISC-V的火热程度,笔者参与了课题组的RISC-V项目,并了解、学习了颇受关注的新型硬件构建语言——Chisel,当前参与的神经网络加速器设计便是使用Chisel开发的。这是一门敏捷开发语言,据称要比传统的Verilog语言快很多。在亲身使用过后,笔者发现确实快了不少。这主要得益于Scala作为高级语言的简洁风格...

qq_34291505的博客 7万+

【博弈论】势博弈(potential game)、EPG以及最佳响应、Nash均衡和帕累托(pareto)最优的理解

文章目录前言一、Potential game二、Nash均衡和Pareto-optimal(帕累托最优)1.Nash 均衡2.Pareto最优三、Best response(最佳响应)四、Exact potential game(EPG)1.合作-傀儡博弈2.合作博弈3.傀儡博弈4.自激博弈5.双边对称交互博弈使用理解 前言 本文主要详细讲解potential game的概念以及Exact potential game 的定义和分类,以及这么博弈方法是如何在论文中引入并使用的,本文仅是对自己在该模块

weixin_44535200的博客 2万+

DapperExtensions 1.5.0

DapperExtensions 1.5.0

rise51的专栏 1427

UniApp消息推送进阶:不用插件实现动态语音播报(含保活策略)

本文详细介绍了在UniApp中实现动态语音播报的进阶方案,无需依赖第三方插件。核心采用透传消息传递动态数据,结合本地TTS引擎合成语音,并针对不同安卓厂商提供了深度通道配置与差异化保活策略,有效解决了App退至后台或被清理后语音播报失效的难题。

weixin_29224309的博客 488

Asp.Net Core+Dapper开发直播平台!

现在直播大热,从游戏直播到直播带货,这几年都是最热门的了。教育直播、视频会议、云点播等各种基于直播构建的业务模式,让众多企业也都开始配备自己的直播平台。14年在公司带队做了个游戏直播平台...

dotNET跨平台 3315

从Excel到‘一张图’办案:手把手教你用AbutionGraph构建公安经侦知识图谱(含数据建模避坑指南)

本文详细介绍了如何利用AbutionGraph时序图数仓技术,将公安经侦领域的Excel、银行流水等碎片化数据转化为可交互的知识图谱。通过数据清洗、实体关系模型设计、时序数据处理等步骤,实现高效智能分析,提升办案效率。特别包含数据建模避坑指南和实战案例,助力公安金融案件侦破。

weixin_33702545的博客 343

【YOLOv8科研级优化】基于YOLOv9的GELAN模块重构C2f结构,实现精度与效率的同步提升

打开确保模型解析器能识别GELANBlock模块。通过将YOLOv9的GELAN模块集成到YOLOv8的C2f模块中,我们实现了一个“强特征表达+高效计算”的目标检测模型。这个改进不仅在工程上能提升复杂场景下的检测效果,更在科研上提供了“多分支特征融合”的创新思路——这种思路可以延伸到其他检测网络(如Faster R-CNN、SSD)的改进中,帮你在论文中打造独特的研究点。

know_F0727的博客 203

DapperUnitOfWork:轻量级的Dapper数据操作框架

DapperUnitOfWork:轻量级的Dapper数据操作框架 1、项目介绍 DapperUnitOfWork 是一个基于Dapper的数据访问层框架,它实现了单元工作(Unit of Work)和仓储(Repository)模式。由Tim Schreiber编写,这个项目旨在提供一种简单高效的方式,帮助开发者在.NET应用中进行数据库操作。值得注意的是,此项目对那些在StackOverflo...

gitblog_00016的博客 522

Q3D提取PCB走线RLCG参数

介绍一种提取PCB走线寄生电容和寄生电感的方法

sinat_15150363的博客 2923

轻松实现AOP之Postsharp

Postsharp文档请参考:PostSharp Documentation - PostSharp 6.10 Documentation没有人喜欢样板代码。我们通常通过使用常见的面向对象编程模式来减少它,但使用模式的代码开销通常与我们最初使用样板代码时几乎相同——如果不是更大的话。以某种方式标记应该实现某些行为的部分代码,并在其他地方解决实现,这将是非常好的。例如,如果我们有一个,我们可以使用Dapper从关系数据库中获取所有学生: 这是关系数据库存储库的一个非常简单的实现。如果学生列表没有太大变化并

zhanglong_longlong的专栏 1128

手把手教你学Simulink——基于通信协议与标准的场景实例:卫星通信中的网络安全协议(IPSec)仿真

随着卫星通信在国防、金融、应急指挥、能源管网等关键领域的广泛应用,其安全性已成为系统设计的核心要求。然而,卫星链路具有广播特性、长距离传输、地面站分布广等特点,极易遭受窃听、篡改、重放、中间人攻击等网络威胁。传统的“信任链路层安全”已不足以应对现代网络攻击。为此,国际标准组织(如IETF、ETSI、CCSDS)推荐在卫星通信中部署协议,实现端到端的数据机密性、完整性、身份认证和抗重放保护。本文将手把手教你如何在中构建一个符合标准的仿真系统,涵盖从明文传输到加密隧道的完整安全链路建模。本文完整实现了。

MHD0815的博客 149

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

AMD OGA模型构建器:Qwen2.5-Coder-7B-Instruct_rai_1.7.1_npu_4K的完整工作流程指南

AMD OGA模型构建器为开发者提供了一个强大的AI模型优化和部署解决方案,专门针对AMD Ryzen AI NPU硬件进行优化。本文将详细介绍Qwen2.5-Coder-7B-Instruct_rai_1.7.1_npu_4K模型的完整工作流程,帮助您快速掌握这一先进的AI编程助手部署方法。 ## 🚀 什么是AMD OGA模型构建器? AMD OGA模型构建器是一个专门为AMD Ryzen

gitblog_00796的博客 516

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

终极指南:如何使用Marko Workspaces实现高效多包管理[特殊字符]

Marko是一个基于HTML的声明式语言,让构建Web应用变得有趣且高效。作为一个现代化的前端框架,Marko采用workspaces多包管理模式来管理其复杂的代码库结构,这种设计让开发者能够轻松维护和扩展大型项目。本文将深入探讨Marko workspaces的最佳实践,帮助您掌握多包管理的核心技巧。 ## 📦 什么是Marko Workspaces? Marko项目采用**monorep

gitblog_00162的博客 972

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

dapper mysql_.NET Core Dapper操作mysql数据库的实现方法

前言现在ORM盛行,市面上已经出现了N款不同的ORM套餐了。今天,我们不谈EF,也不聊神马黑马,就说说 Dapper。如何在.NET Core中使用Dapper操作Mysql数据库呢,让我们跟随镜头(手动下翻)一看究竟。配置篇俗话说得好,欲要善其事必先利其器。首先,我们要引入MySql.Data 的Nuget包。有人可能出现了黑人脸,怎么引入。也罢,看在你骨骼惊奇的份上,我就告诉你,两种方式:第一...

weixin_39807896的博客 464

Dapper的正确使用姿势

本文demo适用于MySQL Dapper优势和缺点 优点 高性能、易排查、易运维、灵活可控 缺点 和EF相比,手写sql当修改表结构不易发现bug。 习惯了EF后再来使用Dapper,会很难适应那种没有了强类型的安全感。不过可以用单元测和心细来避免。 数据库连接 问题:IDbConnection需不需要手动Open打开连接 答案:有时候需要有时候不需要 Dapper连接可分两种:主动管理(自己管...

weixin_30414245的博客 1000

.net core2.x - 关于工作单元(UnitOfWork) 模式

概要:在搭建框架,顺手说下写下,关于unitofwork,可能你理解了,可能你还不理解,可能与不可能不是重点,重点是感兴趣就看看吧。 1.工作单元(unitofowork)是什么(后面简写uow)?   Maintains a list of objects affected by a business transaction and coordinates the writing o...

weixin_30709635的博客 849

Dapper.NET使用入门(四)【用Dapper数据访问层封装】

每天都是一个起点,每天都有一点进步,每天都有一点收获!Program.cs主程序: internal class Program { private static void Main(string[] args) { InitSqlMaker.InitSqlMakerO(); //构建查询语句之一(全连接)

极客神殿 1万+

一个基于Dapper的DbContext封装

开篇:   各位博客园的园友好,这是我第一次在园子里写些东西。我是一个技术菜鸟,伴随着苦与乐,已经渡过了8年的IT技术生涯,准备利用这片天地向大家交流学习。 正题: 今天上午闲来无事,利用上午时间写了一个基于Dapper的DbContext封装。还有很多地方没有完善,敬请期待下次更新。 1、RepositoryContext存储上下文 接口:    1 p...

weixin_30367945的博客 1039

ASP.NET Core 实战:基于 Dapper 扩展你的数据访问方法 ...

ASP.NET Core 实战:基于 Dapper 扩展你的数据访问方法 一、前言 在非静态页面的项目开发中,必定会涉及到对于数据库的访问,最开始呢,我们使用 Ado.Net,通过编写 SQL 帮助类帮我们实现对于数据库的快速访问,后来,ORM(Object Relational Mapping,对象关系映射)出现了,我们开始使用 EF、Dapper、...

测试0901-1 2136

InnoDB 内存结构总览:Change Buffer、AHI 与 Log Buffer

本文系统梳理InnoDB内存结构中的ChangeBuffer、Adaptive Hash Index(AHI)与LogBuffer。ChangeBuffer缓存二级索引页不在内存时的变更,减少随机IO,仅在页加载时合并;聚簇索引修改立即执行,因数据本身不可延后。AHI基于高频等值查询自动构建哈希索引,加速定位,仅支持等值操作。LogBuffer为redo log内存缓冲,配合磁盘日志实现崩溃恢复。三者均服务于性能优化,其中ChangeBuffer与AHI共享BufferPool空间,而LogBuffer独立

bksczm的博客 292
上一篇: 轻松实现AOP之Postsharp
下一篇: 【ASP.NET Core 3.1_参考中间件源码实现自定义AOP】
【Help】
博客等级 码龄16年 192粉丝 191原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值