Explorar el Código

支持跨仓储事物传播

xiaoxue hace 5 años
padre
commit
9e893fee0f

+ 4 - 1
Admin.Core.Common/Attributes/TransactionAttribute.cs

@@ -1,4 +1,6 @@
 using System;
+using System.Data;
+using FreeSql;
 
 namespace Admin.Core.Common
 {
@@ -8,6 +10,7 @@ namespace Admin.Core.Common
     [AttributeUsage(AttributeTargets.Method, Inherited = true)]
     public class TransactionAttribute : Attribute
     {
-
+        public Propagation Propagation { get; set; } = Propagation.Requierd;
+        public IsolationLevel? IsolationLevel { get; set; }
     }
 }

+ 6 - 1
Admin.Core.Common/Extensions/MethodInfoExtensions.cs

@@ -1,4 +1,5 @@
-using System.Linq;
+using System;
+using System.Linq;
 using System.Reflection;
 using System.Threading.Tasks;
 
@@ -9,7 +10,11 @@ namespace Admin.Core.Extensions
         public static bool HasAttribute<T>(this MethodInfo method)
         {
             return method.GetCustomAttributes(typeof(T), false).FirstOrDefault() is T;
+        }
 
+        public static T GetAttribute<T>(this MethodInfo method) where T : Attribute
+        {
+            return method.GetCustomAttributes(typeof(T), false).FirstOrDefault() as T;
         }
 
         public static bool IsAsync(this MethodInfo method)

+ 1 - 1
Admin.Core.Repository/Admin/Api/ApiRepository.cs

