ASP.NET Core 2.2 WebApi 시리즈[7] 일반 창고 모델과 작업 단위

10314 단어
이전의 범용 창고 패턴 실현에서 모든 증감과 삭제는 SaveChanges 방법을 호출하여 매번 업데이트할 때마다 업무를 제출했다.
실제 개발 과정에서 우리는 여러 장의 표 데이터를 동시에 조작하는 것을 자주 볼 수 있다. 그러면 이전의 문법에 따라 데이터베이스에 여러 번의 조작을 제출했고 여러 개의 사무를 열었기 때문에 데이터의 일치성을 보장할 수 없다. 작업 단원(Unit OfWork)과 결합하면 여러 번의 조작을 같은 사무에 넣기 위해서다. 모두 성공하거나 실패하거나(Commit).데이터의 일관성을 보장합니다.
창고류 수정
먼저 창고 인터페이스에서 인터페이스의 반환 없음(void) 값 유형을 삭제하고 창고에 가서 클래스를 제거하는 SaveChanges 방법을 UOW에 맡겨 통일적으로 처리한다.
UOW 구현
SaveChanges를 분리하고 IUnit Offork 인터페이스를 정의합니다
namespace NetCoreWebApi.Repository
{
    /// 
    ///   
    /// 
    public interface IUnitOfWork
    {
        /// 
        ///   
        /// 
        /// 
        int SaveChanges();
    }
}

实现IUnitOfWork接口

using System;
using Microsoft.EntityFrameworkCore;

namespace NetCoreWebApi.Repository
{
    /// 
    ///    
    /// 
    public class UnitOfWork : IUnitOfWork where TDbContext : DbContext
    {
        /// 
        /// dbContext   
        /// 
        private readonly TDbContext _dbContext;
        /// 
        ///     
        /// 
        /// 
        public UnitOfWork(TDbContext dbContext)
        {
            _dbContext = dbContext;
        }

        /// 
        ///   
        /// 
        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 (options => options.UseSqlServer(connectionStr,e => e.MigrationsAssembly("NetCoreWebApi.Model")));
            //  Uow  
            services.AddScoped>();

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 { /// /// /// public class UserRepository:IUserRepository { private readonly IUnitOfWork _unitOfWork; private readonly IRepository _userRepository; /// /// /// /// /// public UserRepository(IRepository userRepository,IUnitOfWork unitOfWork) { _userRepository = userRepository; _unitOfWork = unitOfWork; } /// /// /// /// /// public int Add(TbUser entity) { _userRepository.Add(entity); return _unitOfWork.SaveChanges(); } /// /// /// /// /// public int Remove(TbUser entity) { _userRepository.Remove(entity); return _unitOfWork.SaveChanges(); } /// /// /// /// public IList GetAll() { return _userRepository.GetAll().ToList(); } } }
다중 창고의 지속화 작업이 있을 때 구조 함수에 의존하여 상응하는 창고에 주입하면 된다.

좋은 웹페이지 즐겨찾기