diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.Core.Sqlsugar/Uow/UnitOfWork.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.Core.Sqlsugar/Uow/UnitOfWork.cs new file mode 100644 index 00000000..3a5545c5 --- /dev/null +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.Core.Sqlsugar/Uow/UnitOfWork.cs @@ -0,0 +1,48 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using Yi.Framework.Uow; + +namespace Yi.Framework.Core.Sqlsugar.Uow +{ + public class UnitOfWork : IUnitOfWork + { + public ISqlSugarClient Db { get; set; } + public ITenant Tenant { get; set; } + public bool IsTran { get; set; } + public bool IsCommit { get; set; } + public bool IsClose { get; set; } + + public void Dispose() + { + + if (this.IsTran && IsCommit == false) + { + this.Tenant.RollbackTran(); + } + if (this.Db.Ado.Transaction == null && IsClose == false) + { + this.Db.Close(); + } + } + + public bool Commit() + { + if (this.IsTran && this.IsCommit == false) + { + this.Tenant.CommitTran(); + IsCommit = true; + } + if (this.Db.Ado.Transaction == null && this.IsClose == false) + { + this.Db.Close(); + IsClose = true; + } + return IsCommit; + } + } +} diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.Core.Sqlsugar/Uow/UnitOfWorkManager.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.Core.Sqlsugar/Uow/UnitOfWorkManager.cs new file mode 100644 index 00000000..b235050a --- /dev/null +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.Core.Sqlsugar/Uow/UnitOfWorkManager.cs @@ -0,0 +1,37 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Yi.Framework.Uow; + +namespace Yi.Framework.Core.Sqlsugar.Uow +{ + /// + /// 此部分为sqlsugr的魔改版本 + /// + internal class UnitOfWorkManager : IUnitOfWorkManager + { + public UnitOfWorkManager(ISqlSugarClient db) + { + this.Db = db; + } + public ISqlSugarClient Db { get; set; } + public IUnitOfWork CreateContext(bool isTran = true) + { + UnitOfWork uow = new UnitOfWork(); + return CreateContext(isTran, uow); + } + private IUnitOfWork CreateContext(bool isTran, UnitOfWork sugarUnitOf) + { + sugarUnitOf.Db = Db; + sugarUnitOf.Tenant = Db.AsTenant(); + sugarUnitOf.IsTran = isTran; + Db.Open(); + if (isTran) + Db.AsTenant().BeginTran(); + return sugarUnitOf; + } + } +} diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.Core.Sqlsugar/Yi.Framework.Core.Sqlsugar.csproj b/Yi.Framework.Net6/src/framework/Yi.Framework.Core.Sqlsugar/Yi.Framework.Core.Sqlsugar.csproj index f994d88c..6cac0d12 100644 --- a/Yi.Framework.Net6/src/framework/Yi.Framework.Core.Sqlsugar/Yi.Framework.Core.Sqlsugar.csproj +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.Core.Sqlsugar/Yi.Framework.Core.Sqlsugar.csproj @@ -13,10 +13,10 @@ + - diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.Core.Sqlsugar/YiFrameworkCoreSqlsugarModule.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.Core.Sqlsugar/YiFrameworkCoreSqlsugarModule.cs index 0f9fde52..c73bacb8 100644 --- a/Yi.Framework.Net6/src/framework/Yi.Framework.Core.Sqlsugar/YiFrameworkCoreSqlsugarModule.cs +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.Core.Sqlsugar/YiFrameworkCoreSqlsugarModule.cs @@ -5,8 +5,10 @@ using Yi.Framework.Core.Configuration; using Yi.Framework.Core.Sqlsugar.Extensions; using Yi.Framework.Core.Sqlsugar.Options; using Yi.Framework.Core.Sqlsugar.Repositories; +using Yi.Framework.Core.Sqlsugar.Uow; using Yi.Framework.Ddd; using Yi.Framework.Ddd.Repositories; +using Yi.Framework.Uow; namespace Yi.Framework.Core.Sqlsugar { @@ -20,6 +22,9 @@ namespace Yi.Framework.Core.Sqlsugar public void ConfigureServices(IServiceCollection services, ConfigureServicesContext context) { services.AddTransient(typeof(IRepository<>), typeof(SqlsugarRepository<>)); + + services.AddSingleton(); + services.Configure(Appsettings.appConfiguration("DbConnOptions")); services.AddSqlsugarServer(); diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/Yi.Framework.Ddd.csproj b/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/Yi.Framework.Ddd.csproj index 4d82bdc4..af17369b 100644 --- a/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/Yi.Framework.Ddd.csproj +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.Ddd/Yi.Framework.Ddd.csproj @@ -12,6 +12,7 @@ + diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.Uow/IUnitOfWork.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.Uow/IUnitOfWork.cs new file mode 100644 index 00000000..172b9732 --- /dev/null +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.Uow/IUnitOfWork.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Framework.Uow +{ + public interface IUnitOfWork : IDisposable + { + bool IsTran { get; set; } + bool IsCommit { get; set; } + bool IsClose { get; set; } + + bool Commit(); + } +} diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.Uow/IUnitOfWorkManager.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.Uow/IUnitOfWorkManager.cs index ef1d3e51..00b0b408 100644 --- a/Yi.Framework.Net6/src/framework/Yi.Framework.Uow/IUnitOfWorkManager.cs +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.Uow/IUnitOfWorkManager.cs @@ -1,94 +1,8 @@ -//namespace Yi.Framework.Uow -//{ -// public interface IUnitOfWorkManager -// { -// SugarUnitOfWork CreateContext(bool isTran = true); -// } +namespace Yi.Framework.Uow +{ + public interface IUnitOfWorkManager + { + IUnitOfWork CreateContext(bool isTran = true); + } - -// /// -// /// 这个放到实现类中 -// /// -// public class SugarUnitOfWorkManager : IUnitOfWorkManager -// { -// public SugarUnitOfWorkManager(ISqlSugarClient db) -// { -// this.Db = db; -// } -// public SugarUnitOfWork Db { get; set; } -// public SugarUnitOfWork CreateContext(bool isTran = true) -// { -// return Db.CreateContext(isTran); -// } -// } - - -// /// -// /// 下面这个定死了 -// /// -// public class SugarUnitOfWork : IDisposable -// { -// public ISqlSugarClient Db { get; internal set; } -// public ITenant Tenant { get; internal set; } -// public bool IsTran { get; internal set; } -// public bool IsCommit { get; internal set; } -// public bool IsClose { get; internal set; } - -// public void Dispose() -// { - -// if (this.IsTran && IsCommit == false) -// { -// this.Tenant.RollbackTran(); -// } -// if (this.Db.Ado.Transaction == null && IsClose == false) -// { -// this.Db.Close(); -// } -// } - -// public SimpleClient GetRepository() where T : class, new() -// { -// TenantAttribute tenantAttribute = typeof(T).GetCustomAttribute(); -// if (tenantAttribute == null) -// { -// return new SimpleClient(Db); -// } -// else -// { -// return new SimpleClient(Db.AsTenant().GetConnection(tenantAttribute.configId)); -// } -// } - -// public RepositoryType GetMyRepository() where RepositoryType : ISugarRepository, new() -// { -// var result = new RepositoryType(); -// var type = typeof(RepositoryType).GetGenericArguments()[0]; -// TenantAttribute tenantAttribute = type.GetCustomAttribute(); -// if (tenantAttribute == null) -// { -// result.Context = this.Db; -// } -// else -// { -// result.Context = this.Db.AsTenant().GetConnection(tenantAttribute.configId); -// } -// return result; -// } - -// public bool Commit() -// { -// if (this.IsTran && this.IsCommit == false) -// { -// this.Tenant.CommitTran(); -// IsCommit = true; -// } -// if (this.Db.Ado.Transaction == null && this.IsClose == false) -// { -// this.Db.Close(); -// IsClose = true; -// } -// return IsCommit; -// } -// } -//} \ No newline at end of file +} \ No newline at end of file diff --git a/Yi.Framework.Net6/test/Yi.Framework.Application/Student/StudentService.cs b/Yi.Framework.Net6/test/Yi.Framework.Application/Student/StudentService.cs index 98f2aa96..9279a54d 100644 --- a/Yi.Framework.Net6/test/Yi.Framework.Application/Student/StudentService.cs +++ b/Yi.Framework.Net6/test/Yi.Framework.Application/Student/StudentService.cs @@ -14,6 +14,7 @@ using Yi.Framework.Application.Contracts.Student.Dtos; using Yi.Framework.Domain.Student.Entities; using Yi.Framework.Ddd.Services; using Yi.Framework.Core.Attributes; +using Yi.Framework.Uow; namespace Yi.Framework.Application.Student { @@ -23,24 +24,31 @@ namespace Yi.Framework.Application.Student [AppService] public class StudentService : CrudAppService, - IStudentService,IAutoApiService + IStudentService, IAutoApiService { private readonly IStudentRepository _studentRepository; private readonly StudentManager _studentManager; - public StudentService(IStudentRepository studentRepository, StudentManager studentManager) + private readonly IUnitOfWorkManager _unitOfWorkManager; + public StudentService(IStudentRepository studentRepository, StudentManager studentManager, IUnitOfWorkManager unitOfWorkManager) { _studentRepository = studentRepository; _studentManager = studentManager; + _unitOfWorkManager = unitOfWorkManager; } /// - /// 你好世界 + /// Uow /// /// - public async Task> PostShijie() + public async Task PostUow() { - throw new NotImplementedException(); - var entities = await _studentRepository.GetMyListAsync(); - return await MapToGetListOutputDtosAsync(entities); + StudentGetOutputDto res = new(); + using (var uow = _unitOfWorkManager.CreateContext()) + { + res = await base.CreateAsync(new StudentCreateInputVo { Name = $"老杰哥{DateTime.Now.ToString("ffff")}", Number = 2023 }); + if (new Random().Next(0, 2) == 0) throw new NotImplementedException(); + uow.Commit(); + } + return res; } } } diff --git a/Yi.Framework.Net6/test/Yi.Framework.Web/Program.cs b/Yi.Framework.Net6/test/Yi.Framework.Web/Program.cs index 9331e00b..4ff8c565 100644 --- a/Yi.Framework.Net6/test/Yi.Framework.Web/Program.cs +++ b/Yi.Framework.Net6/test/Yi.Framework.Web/Program.cs @@ -8,7 +8,7 @@ TimeTest.Start(); var builder = WebApplication.CreateBuilder(args); //url -builder.WebHost.UseStartUrlsServer(builder.Configuration, "StartUrl"); +builder.WebHost.UseStartUrlsServer(builder.Configuration); //ģ builder.UseYiModules(typeof(YiFrameworkWebModule)); diff --git a/Yi.Framework.Net6/test/Yi.Framework.Web/TimeTest.txt b/Yi.Framework.Net6/test/Yi.Framework.Web/TimeTest.txt index e51f52d3..2180c9a2 100644 --- a/Yi.Framework.Net6/test/Yi.Framework.Web/TimeTest.txt +++ b/Yi.Framework.Net6/test/Yi.Framework.Web/TimeTest.txt @@ -30,3 +30,5 @@ 2023:01:17-22:43:56本次运行启动时间为:2023毫秒 2023:01:17-22:45:25本次运行启动时间为:1803毫秒 2023:01:17-22:45:52本次运行启动时间为:1877毫秒 +2023:01:17-23:24:07本次运行启动时间为:1836毫秒 +2023:01:17-23:29:20本次运行启动时间为:1958毫秒 diff --git a/Yi.Framework.Net6/test/Yi.Framework.Web/yi-sqlsugar-dev.db b/Yi.Framework.Net6/test/Yi.Framework.Web/yi-sqlsugar-dev.db index ceeda9cc..13bbae92 100644 Binary files a/Yi.Framework.Net6/test/Yi.Framework.Web/yi-sqlsugar-dev.db and b/Yi.Framework.Net6/test/Yi.Framework.Web/yi-sqlsugar-dev.db differ