From f283a1bbbb73b6637c9c370e0cdca193ecc1f2f2 Mon Sep 17 00:00:00 2001 From: simon Date: Mon, 24 May 2021 00:31:46 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=95=B0=E6=8D=AE=E8=AE=BF?= =?UTF-8?q?=E9=97=AE=EF=BC=8Capi=EF=BC=8C=E5=AE=9E=E4=BD=93=E6=98=A0?= =?UTF-8?q?=E5=B0=84=E7=AD=89=EF=BC=8C=E5=8F=AF=E4=BB=A5=E8=BF=90=E8=A1=8C?= =?UTF-8?q?=EF=BC=8C=E6=8E=A5=E5=8F=A3=E6=B5=8B=E8=AF=95=E4=B8=8D=E6=AD=A3?= =?UTF-8?q?=E7=A1=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/CategoryController.cs | 0 .../Aurora.Core.Api/CoreApiModule.cs | 0 .../Aurora.Core/Aurora.Core.Api/MoudelInit.cs | 0 .../AutomapperProfiles/CategoryProfile | 14 +++ .../AutomapperProfiles/CategoryProfile.cs | 14 +++ .../AutomapperProfiles/xxx.cs | 14 +++ .../Aurora.Core.Domain/Entities/Category.cs | 0 .../Response/CategoryDto.cs | 8 ++ .../Aurora.Core/Aurora.Core.Domain/xxx/xxx.cs | 8 ++ .../ApplicationDbContext copy.cs | 114 ++++++++++++++++++ .../ApplicationReadonlyDbContext.cs | 114 ++++++++++++++++++ .../Aurora.Core.IService/Dto/CategoryDto.cs | 9 ++ .../Aurora.Core.IService/ICategoryService.cs | 8 ++ .../AutomapperProfiles/CategoryProfile.cs | 0 .../Aurora.Core.Service/CategoryService.cs | 8 ++ 15 files changed, 311 insertions(+) create mode 100644 Aurora.Micorservices/Aurora.Core/Aurora.Core.Api/Controllers/CategoryController.cs create mode 100644 Aurora.Micorservices/Aurora.Core/Aurora.Core.Api/CoreApiModule.cs create mode 100644 Aurora.Micorservices/Aurora.Core/Aurora.Core.Api/MoudelInit.cs create mode 100644 Aurora.Micorservices/Aurora.Core/Aurora.Core.Domain/AutomapperProfiles/CategoryProfile create mode 100644 Aurora.Micorservices/Aurora.Core/Aurora.Core.Domain/AutomapperProfiles/CategoryProfile.cs create mode 100644 Aurora.Micorservices/Aurora.Core/Aurora.Core.Domain/AutomapperProfiles/xxx.cs create mode 100644 Aurora.Micorservices/Aurora.Core/Aurora.Core.Domain/Entities/Category.cs create mode 100644 Aurora.Micorservices/Aurora.Core/Aurora.Core.Domain/Response/CategoryDto.cs create mode 100644 Aurora.Micorservices/Aurora.Core/Aurora.Core.Domain/xxx/xxx.cs create mode 100644 Aurora.Micorservices/Aurora.Core/Aurora.Core.EntityFramework/ApplicationDbContext copy.cs create mode 100644 Aurora.Micorservices/Aurora.Core/Aurora.Core.EntityFramework/ApplicationReadonlyDbContext.cs create mode 100644 Aurora.Micorservices/Aurora.Core/Aurora.Core.IService/Dto/CategoryDto.cs create mode 100644 Aurora.Micorservices/Aurora.Core/Aurora.Core.IService/ICategoryService.cs create mode 100644 Aurora.Micorservices/Aurora.Core/Aurora.Core.Service/AutomapperProfiles/CategoryProfile.cs create mode 100644 Aurora.Micorservices/Aurora.Core/Aurora.Core.Service/CategoryService.cs diff --git a/Aurora.Micorservices/Aurora.Core/Aurora.Core.Api/Controllers/CategoryController.cs b/Aurora.Micorservices/Aurora.Core/Aurora.Core.Api/Controllers/CategoryController.cs new file mode 100644 index 0000000..e69de29 diff --git a/Aurora.Micorservices/Aurora.Core/Aurora.Core.Api/CoreApiModule.cs b/Aurora.Micorservices/Aurora.Core/Aurora.Core.Api/CoreApiModule.cs new file mode 100644 index 0000000..e69de29 diff --git a/Aurora.Micorservices/Aurora.Core/Aurora.Core.Api/MoudelInit.cs b/Aurora.Micorservices/Aurora.Core/Aurora.Core.Api/MoudelInit.cs new file mode 100644 index 0000000..e69de29 diff --git a/Aurora.Micorservices/Aurora.Core/Aurora.Core.Domain/AutomapperProfiles/CategoryProfile b/Aurora.Micorservices/Aurora.Core/Aurora.Core.Domain/AutomapperProfiles/CategoryProfile new file mode 100644 index 0000000..703c408 --- /dev/null +++ b/Aurora.Micorservices/Aurora.Core/Aurora.Core.Domain/AutomapperProfiles/CategoryProfile @@ -0,0 +1,14 @@ +using System; +using Aurora.Core.Domain.Entities; +using Aurora.Core.Domain.Response; + +namespace Aurora.Core.Domain.xxx +{ + public class CategoryProfile : Profile + { + protected override void Configure() + { + CreateMap(); + } + } +} diff --git a/Aurora.Micorservices/Aurora.Core/Aurora.Core.Domain/AutomapperProfiles/CategoryProfile.cs b/Aurora.Micorservices/Aurora.Core/Aurora.Core.Domain/AutomapperProfiles/CategoryProfile.cs new file mode 100644 index 0000000..703c408 --- /dev/null +++ b/Aurora.Micorservices/Aurora.Core/Aurora.Core.Domain/AutomapperProfiles/CategoryProfile.cs @@ -0,0 +1,14 @@ +using System; +using Aurora.Core.Domain.Entities; +using Aurora.Core.Domain.Response; + +namespace Aurora.Core.Domain.xxx +{ + public class CategoryProfile : Profile + { + protected override void Configure() + { + CreateMap(); + } + } +} diff --git a/Aurora.Micorservices/Aurora.Core/Aurora.Core.Domain/AutomapperProfiles/xxx.cs b/Aurora.Micorservices/Aurora.Core/Aurora.Core.Domain/AutomapperProfiles/xxx.cs new file mode 100644 index 0000000..2caba29 --- /dev/null +++ b/Aurora.Micorservices/Aurora.Core/Aurora.Core.Domain/AutomapperProfiles/xxx.cs @@ -0,0 +1,14 @@ +using System; +using Aurora.Core.Domain.Entities; +using Aurora.Core.Domain.Response; + +namespace Aurora.Core.Domain.AutomapperProfiles +{ + public class CategoryProfile : Profile + { + protected override void Configure() + { + CreateMap(); + } + } +} diff --git a/Aurora.Micorservices/Aurora.Core/Aurora.Core.Domain/Entities/Category.cs b/Aurora.Micorservices/Aurora.Core/Aurora.Core.Domain/Entities/Category.cs new file mode 100644 index 0000000..e69de29 diff --git a/Aurora.Micorservices/Aurora.Core/Aurora.Core.Domain/Response/CategoryDto.cs b/Aurora.Micorservices/Aurora.Core/Aurora.Core.Domain/Response/CategoryDto.cs new file mode 100644 index 0000000..d0962dd --- /dev/null +++ b/Aurora.Micorservices/Aurora.Core/Aurora.Core.Domain/Response/CategoryDto.cs @@ -0,0 +1,8 @@ +using System; + +namespace Aurora.Core.Domain.Response +{ + public class CategoryDto + { + } +} diff --git a/Aurora.Micorservices/Aurora.Core/Aurora.Core.Domain/xxx/xxx.cs b/Aurora.Micorservices/Aurora.Core/Aurora.Core.Domain/xxx/xxx.cs new file mode 100644 index 0000000..41ec760 --- /dev/null +++ b/Aurora.Micorservices/Aurora.Core/Aurora.Core.Domain/xxx/xxx.cs @@ -0,0 +1,8 @@ +using System; + +namespace Aurora.Core.Domain.xxx +{ + public class xxx + { + } +} diff --git a/Aurora.Micorservices/Aurora.Core/Aurora.Core.EntityFramework/ApplicationDbContext copy.cs b/Aurora.Micorservices/Aurora.Core/Aurora.Core.EntityFramework/ApplicationDbContext copy.cs new file mode 100644 index 0000000..009d048 --- /dev/null +++ b/Aurora.Micorservices/Aurora.Core/Aurora.Core.EntityFramework/ApplicationDbContext copy.cs @@ -0,0 +1,114 @@ + + + + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Threading; +using System.Threading.Tasks; +using Aurora.Common.Entities; +using Aurora.Core.Domain.Entities; +using Aurora.Infrastructure.Tenant; +using Aurora.Infrastructure.User; +using Microsoft.EntityFrameworkCore; + +namespace Aurora.Core.EntityFramework +{ + public class ApplicationDbContext : DbContext + { + public static string ConnectionString { get; set; } + private readonly ICurrentUser currentUser; + private readonly ICurrentTenant currentTenant; + + public ApplicationDbContext(DbContextOptions options, + ICurrentUserProvider currentUserProvider, + ICurrentTenantProvider currentTenantProvider) : base(options) + { + currentUser = currentUserProvider.GetCurrentUser(); + currentTenant = currentTenantProvider.GetCurrentTenant(); + } + + public DbSet Categories { get; set; } + + protected override void OnModelCreating(ModelBuilder builder) + { + + //多租户过滤 + foreach (var type in GetBaseEntityTypes()) + { + var method = SetGlobalQueryMethod.MakeGenericMethod(type); + method.Invoke(this, new object[] { builder }); + } + + builder.Entity().HasKey(t => new { t.TenantCode }); + // builder.Entity().HasIndex(p => p.TenantCode); + + + base.OnModelCreating(builder); + } + + private static IList _baseEntityTypesCache; + + private static IList GetBaseEntityTypes() + { + if (_baseEntityTypesCache != null) + return _baseEntityTypesCache.ToList(); + _baseEntityTypesCache = (from t in typeof(TenantEntityBase).GetTypeInfo().Assembly.DefinedTypes + where t.BaseType == typeof(TenantEntityBase) + select t.AsType()).ToList(); + return _baseEntityTypesCache; + } + + public override int SaveChanges() + { + UpdateCommonFileds(); + return base.SaveChanges(); + } + + public override async Task SaveChangesAsync(CancellationToken cancellationToken = default(CancellationToken)) + { + UpdateCommonFileds(); + return await base.SaveChangesAsync(cancellationToken); + } + + private void UpdateCommonFileds() + { + var nowTime = DateTime.Now; + + if (string.IsNullOrEmpty(currentUser.UserName)) + { + var tcode = currentTenant.TenantCode; + + } + + foreach (var entry in this.ChangeTracker.Entries().Where(x => x.State == EntityState.Added || x.State == EntityState.Modified)) + { + var entity = entry.Entity; + switch (entry.State) + { + case EntityState.Added: + if (entity.TenantCode == "") + entity.TenantCode = currentTenant.TenantCode; + entity.CreateTime = nowTime; + entity.CreateUserName = currentUser.UserName; + break; + case EntityState.Modified: + entity.ModifyTime = nowTime; + entity.ModifyUserName = currentUser.UserName; + break; + } + } + this.ChangeTracker.DetectChanges(); + } + + static readonly MethodInfo SetGlobalQueryMethod = typeof(ApplicationDbContext).GetMethods(BindingFlags.Public | BindingFlags.Instance) + .Single(t => t.IsGenericMethod && t.Name == "SetGlobalQuery"); + + public void SetGlobalQuery(ModelBuilder builder) where T : TenantEntityBase + { + builder.Entity().HasQueryFilter(e => e.TenantCode == currentTenant.TenantCode); + } + } +} \ No newline at end of file diff --git a/Aurora.Micorservices/Aurora.Core/Aurora.Core.EntityFramework/ApplicationReadonlyDbContext.cs b/Aurora.Micorservices/Aurora.Core/Aurora.Core.EntityFramework/ApplicationReadonlyDbContext.cs new file mode 100644 index 0000000..009d048 --- /dev/null +++ b/Aurora.Micorservices/Aurora.Core/Aurora.Core.EntityFramework/ApplicationReadonlyDbContext.cs @@ -0,0 +1,114 @@ + + + + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Threading; +using System.Threading.Tasks; +using Aurora.Common.Entities; +using Aurora.Core.Domain.Entities; +using Aurora.Infrastructure.Tenant; +using Aurora.Infrastructure.User; +using Microsoft.EntityFrameworkCore; + +namespace Aurora.Core.EntityFramework +{ + public class ApplicationDbContext : DbContext + { + public static string ConnectionString { get; set; } + private readonly ICurrentUser currentUser; + private readonly ICurrentTenant currentTenant; + + public ApplicationDbContext(DbContextOptions options, + ICurrentUserProvider currentUserProvider, + ICurrentTenantProvider currentTenantProvider) : base(options) + { + currentUser = currentUserProvider.GetCurrentUser(); + currentTenant = currentTenantProvider.GetCurrentTenant(); + } + + public DbSet Categories { get; set; } + + protected override void OnModelCreating(ModelBuilder builder) + { + + //多租户过滤 + foreach (var type in GetBaseEntityTypes()) + { + var method = SetGlobalQueryMethod.MakeGenericMethod(type); + method.Invoke(this, new object[] { builder }); + } + + builder.Entity().HasKey(t => new { t.TenantCode }); + // builder.Entity().HasIndex(p => p.TenantCode); + + + base.OnModelCreating(builder); + } + + private static IList _baseEntityTypesCache; + + private static IList GetBaseEntityTypes() + { + if (_baseEntityTypesCache != null) + return _baseEntityTypesCache.ToList(); + _baseEntityTypesCache = (from t in typeof(TenantEntityBase).GetTypeInfo().Assembly.DefinedTypes + where t.BaseType == typeof(TenantEntityBase) + select t.AsType()).ToList(); + return _baseEntityTypesCache; + } + + public override int SaveChanges() + { + UpdateCommonFileds(); + return base.SaveChanges(); + } + + public override async Task SaveChangesAsync(CancellationToken cancellationToken = default(CancellationToken)) + { + UpdateCommonFileds(); + return await base.SaveChangesAsync(cancellationToken); + } + + private void UpdateCommonFileds() + { + var nowTime = DateTime.Now; + + if (string.IsNullOrEmpty(currentUser.UserName)) + { + var tcode = currentTenant.TenantCode; + + } + + foreach (var entry in this.ChangeTracker.Entries().Where(x => x.State == EntityState.Added || x.State == EntityState.Modified)) + { + var entity = entry.Entity; + switch (entry.State) + { + case EntityState.Added: + if (entity.TenantCode == "") + entity.TenantCode = currentTenant.TenantCode; + entity.CreateTime = nowTime; + entity.CreateUserName = currentUser.UserName; + break; + case EntityState.Modified: + entity.ModifyTime = nowTime; + entity.ModifyUserName = currentUser.UserName; + break; + } + } + this.ChangeTracker.DetectChanges(); + } + + static readonly MethodInfo SetGlobalQueryMethod = typeof(ApplicationDbContext).GetMethods(BindingFlags.Public | BindingFlags.Instance) + .Single(t => t.IsGenericMethod && t.Name == "SetGlobalQuery"); + + public void SetGlobalQuery(ModelBuilder builder) where T : TenantEntityBase + { + builder.Entity().HasQueryFilter(e => e.TenantCode == currentTenant.TenantCode); + } + } +} \ No newline at end of file diff --git a/Aurora.Micorservices/Aurora.Core/Aurora.Core.IService/Dto/CategoryDto.cs b/Aurora.Micorservices/Aurora.Core/Aurora.Core.IService/Dto/CategoryDto.cs new file mode 100644 index 0000000..ca65aad --- /dev/null +++ b/Aurora.Micorservices/Aurora.Core/Aurora.Core.IService/Dto/CategoryDto.cs @@ -0,0 +1,9 @@ +using System; +using Aurora.Core.Domain.Entities; + +namespace Aurora.Core.Domain.Dto +{ + public class CategoryDto : Category + { + } +} diff --git a/Aurora.Micorservices/Aurora.Core/Aurora.Core.IService/ICategoryService.cs b/Aurora.Micorservices/Aurora.Core/Aurora.Core.IService/ICategoryService.cs new file mode 100644 index 0000000..9c7d339 --- /dev/null +++ b/Aurora.Micorservices/Aurora.Core/Aurora.Core.IService/ICategoryService.cs @@ -0,0 +1,8 @@ +using System; + +namespace Aurora.Core.IService +{ + public class ICategoryService + { + } +} diff --git a/Aurora.Micorservices/Aurora.Core/Aurora.Core.Service/AutomapperProfiles/CategoryProfile.cs b/Aurora.Micorservices/Aurora.Core/Aurora.Core.Service/AutomapperProfiles/CategoryProfile.cs new file mode 100644 index 0000000..e69de29 diff --git a/Aurora.Micorservices/Aurora.Core/Aurora.Core.Service/CategoryService.cs b/Aurora.Micorservices/Aurora.Core/Aurora.Core.Service/CategoryService.cs new file mode 100644 index 0000000..a614efd --- /dev/null +++ b/Aurora.Micorservices/Aurora.Core/Aurora.Core.Service/CategoryService.cs @@ -0,0 +1,8 @@ +using System; + +namespace Aurora.Core.Service +{ + public class Class1 + { + } +} -- GitLab