ASP.NET Core 2.2 WebApi 系列【七】泛型仓储模式和工作单元
在之前的泛型仓储模式实现中,每个增删改都调用了SaveChanges方法,导致每次更新都提交了事务。
在实际开发过程中,我们经常遇到同时操作多张表数据,那么按照之前的写法,对数据库提交了多次操作,开启了多事务,不能保证数据的一致性,结合工作单元(UnitOfWork)是为了把多次操作放到同一事务中,要么都成功(Commit),要么都失败(Rollback),保证了数据的一致性。
修改仓储类
先把仓储接口中增删改接口无返回(void)值类型,然后去仓储实现类去掉SaveChanges方法,交给UOW统一处理
实现UOW
把SaveChanges抽离出来,定义IUnitOfWork接口
namespace NetCoreWebApi.Repository
{
/// <summary>
/// 接口
/// </summary>
public interface IUnitOfWork
{
/// <summary>
/// 保存
/// </summary>
/// <returns></returns>
int SaveChanges();
}
}
实现IUnitOfWork接口
using System;
using Microsoft.EntityFrameworkCore; namespace NetCoreWebApi.Repository
{
/// <summary>
/// 实现类
/// </summary>
public class UnitOfWork<TDbContext> : IUnitOfWork where TDbContext : DbContext
{
/// <summary>
/// dbContext上下文
/// </summary>
private readonly TDbContext _dbContext;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="dbContext"></param>
public UnitOfWork(TDbContext dbContext)
{
_dbContext = dbContext;
} /// <summary>
/// 保存
/// </summary>
public int SaveChanges()
{
int code;
try
{
code = _dbContext.SaveChanges();
}
catch (DbUpdateException e)
{
throw new Exception(e.InnerException == null ? e.Message : e.InnerException.Message);
}
return code;
}
}
}
UOW依赖注入
因为AddDbContext默认生命周期是Scoped,所以用AddScoped注册UOW,确保每次请求共用同一个DbContex对象。
//注入DbContext
services.AddDbContext<MyDbContext> (options => options.UseSqlServer(connectionStr,e => e.MigrationsAssembly("NetCoreWebApi.Model")));
//注入Uow依赖
services.AddScoped<IUnitOfWork, UnitOfWork<MyDbContext>>();
使用UOW
修改UserRepository业务层
using System.Collections.Generic;
using System.Linq;
using NetCoreWebApi.Model.Models;
using NetCoreWebApi.Repository.Interface;
using NetCoreWebApi.Repository.Repository; namespace NetCoreWebApi.Repository.Implement
{
/// <summary>
/// 业务处理
/// </summary>
public class UserRepository:IUserRepository
{
private readonly IUnitOfWork _unitOfWork;
private readonly IRepository<TbUser> _userRepository; /// <summary>
/// 构造函数
/// </summary>
/// <param name="userRepository"></param>
/// <param name="unitOfWork"></param>
public UserRepository(IRepository<TbUser> userRepository,IUnitOfWork unitOfWork)
{
_userRepository = userRepository;
_unitOfWork = unitOfWork;
}
/// <summary>
/// 添加用户
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public int Add(TbUser entity)
{
_userRepository.Add(entity);
return _unitOfWork.SaveChanges();
}
/// <summary>
/// 删除用户
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public int Remove(TbUser entity)
{
_userRepository.Remove(entity);
return _unitOfWork.SaveChanges();
}
/// <summary>
/// 查询用户
/// </summary>
/// <returns></returns>
public IList<TbUser> GetAll()
{
return _userRepository.GetAll().ToList();
}
}
}
遇到多仓储持久化操作时,用构造函数依赖注入相应的仓储即可。
ASP.NET Core 2.2 WebApi 系列【七】泛型仓储模式和工作单元的更多相关文章
- ASP.NET Core 2.2 WebApi 系列【九】使用SignalR (作者:tenghao510 ) 学习及内容补充
原文地址: ASP.NET Core 2.2 WebApi 系列[九]使用SignalR 今天,看到了大牛的这篇博文, 发了一下评论, 我很惊喜, 没想到他很快就回复了我, 而且通过QQ帮助了S ...
- ASP.NET Core 3.0 WebApi 系列【2】.Net Core 3.0+ CodeFirst + MySql 实现数据的迁移
写在前面 在前一小节中,我们创建了基于RESFULL风格的服务.这个小节,尝试使用CodeFirst+MySql 的方式实现数据迁移. 一.开发环境 [1]运行环境:win10 家庭版 [2]开发工具 ...
- ASP.NET Core 3.0 WebApi 系列【1】创建ASP.NET Core WebApi 项目
目录 写在前面 一.运行环境 二.项目搭建 三.测试 API 四.基础知识 五.写在最后 写在前面 C#语言可以创建RESTful服务,被称作WebApi.在这里总结学习使用支持创建.读取.更新.删除 ...
- ASP.NET Core 2.2 WebApi 系列【一】搭建ASP.NET Core WebApi项目
一.步骤 从“文件”菜单中选择“新建”>“项目” . 选择“ASP.NET Core Web 应用程序”模板,再单击“下一步” . 将项目命名为 NetCoreWebApi,然后单击“创建” . ...
- ASP.NET Core 2.2 WebApi 系列【九】使用SignalR
1.添加 SignalR 客户端库 右键点击项目->然后选择“添加” >“客户端库” 提供程序选择:unpkg ,库选择:@aspnet/signalr@1.1.4 选择“选择特定文件” ...
- ASP.NET Core 2.2 WebApi 系列【八】统一返回格式(返回值、模型验证、异常)
现阶段,基本上都是前后端分离项目,这样一来,就需要前后端配合,没有统一返回格式,那么对接起来会很麻烦,浪费时间.我们需要把所有接口及异常错误信息都返回一定的Json格式,有利于前端处理,从而提高了工作 ...
- ASP.NET Core 2.2 WebApi 系列【六】泛型仓储模式
为什么要使用泛型仓储?好处是? 前两章在autofac注入的时候,用的User类作为例子,写了增删改查四个接口,也就是仓储的GRUD. 当我们再添加一个实体(比如Student)时,StudentRe ...
- ASP.NET Core 2.2 WebApi 系列【五】MiniProfiler与Swagger集成
MiniProfiler 是一款性能分析的轻量级程序,可以基于action(request)记录每个阶段的耗时时长,还是可以显示访问数据库时的SQL(支持EF.EF Code First)等 一.安装 ...
- ASP.NET Core 2.2 WebApi 系列【四】集成Swagger
Swagger 是一款自动生成在线接口文档+功能测试功能软件 一.安装程序包 通过管理 NuGet 程序包安装,搜索Swashbuckle.AspNetCore 二.配置 Swagger 将 Swag ...
随机推荐
- [ASP.NET Core 3框架揭秘] 配置[7]:多样化的配置源[中篇]
物理文件是我们最常用到的原始配置载体,而最佳的配置文件格式主要有三种,它们分别是JSON.XML和INI,对应的配置源类型分别是JsonConfigurationSource.XmlConfigura ...
- Blazor(WebAssembly) + .NETCore 实现斗地主
之前群里大神发了一个 html5+ .NETCore的斗地主,刚好在看Blazor WebAssembly 就尝试重写试试. 还有就是有些标题党了,因为文章里几乎没有斗地主的相关实现:),这里主要介绍 ...
- kotlin之变量的可空与非空
版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/218 kotlin之变量的可空与非空 上面一篇文章,介绍了 ...
- jimdb压测踩坑记
本文记录在jimdb压测过程中遇到的各种小坑,望能够抛砖引玉. 1.压测流量起来后,过了5分钟左右,发现ops突降,大概降了三分之一,然后稳定了下来 大概原因:此种情况,jimdb极有可能某个分片的连 ...
- Python中的四种交换数值的方法
交换两个变量的值方法,这个面试题如果只写一种当然很简单,没什么可以说的. 今天这个面试是问大家有几种办法来实现交换两个变量的值. 在没开始看具体答案前,你可以先想想看 下面分别来说说这几种方法 方法一 ...
- Python——面向对象(类)的基础疑难点
相信用Python写def函数大家都信手拈来了,但Python作为面向对象的编程语言,怎么能浪费呢? 那问题来了.什么是类呢?什么是实例?什么是对象?方法是什么??属性又是什么???继承?封装?多态? ...
- Python中的测试工具
当我们在写程序的时候,我们需要通过测试来验证程序是否出错或者存在问题,但是,编写大量的测试来确保程序的每个细节都没问题会显得很繁琐.在Python中,我们可以借助一些标准模块来帮助我们自动完成测试 ...
- 精通awk系列(7):awk读取行的细节
回到: Linux系列文章 Shell系列文章 Awk系列文章 详细分析awk如何读取文件 awk读取输入文件时,每次读取一条记录(record)(默认情况下按行读取,所以此时记录就是行).每读取一条 ...
- centos 下安装rabbitmq
1.先安装下依赖环境 yum install gcc glibc-devel make ncurses-devel openssl-devel xmlto 2.到earlang 官网下载erlang包 ...
- Java_JDBC 连接
今天,接着上一篇( mysql 数据库 )的基础上,我就写一下 Java 怎样连接数据库,并且操作数据库. 首先,我们先来准备一下数据库连接的驱动: mysql 的 jar 包下载地址:https:/ ...