@@ -6,7 +6,7 @@ namespace Admin.Core.Repository.Admin
 {
     public class ApiRepository : RepositoryBase<ApiEntity>, IApiRepository
     {
-        public ApiRepository(IFreeSql orm, IUnitOfWork uow, IUser user) : base(orm, uow, user)
+        public ApiRepository(UnitOfWorkManager uowm, IUser user) : base(uowm, user)
         {
         }
     }

+ 1 - 1
Admin.Core.Repository/Admin/Dictionary/DictionaryRepository.cs

@@ -6,7 +6,7 @@ namespace Admin.Core.Repository.Admin
 {
     public class DictionaryRepository : RepositoryBase<DictionaryEntity>, IDictionaryRepository
     {
-        public DictionaryRepository(IFreeSql orm, IUnitOfWork uow, IUser user) : base(orm, uow, user)
+        public DictionaryRepository(UnitOfWorkManager uowm, IUser user) : base(uowm, user)
         {
         }
     }

+ 1 - 1
Admin.Core.Repository/Admin/Document/DocumentRepository.cs

@@ -6,7 +6,7 @@ namespace Admin.Core.Repository.Admin
 {
     public class DocumentRepository : RepositoryBase<DocumentEntity>, IDocumentRepository
     {
-        public DocumentRepository(IFreeSql orm, IUnitOfWork uow, IUser user) : base(orm, uow, user)
+        public DocumentRepository(UnitOfWorkManager uowm, IUser user) : base(uowm, user)
         {
         }
     }

+ 1 - 1
Admin.Core.Repository/Admin/LoginLog/LoginLogRepository.cs

@@ -7,7 +7,7 @@ namespace Admin.Core.Repository.Admin
 {
     public class LoginLogRepository : RepositoryBase<LoginLogEntity>, ILoginLogRepository
     {
-        public LoginLogRepository(IFreeSql orm, IUnitOfWork uow, IUser user) : base(orm, uow, user)
+        public LoginLogRepository(UnitOfWorkManager uowm, IUser user) : base(uowm, user)
         {
         }
     }

+ 1 - 1
Admin.Core.Repository/Admin/OprationLog/OprationLogRepository.cs

@@ -6,7 +6,7 @@ namespace Admin.Core.Repository.Admin
 {
     public class OprationLogRepository : RepositoryBase<OprationLogEntity>, IOprationLogRepository
     {
-        public OprationLogRepository(IFreeSql orm, IUnitOfWork uow, IUser user) : base(orm, uow, user)
+        public OprationLogRepository(UnitOfWorkManager uowm, IUser user) : base(uowm, user)
         {
         }
     }

+ 1 - 1
Admin.Core.Repository/Admin/Permission/PermissionRepository.cs

@@ -6,7 +6,7 @@ namespace Admin.Core.Repository.Admin
 {
     public class PermissionRepository : RepositoryBase<PermissionEntity>, IPermissionRepository
     {
-        public PermissionRepository(IFreeSql orm, IUnitOfWork uow, IUser user) : base(orm, uow, user)
+        public PermissionRepository(UnitOfWorkManager uowm, IUser user) : base(uowm, user)
         {
         }
     }

+ 1 - 1
Admin.Core.Repository/Admin/Role/RoleRepository.cs

@@ -6,7 +6,7 @@ namespace Admin.Core.Repository.Admin
 {	
 	public  class RoleRepository : RepositoryBase<RoleEntity>, IRoleRepository
     {
-        public RoleRepository(IFreeSql orm, IUnitOfWork uow, IUser user) : base(orm, uow, user)
+        public RoleRepository(UnitOfWorkManager uowm, IUser user) : base(uowm, user)
         {
         }
     }

+ 1 - 1
Admin.Core.Repository/Admin/RolePermission/RolePermissionRepository.cs

@@ -6,7 +6,7 @@ namespace Admin.Core.Repository.Admin
 {
     public class RolePermissionRepository : RepositoryBase<RolePermissionEntity>, IRolePermissionRepository
     {
-        public RolePermissionRepository(IFreeSql orm, IUnitOfWork uow, IUser user) : base(orm, uow, user)
+        public RolePermissionRepository(UnitOfWorkManager uowm, IUser user) : base(uowm, user)
         {
         }
     }

+ 1 - 1
Admin.Core.Repository/Admin/User/UserRepository.cs

@@ -6,7 +6,7 @@ namespace Admin.Core.Repository.Admin
 {
     public class UserRepository : RepositoryBase<UserEntity>, IUserRepository
     {
-        public UserRepository(IFreeSql orm, IUnitOfWork uow, IUser user) : base(orm, uow, user)
+        public UserRepository(UnitOfWorkManager uowm, IUser user) : base(uowm, user)
         {
         }
     }

+ 1 - 1
Admin.Core.Repository/Admin/UserRole/UserRoleRepository.cs

@@ -6,7 +6,7 @@ namespace Admin.Core.Repository.Admin
 {	
 	public class UserRoleRepository : RepositoryBase<UserRoleEntity>, IUserRoleRepository
     {
-        public UserRoleRepository(IFreeSql orm, IUnitOfWork uow, IUser user) : base(orm, uow, user)
+        public UserRoleRepository(UnitOfWorkManager uowm, IUser user) : base(uowm, user)
         {
         }
     }

+ 1 - 1
Admin.Core.Repository/Admin/View/ViewRepositoryRepository.cs

@@ -6,7 +6,7 @@ namespace Admin.Core.Repository.Admin
 {
     public class ViewRepository : RepositoryBase<ViewEntity>, IViewRepository
     {
-        public ViewRepository(IFreeSql orm, IUnitOfWork uow, IUser user) : base(orm, uow, user)
+        public ViewRepository(UnitOfWorkManager uowm, IUser user) : base(uowm, user)
         {
 
         }

+ 3 - 4
Admin.Core.Repository/Base/RepositoryBase.cs

@@ -11,10 +11,9 @@ namespace Admin.Core.Repository
     public abstract class RepositoryBase<TEntity,TKey> : BaseRepository<TEntity, TKey> where TEntity : class,new()
     {
         private readonly IUser _user;
-        protected RepositoryBase(IFreeSql orm, IUnitOfWork uow, IUser user) : base(orm, null, null)
+        protected RepositoryBase(UnitOfWorkManager uowm, IUser user) : base(uowm.Orm, null, null)
         {
-            uow.Close();
-            UnitOfWork = uow;
+            uowm.Binding(this);
             _user = user;
         }
         
@@ -54,7 +53,7 @@ namespace Admin.Core.Repository
 
     public abstract class RepositoryBase<TEntity> : RepositoryBase<TEntity, long> where TEntity : class, new()
     {
-        protected RepositoryBase(IFreeSql orm, IUnitOfWork uow, IUser user) : base(orm, uow, user)
+        protected RepositoryBase(UnitOfWorkManager uowm, IUser user) : base(uowm, user)
         {
         }
     }

+ 2 - 2
Admin.Core.Services/Admin/User/UserService.cs

@@ -79,7 +79,7 @@ namespace Admin.Core.FrameWork.Service.User
             return ResponseOutput.Ok(data);
         }
 
-        [Transaction]
+        [Transaction(Propagation = FreeSql.Propagation.Requierd)]
         public async Task<IResponseOutput> AddAsync(UserAddInput input)
         {
             if (input.Password.IsNull())
@@ -96,7 +96,7 @@ namespace Admin.Core.FrameWork.Service.User
             {
                 return ResponseOutput.NotOk();
             }
-          
+
             if (input.RoleIds != null && input.RoleIds.Any())
             {
                 var roles = input.RoleIds.Select(d => new UserRoleEntity(user.Id, d));

+ 2 - 1
Admin.Core/Admin.Core.xml

@@ -671,12 +671,13 @@
             <param name="db"></param>
             <returns></returns>
         </member>
-        <member name="M:Admin.Core.Db.ServiceCollectionExtensions.AddDb(Microsoft.Extensions.DependencyInjection.IServiceCollection,Microsoft.Extensions.Hosting.IHostEnvironment)">
+        <member name="M:Admin.Core.Db.ServiceCollectionExtensions.AddDb(Microsoft.Extensions.DependencyInjection.IServiceCollection,Microsoft.Extensions.Hosting.IHostEnvironment,Admin.Core.Common.Configs.AppConfig)">
             <summary>
             添加数据库
             </summary>
             <param name="services"></param>
             <param name="env"></param>
+            <param name="appConfig"></param>
         </member>
         <member name="T:Admin.Core.Enums.ApiVersion">
             <summary>

+ 9 - 5
Admin.Core/Aop/TransactionInterceptor.cs

@@ -5,26 +5,30 @@ using FreeSql;
 using Admin.Core.Common;
 using Admin.Core.Extensions;
 using Admin.Core.Model.Output;
-
+using System.Data;
 
 namespace Admin.Core.Aop
 {
     public class TransactionInterceptor : IInterceptor
     {
-        private readonly IUnitOfWork _unitOfWork;
-        public TransactionInterceptor(IUnitOfWork unitOfWork)
+        IUnitOfWork _unitOfWork;
+        private readonly UnitOfWorkManager _unitOfWorkManager;
+        
+        public TransactionInterceptor(UnitOfWorkManager unitOfWorkManager)
         {
-            _unitOfWork = unitOfWork;
+            _unitOfWorkManager = unitOfWorkManager;
         }
 
         public async void Intercept(IInvocation invocation)
         {
             var method = invocation.MethodInvocationTarget ?? invocation.Method;
+            
             if (method.HasAttribute<TransactionAttribute>())
             {
                 try
                 {
-                    _unitOfWork.Open();
+                    var transaction = method.GetAttribute<TransactionAttribute>();
+                    _unitOfWork = _unitOfWorkManager.Begin(transaction.Propagation, transaction.IsolationLevel);
                     invocation.Proceed();
 
                     if (method.IsAsync())

+ 5 - 2
Admin.Core/Db/ServiceCollectionExtensions.cs

@@ -16,7 +16,8 @@ namespace Admin.Core.Db
         /// </summary>
         /// <param name="services"></param>
         /// <param name="env"></param>
-        public async static void AddDb(this IServiceCollection services, IHostEnvironment env)
+        /// <param name="appConfig"></param>
+        public async static void AddDb(this IServiceCollection services, IHostEnvironment env, AppConfig appConfig)
         {
             var dbConfig = new ConfigHelper().Get<DbConfig>("dbconfig", env.EnvironmentName);
 
@@ -47,7 +48,7 @@ namespace Admin.Core.Db
             var fsql = freeSqlBuilder.Build();
 
             services.AddFreeRepository(filter => filter.Apply<IEntitySoftDelete>("SoftDelete", a => a.IsDeleted == false));
-            services.AddScoped<IUnitOfWork>(sp => fsql.CreateUnitOfWork());
+            services.AddScoped<UnitOfWorkManager>();
             services.AddSingleton(fsql);
 
             #region 初始化数据库
@@ -128,6 +129,8 @@ namespace Admin.Core.Db
             };
             #endregion
             #endregion
+
+            Console.WriteLine($"{appConfig.Urls}\r\n");
         }
     }
 }

+ 8 - 8
Admin.Core/Startup.cs

@@ -32,7 +32,6 @@ using Admin.Core.Common.Cache;
 using Admin.Core.Aop;
 using Admin.Core.Logs;
 using PermissionHandler = Admin.Core.Auth.PermissionHandler;
-using Microsoft.Extensions.Options;
 using Admin.Core.Extensions;
 
 namespace Admin.Core
@@ -193,7 +192,7 @@ namespace Admin.Core
             #endregion
 
             //数据库
-            services.AddDb(_env);
+            services.AddDb(_env,_appConfig);
 
             #region 缓存
             var cacheConfig = new ConfigHelper().Get<CacheConfig>("cacheconfig", _env.EnvironmentName);
@@ -251,13 +250,14 @@ namespace Admin.Core
             #endregion
         }
 
-        public void Configure(IApplicationBuilder app, IHostApplicationLifetime lifetime)
+        public void Configure(IApplicationBuilder app)
         {
-            //启动事件
-            lifetime.ApplicationStarted.Register(() =>
-            {
-                Console.WriteLine($"{_appConfig.Urls}\r\n");
-            });
+            //启动事件 
+            //, IHostApplicationLifetime lifetime
+            //lifetime.ApplicationStarted.Register(() =>
+            //{
+            //    Console.WriteLine($"{_appConfig.Urls}\r\n");
+            //});
 
             #region app配置
             //异常