.net core 2.0 autofac 使用工作单元UnitOfWork实现事务

1人阅读 评论(0) 收藏 举报
分类:

1.新建IUnitOfWork接口,定义保存更改方法和释放方法

namespace ET.BUA.Core.Abstraction.Uow

{
    #region 简化版
    public interface IUnitOfWork : IDisposable
    {
        int SaveChanges();
        void Dispose(bool disposing);
    }
    #endregion

}

2.新建UnitOfWork类实现该接口

using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
namespace ET.BUA.Core.Abstraction.Uow
{
    #region 简化版
    public class UnitOfWork<TDbContext> : IUnitOfWork where TDbContext : DbContext
    {
        #region Private Fields


        private TDbContext _dbContext;
        private bool _disposed;
        private Dictionary<string, dynamic> _repositories;


        #endregion Private Fields


        #region 构造方法


        public UnitOfWork(TDbContext context)
        {
            _dbContext = context ?? throw new ArgumentNullException(nameof(context));
            _repositories = new Dictionary<string, dynamic>();
        }


        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }


        public virtual void Dispose(bool disposing)
        {
            if (_disposed)
                return;


            if (disposing)
            {
                if (_dbContext != null)
                {
                    _dbContext.Dispose();
                    _dbContext = null;
                }
            }
            _disposed = true;
        }


        #endregion


        public int SaveChanges()
        {
            return _dbContext.SaveChanges();
        }


        public Task<int> SaveChangesAsync()
        {
            return _dbContext.SaveChangesAsync();
        }


        public Task<int> SaveChangesAsync(CancellationToken cancellationToken)
        {
            return _dbContext.SaveChangesAsync(cancellationToken);
        }
    }
    #endregion

}

3.新建DI注入实现类UnitOfWorkServiceCollectionExtensions.cs

using ET.BUA.Core.Abstraction.Uow;
using Microsoft.EntityFrameworkCore;


namespace Microsoft.Extensions.DependencyInjection
{

    #region 简化版
    public static class UnitOfWorkServiceCollectionExtensions
    {
        public static IServiceCollection AddUnitOfWork<TContext>(this IServiceCollection services) where TContext : DbContext
        {
            services.AddScoped<IUnitOfWork, UnitOfWork<TContext>>();


            return services;
        }
    }
    #endregion
}

4.在StartUp.cs的ConfigureServices方法中进行注册,参数为数据库上下文实例

services.AddUnitOfWork<BUAContext>();


5.仓储层Repository不实现SaveChanges,由服务层Servcie注入UnitOfWork实现事务

using ET.BUA.Core.Abstraction.Uow;
using ET.BUA.Domain.Repository;
using ET.BUA.Entity.Model;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace ET.BUA.Service.Service.Implementation
{
    public class ApplicationService : IApplicationService
    {
        private readonly IApplicationRepository _appRepo;
        private readonly IUnitOfWork _unitOfWork;


        public ApplicationService(
            IApplicationRepository appRepo,
            IUnitOfWork unitOfWork)
        {
            _appRepo = appRepo ?? throw new ArgumentNullException(nameof(appRepo));
            _unitOfWork = unitOfWork ?? throw new ArgumentNullException(nameof(unitOfWork));
        }


        public void Add(ApplicationEntity app)
        {
            _appRepo.Insert(app);
            _unitOfWork.SaveChanges();
        }


        public async Task<ApplicationEntity> GetSingleModelAsync(string Code)
        {
            return await _appRepo.FirstOrDefaultAsync(c => c.APP_CODE==Code);
        }


        public ApplicationEntity GetSingleModel(string Code)
        {
            return  _appRepo.FirstOrDefault(c => c.APP_CODE == Code);
        }
    }
}

查看评论

使用 COM+ 参数化对象结构编程技术

使用 COM+ 参数化对象结构编程技术关键词:Delphi控件杂项使用 COM+ 参数化对象结构编程技术一、引言    COM+ 服務技術的一個核心理念就是系統本身提供完成許多面向企業應用開發者的通用...
  • ghj1976
  • ghj1976
  • 2001-02-23 10:24:00
  • 1333

ASP.NET Core中使用IOC三部曲(三.采用替换后的Autofac来实现AOP拦截)

上一篇ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)我们讲了如何将默认的容器替换为Autofac,并使用属性注入.那么这一篇我们就来讲讲如何利用A...
  • sD7O95O
  • sD7O95O
  • 2018-01-20 00:00:00
  • 190

.NET应用架构设计—工作单元模式(摆脱过程式代码的重要思想,逆袭DDD)

阅读目录: 1.背景介绍 2.过程式代码的真正困境 3.工作单元模式的简单示例 4.总结 1.背景介绍 一直都在谈论面向对象开发,但是开发企业应用系统时,使用面向对象开发最大的问题就是在于,多个对...
  • wangqingpei557
  • wangqingpei557
  • 2014-09-01 21:22:29
  • 4348

工作单元模式(UnitOfWork)学习总结

工作单元的目标是维护变化的对象列表。使用IUnitOfWorkRepository负责对象的持久化,使用IUnitOfWork收集变化的对象,并将变化的对象放到各自的增删改列表中, 最后Commit...
  • imJaron
  • imJaron
  • 2017-04-13 10:59:48
  • 2620

Asp.Net Core 2.0 之旅---AutoFac IOC容器的使用教程

其实早就想开 Core 2.0的文章了,奈何基础薄弱。只能猥琐发育。。。哈哈 Core 2.0 作为开源跨平台框架。现在它的热度是比较高的。也是微软老大重点项目。 接下来我会一步步的演示Asp.Net...
  • huanghuangtongxue
  • huanghuangtongxue
  • 2017-12-27 17:12:37
  • 1239

.net ef core 领域设计代码转换(上篇)

一、前言 .net core 2.0正式版已经发布几个月了,经过研究,决定把项目转移过来,新手的话可以先看一些官方介绍 传送门:https://docs.microsoft.com/zh-cn/d...
  • sD7O95O
  • sD7O95O
  • 2017-11-12 00:00:00
  • 596

ASP.NET Core依赖注入解读&使用Autofac替代实现

1. 前言关于IoC模式(控制反转)和DI技术(依赖注入),我们已经见过很多的探讨,这里就不再赘述了。比如说必看的Martin Fowler《IoC 容器和 Dependency Injection ...
  • sD7O95O
  • sD7O95O
  • 2017-09-25 00:00:00
  • 612

ABP官方文档(十九)【工作单元】

3.5 ABP领域层 - 工作单元3.5.1 简介连接和事务管理是使用数据库的应用程序最重要的概念之一。当你开启一个数据库连接,什么时候开始事务,如何释放连接;诸如此类的…。ABP默认使用 工作单元 ...
  • WuLex
  • WuLex
  • 2017-11-02 10:18:33
  • 497

采用仓储和工作单元的mvc

如何用仓储实现事务? 如何处理多个Repository库? 借用一段话:     下面想象下如下场景,我们数据库中有多个表,那样我们需要为每个表创建一个Reporsitory类。(好多重...
  • wenxi2367
  • wenxi2367
  • 2018-01-09 00:00:32
  • 126

Autofac+Castle实现AOP事务

一、前言 最近公司新项目,需要搭架构进行开发,其中需要保证事务的一致性,经过一番查找,发现很多博文都是通过Spring.Net、Unity、PostSharp、Castle Windsor这些方式实...
  • sD7O95O
  • sD7O95O
  • 2017-07-21 07:12:07
  • 87
    个人资料
    等级:
    访问量: 6643
    积分: 378
    排名: 20万+
    最新评论