From b096630da759c594bbd9267dc5926db8e6fc950e Mon Sep 17 00:00:00 2001 From: xiaohua Date: Tue, 22 Dec 2020 16:57:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E5=8C=85=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...cadeProjectName.DomainService.Share.csproj | 4 +- ...ame.FacadeProjectName.DomainService.csproj | 4 +- .../Folders/AppFolders.cs | 11 ++ .../Folders/IAppFolders.cs | 19 +++ .../Interceptors/InterceptorRegistrar.cs | 40 ++++++ .../Interceptors/RepositoryInterceptor.cs | 118 ++++++++++++++++++ .../RepositoryInterceptorAttribute.cs | 9 ++ .../Repositories/AppQueryRepository.cs | 78 +++++++++--- .../FacadeProjectNameOracleModule.cs | 61 ++++----- ...panyName.FacadeProjectName.Web.Host.csproj | 8 +- .../FacadeProjectNameWebHostModule.cs | 29 ++++- .../Program.cs | 58 +++++---- ...CompanyName.FacadeProjectName.Tests.csproj | 2 +- 13 files changed, 363 insertions(+), 78 deletions(-) create mode 100644 src/FacadeCompanyName.FacadeProjectName.DomainService/Folders/AppFolders.cs create mode 100644 src/FacadeCompanyName.FacadeProjectName.DomainService/Folders/IAppFolders.cs create mode 100644 src/FacadeCompanyName.FacadeProjectName.Oracle/EntityFrameworkCore/Interceptors/InterceptorRegistrar.cs create mode 100644 src/FacadeCompanyName.FacadeProjectName.Oracle/EntityFrameworkCore/Interceptors/RepositoryInterceptor.cs create mode 100644 src/FacadeCompanyName.FacadeProjectName.Oracle/EntityFrameworkCore/Interceptors/RepositoryInterceptorAttribute.cs diff --git a/src/FacadeCompanyName.FacadeProjectName.DomainService.Share/FacadeCompanyName.FacadeProjectName.DomainService.Share.csproj b/src/FacadeCompanyName.FacadeProjectName.DomainService.Share/FacadeCompanyName.FacadeProjectName.DomainService.Share.csproj index 89af999..c65ef6d 100644 --- a/src/FacadeCompanyName.FacadeProjectName.DomainService.Share/FacadeCompanyName.FacadeProjectName.DomainService.Share.csproj +++ b/src/FacadeCompanyName.FacadeProjectName.DomainService.Share/FacadeCompanyName.FacadeProjectName.DomainService.Share.csproj @@ -13,8 +13,8 @@ - - + + diff --git a/src/FacadeCompanyName.FacadeProjectName.DomainService/FacadeCompanyName.FacadeProjectName.DomainService.csproj b/src/FacadeCompanyName.FacadeProjectName.DomainService/FacadeCompanyName.FacadeProjectName.DomainService.csproj index 6b7db8f..3f87414 100644 --- a/src/FacadeCompanyName.FacadeProjectName.DomainService/FacadeCompanyName.FacadeProjectName.DomainService.csproj +++ b/src/FacadeCompanyName.FacadeProjectName.DomainService/FacadeCompanyName.FacadeProjectName.DomainService.csproj @@ -27,8 +27,8 @@ - - + + diff --git a/src/FacadeCompanyName.FacadeProjectName.DomainService/Folders/AppFolders.cs b/src/FacadeCompanyName.FacadeProjectName.DomainService/Folders/AppFolders.cs new file mode 100644 index 0000000..8399cbc --- /dev/null +++ b/src/FacadeCompanyName.FacadeProjectName.DomainService/Folders/AppFolders.cs @@ -0,0 +1,11 @@ +using Abp.Dependency; + +namespace FacadeCompanyName.FacadeProjectName.DomainService.Folders +{ + public class AppFolders : IAppFolders, ISingletonDependency + { + public string TempFileUploadFolder { get; set; } + public string TempFileDownloadFolder { get; set; } + public string FileUploadFolder { get; set; } + } +} diff --git a/src/FacadeCompanyName.FacadeProjectName.DomainService/Folders/IAppFolders.cs b/src/FacadeCompanyName.FacadeProjectName.DomainService/Folders/IAppFolders.cs new file mode 100644 index 0000000..89f216b --- /dev/null +++ b/src/FacadeCompanyName.FacadeProjectName.DomainService/Folders/IAppFolders.cs @@ -0,0 +1,19 @@ +namespace FacadeCompanyName.FacadeProjectName.DomainService.Folders +{ + public interface IAppFolders + { + /// + /// 临时文件下载文件夹 /downloads/temps + /// + string TempFileDownloadFolder { get; } + /// + /// 临时文件上传文件夹 /uploads/temps + /// + string TempFileUploadFolder { get; } + + /// + /// 文件上传后保存的路径 /uploads/ + /// + string FileUploadFolder { get; } + } +} diff --git a/src/FacadeCompanyName.FacadeProjectName.Oracle/EntityFrameworkCore/Interceptors/InterceptorRegistrar.cs b/src/FacadeCompanyName.FacadeProjectName.Oracle/EntityFrameworkCore/Interceptors/InterceptorRegistrar.cs new file mode 100644 index 0000000..20838c7 --- /dev/null +++ b/src/FacadeCompanyName.FacadeProjectName.Oracle/EntityFrameworkCore/Interceptors/InterceptorRegistrar.cs @@ -0,0 +1,40 @@ +using Castle.Core; +using Castle.MicroKernel; +using System; +using System.Linq; + +namespace FacadeCompanyName.FacadeProjectName.Oracle.EntityFrameworkCore.Interceptors +{ + public class InterceptorRegistrar + { + public static void Initialize(IKernel kernel) + { + kernel.ComponentRegistered += Kernel_ComponentRegistered; + } + + private static void Kernel_ComponentRegistered(string key, IHandler handler) + { + if (JobShouldIntercept(handler.ComponentModel.Implementation)) + { + handler.ComponentModel.Interceptors.Add(new InterceptorReference(typeof(RepositoryInterceptor))); + } + + + } + private static bool JobShouldIntercept(Type type) + { + + //if (type.GetTypeInfo().IsDefined(typeof(JobInterceptorAttribute), true)) + //{ + // return true; + //} + + if (type.GetMethods().Any(m => m.IsDefined(typeof(RepositoryInterceptorAttribute), true))) + { + return true; + } + + return false; + } + } +} diff --git a/src/FacadeCompanyName.FacadeProjectName.Oracle/EntityFrameworkCore/Interceptors/RepositoryInterceptor.cs b/src/FacadeCompanyName.FacadeProjectName.Oracle/EntityFrameworkCore/Interceptors/RepositoryInterceptor.cs new file mode 100644 index 0000000..b64ec0c --- /dev/null +++ b/src/FacadeCompanyName.FacadeProjectName.Oracle/EntityFrameworkCore/Interceptors/RepositoryInterceptor.cs @@ -0,0 +1,118 @@ +using Abp.Dependency; +using Abp.Json; +using Abp.Threading; +using Castle.Core.Logging; +using Castle.DynamicProxy; +using FacadeCompanyName.FacadeProjectName.DomainService.Share; +using System; +using System.Reflection; +using System.Threading.Tasks; + +namespace FacadeCompanyName.FacadeProjectName.Oracle.EntityFrameworkCore.Interceptors +{ + public class RepositoryInterceptor : IInterceptor + { + private readonly ILogger _logger; + + public RepositoryInterceptor() + { + _logger = IocManager.Instance.Resolve(); + } + + public void Intercept(IInvocation invocation) + { + if (!ShouldIntercept(invocation.MethodInvocationTarget)) + { + invocation.Proceed(); + return; + } + + if (invocation.Method.IsAsync()) + { + PerformAsync(invocation); + } + else + { + PerformSync(invocation); + } + } + + private void PerformSync(IInvocation invocation) + { + var fullName = invocation.Method.DeclaringType.FullName + "." + invocation.Method.Name; + try + { + invocation.Proceed(); + } + catch (Exception ex) + { + ExceptionHanding(ex, fullName, invocation.Arguments); + } + } + + private void PerformAsync(IInvocation invocation) + { + var fullName = invocation.Method.DeclaringType.FullName + "." + invocation.Method.Name; + PerformSync(invocation); + + if (invocation.Method.ReturnType == typeof(Task)) + { + invocation.ReturnValue = InternalAsyncHelper.AwaitTaskWithFinally( + (Task)invocation.ReturnValue, + ex => + { + ExceptionHanding(ex, fullName, invocation.Arguments); + }); + } + else //Task + { + invocation.ReturnValue = InternalAsyncHelper.CallAwaitTaskWithFinallyAndGetResult( + invocation.Method.ReturnType.GenericTypeArguments[0], + invocation.ReturnValue, + ex => + { + ExceptionHanding(ex, fullName, invocation.Arguments); + }); + } + } + + private void ExceptionHanding(Exception ex, string fullName, object args) + { + if (ex != null) + { + _logger.Error(ex.Message + $"\r\n{fullName}:\r\n" + args.ToJsonString().Replace("\r\n", " "), ex); + throw ex; + } + } + + + private bool ShouldIntercept(MethodInfo methodInfo) + { + if (methodInfo == null) + { + return false; + } + + if (!methodInfo.IsPublic) + { + return false; + } + + if (methodInfo.IsDefined(typeof(RepositoryInterceptorAttribute), true)) + { + return true; + } + + //var classType = methodInfo.DeclaringType; + //if (classType != null) + //{ + // if (classType.GetTypeInfo().IsDefined(typeof(JobInterceptorAttribute), true)) + // { + // return true; + // } + //} + + return false; + } + } +} diff --git a/src/FacadeCompanyName.FacadeProjectName.Oracle/EntityFrameworkCore/Interceptors/RepositoryInterceptorAttribute.cs b/src/FacadeCompanyName.FacadeProjectName.Oracle/EntityFrameworkCore/Interceptors/RepositoryInterceptorAttribute.cs new file mode 100644 index 0000000..88b162b --- /dev/null +++ b/src/FacadeCompanyName.FacadeProjectName.Oracle/EntityFrameworkCore/Interceptors/RepositoryInterceptorAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace FacadeCompanyName.FacadeProjectName.Oracle.EntityFrameworkCore.Interceptors +{ + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] + public class RepositoryInterceptorAttribute : Attribute + { + } +} diff --git a/src/FacadeCompanyName.FacadeProjectName.Oracle/EntityFrameworkCore/Repositories/AppQueryRepository.cs b/src/FacadeCompanyName.FacadeProjectName.Oracle/EntityFrameworkCore/Repositories/AppQueryRepository.cs index 95c7b43..69411c9 100644 --- a/src/FacadeCompanyName.FacadeProjectName.Oracle/EntityFrameworkCore/Repositories/AppQueryRepository.cs +++ b/src/FacadeCompanyName.FacadeProjectName.Oracle/EntityFrameworkCore/Repositories/AppQueryRepository.cs @@ -1,14 +1,64 @@ -using Facade.Dapper; -using Facade.Dapper.Oracle; -using FacadeCompanyName.FacadeProjectName.DomainService.Share; - -namespace FacadeCompanyName.FacadeProjectName.Oracle.EntityFrameworkCore.Repositories -{ - public class AppQueryRepository : OracleQueryRepository, IAppQueryRepository - { - public AppQueryRepository(IFacadeConnectionProvider facadeConnectionProvider) - : base(facadeConnectionProvider) - { - } - } -} +using Dapper; +using Facade.Dapper; +using Facade.Dapper.Oracle; +using FacadeCompanyName.FacadeProjectName.DomainService.Share; +using FacadeCompanyName.FacadeProjectName.Oracle.EntityFrameworkCore.Interceptors; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace FacadeCompanyName.FacadeProjectName.Oracle.EntityFrameworkCore.Repositories +{ + public class AppQueryRepository : OracleQueryRepository, IAppQueryRepository + { + public AppQueryRepository(IFacadeConnectionProvider facadeConnectionProvider) + : base(facadeConnectionProvider) + { + } + [RepositoryInterceptor] + public override Task ExecuteAsync(string query, object param = null) + { + return base.ExecuteAsync(query, param); + } + [RepositoryInterceptor] + public override Task ExecuteScalarAsync(string query, object param = null) + { + return base.ExecuteScalarAsync(query, param); + } + [RepositoryInterceptor] + public override Task> QueryAsync(string query, object param = null) + { + return base.QueryAsync(query, param); + } + [RepositoryInterceptor] + public override Task> QueryAsync(string query, Func map, object param = null) + { + return base.QueryAsync(query, map, param); + } + [RepositoryInterceptor] + public override Task> QueryAsync(string query, Func map, object param = null) + { + return base.QueryAsync(query, map, param); + } + [RepositoryInterceptor] + public override Task> QueryAsync(string query, Func map, object param = null) + { + return base.QueryAsync(query, map, param); + } + [RepositoryInterceptor] + public override Task QueryFirstOrDefaultAsync(string query, object param = null) + { + return base.QueryFirstOrDefaultAsync(query, param); + } + [RepositoryInterceptor] + public override Task QueryMultipleAsync(string query, object param = null) + { + return base.QueryMultipleAsync(query, param); + } + [RepositoryInterceptor] + public override Task<(IEnumerable list, int totalCount)> PagedAsync(string query, int currentPage = 1, int pageCount = 10, object param = null) + { + return base.PagedAsync(query, currentPage, pageCount, param); + } + } +} diff --git a/src/FacadeCompanyName.FacadeProjectName.Oracle/FacadeProjectNameOracleModule.cs b/src/FacadeCompanyName.FacadeProjectName.Oracle/FacadeProjectNameOracleModule.cs index b761728..9c764cf 100644 --- a/src/FacadeCompanyName.FacadeProjectName.Oracle/FacadeProjectNameOracleModule.cs +++ b/src/FacadeCompanyName.FacadeProjectName.Oracle/FacadeProjectNameOracleModule.cs @@ -1,29 +1,32 @@ -using Abp.Modules; -using Abp.Reflection.Extensions; -using FacadeCompanyName.FacadeProjectName.DomainService.Share; -using System.Collections.Generic; -using System.Reflection; - -namespace FacadeCompanyName.FacadeProjectName.Oracle -{ - [DependsOn( - typeof(FacadeProjectNameDomainServiceShareModule) - )] - public class FacadeProjectNameOracleModule : AbpModule - { - - public FacadeProjectNameOracleModule() - { - } - public override void PreInitialize() - { - } - - public override void Initialize() - { - IocManager.RegisterAssemblyByConvention(typeof(FacadeProjectNameOracleModule).GetAssembly()); - DapperExtensions.DapperExtensions.SetMappingAssemblies(new List { typeof(FacadeProjectNameOracleModule).GetAssembly() }); - } - - } -} +using Abp.Modules; +using Abp.Reflection.Extensions; +using FacadeCompanyName.FacadeProjectName.DomainService.Share; +using FacadeCompanyName.FacadeProjectName.Oracle.EntityFrameworkCore.Interceptors; +using System.Collections.Generic; +using System.Reflection; + +namespace FacadeCompanyName.FacadeProjectName.Oracle +{ + [DependsOn( + typeof(FacadeProjectNameDomainServiceShareModule) + )] + public class FacadeProjectNameOracleModule : AbpModule + { + + public FacadeProjectNameOracleModule() + { + } + public override void PreInitialize() + { + //注册拦截器 + InterceptorRegistrar.Initialize(IocManager.IocContainer.Kernel); + } + + public override void Initialize() + { + IocManager.RegisterAssemblyByConvention(typeof(FacadeProjectNameOracleModule).GetAssembly()); + DapperExtensions.DapperExtensions.SetMappingAssemblies(new List { typeof(FacadeProjectNameOracleModule).GetAssembly() }); + } + + } +} diff --git a/src/FacadeCompanyName.FacadeProjectName.Web.Host/FacadeCompanyName.FacadeProjectName.Web.Host.csproj b/src/FacadeCompanyName.FacadeProjectName.Web.Host/FacadeCompanyName.FacadeProjectName.Web.Host.csproj index 3cc3d8f..d12b1fa 100644 --- a/src/FacadeCompanyName.FacadeProjectName.Web.Host/FacadeCompanyName.FacadeProjectName.Web.Host.csproj +++ b/src/FacadeCompanyName.FacadeProjectName.Web.Host/FacadeCompanyName.FacadeProjectName.Web.Host.csproj @@ -23,12 +23,12 @@ - - - + + + - + diff --git a/src/FacadeCompanyName.FacadeProjectName.Web.Host/FacadeProjectNameWebHostModule.cs b/src/FacadeCompanyName.FacadeProjectName.Web.Host/FacadeProjectNameWebHostModule.cs index 1b1d6cf..28ef872 100644 --- a/src/FacadeCompanyName.FacadeProjectName.Web.Host/FacadeProjectNameWebHostModule.cs +++ b/src/FacadeCompanyName.FacadeProjectName.Web.Host/FacadeProjectNameWebHostModule.cs @@ -1,4 +1,5 @@ -using Abp.Modules; +using Abp.IO; +using Abp.Modules; using Abp.Reflection.Extensions; using Facade.AspNetCore; using Facade.AspNetCore.Configuration; @@ -6,12 +7,14 @@ using Facade.AspNetCore.Zero; using Facade.Core.Configuration; using FacadeCompanyName.FacadeProjectName.Application; +using FacadeCompanyName.FacadeProjectName.DomainService.Folders; using FacadeCompanyName.FacadeProjectName.DomainService.Share; using FacadeCompanyName.FacadeProjectName.Web.Host.Authentication.JwtBearer; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.IdentityModel.Tokens; using System; +using System.IO; using System.Text; namespace FacadeCompanyName.FacadeProjectName.Web.Host @@ -46,6 +49,7 @@ public override void PreInitialize() var facadeConfiguration = IocManager.Resolve(); _appConfiguration.GetSection("FacadeConfiguration").Bind(facadeConfiguration); + Configuration.Auditing.IsEnabled = false; Configuration.Auditing.IsEnabledForAnonymousUsers = true; Configuration.BackgroundJobs.IsJobExecutionEnabled = false; Configuration.MultiTenancy.IsEnabled = FacadeProjectNameConsts.MultiTenancyEnabled; @@ -57,6 +61,11 @@ public override void PreInitialize() public override void Initialize() { IocManager.RegisterAssemblyByConvention(typeof(FacadeProjectNameWebHostModule).GetAssembly()); + } + public override void PostInitialize() + { + SetAppFolders(); + // StartQuartz(); } private void ConfigureTokenAuth() { @@ -67,7 +76,23 @@ private void ConfigureTokenAuth() tokenAuthConfig.Issuer = _appConfiguration["Authentication:JwtBearer:Issuer"]; tokenAuthConfig.Audience = _appConfiguration["Authentication:JwtBearer:Audience"]; tokenAuthConfig.SigningCredentials = new SigningCredentials(tokenAuthConfig.SecurityKey, SecurityAlgorithms.HmacSha256); - tokenAuthConfig.Expiration = TimeSpan.FromDays(1); + tokenAuthConfig.Expiration = TimeSpan.FromDays(30); + } + private void SetAppFolders() + { + var appFolders = IocManager.Resolve(); + + appFolders.FileUploadFolder = Path.Combine(_env.WebRootPath, "uploads"); + appFolders.TempFileUploadFolder = Path.Combine(_env.WebRootPath, "uploads", "temps"); + appFolders.TempFileDownloadFolder = Path.Combine(_env.WebRootPath, "downloads", "temps"); + + try + { + DirectoryHelper.CreateIfNotExists(appFolders.FileUploadFolder); + DirectoryHelper.CreateIfNotExists(appFolders.TempFileUploadFolder); + DirectoryHelper.CreateIfNotExists(appFolders.TempFileDownloadFolder); + } + catch { } } } } diff --git a/src/FacadeCompanyName.FacadeProjectName.Web.Host/Program.cs b/src/FacadeCompanyName.FacadeProjectName.Web.Host/Program.cs index a39c664..753effc 100644 --- a/src/FacadeCompanyName.FacadeProjectName.Web.Host/Program.cs +++ b/src/FacadeCompanyName.FacadeProjectName.Web.Host/Program.cs @@ -1,24 +1,34 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.AspNetCore; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Logging; - -namespace FacadeCompanyName.FacadeProjectName.Web.Host -{ - public class Program - { - public static void Main(string[] args) - { - CreateWebHostBuilder(args).Build().Run(); - } - - public static IWebHostBuilder CreateWebHostBuilder(string[] args) => - WebHost.CreateDefaultBuilder(args) - .UseStartup(); - } -} +using Microsoft.AspNetCore; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using System.IO; + +namespace FacadeCompanyName.FacadeProjectName.Web.Host +{ + public class Program + { + private const string urls = "server.urls"; + public static void Main(string[] args) + { + CreateWebHostBuilder(args).Build().Run(); + } + + public static IWebHostBuilder CreateWebHostBuilder(string[] args) + { + var config = new ConfigurationBuilder() + .SetBasePath(Directory.GetCurrentDirectory()) + .AddJsonFile("hosting.json", optional: true) + .Build(); + string url = config[urls] ?? "http://*:21021"; + + return WebHost.CreateDefaultBuilder(args) + .UseUrls(url) + .UseStartup() + .UseKestrel(options => + { + options.Limits.MaxRequestBodySize = null; + options.Limits.MaxRequestBufferSize = null; + }); + } + } +} diff --git a/test/FacadeCompanyName.FacadeProjectName.Tests/FacadeCompanyName.FacadeProjectName.Tests.csproj b/test/FacadeCompanyName.FacadeProjectName.Tests/FacadeCompanyName.FacadeProjectName.Tests.csproj index 6a64b46..0103be7 100644 --- a/test/FacadeCompanyName.FacadeProjectName.Tests/FacadeCompanyName.FacadeProjectName.Tests.csproj +++ b/test/FacadeCompanyName.FacadeProjectName.Tests/FacadeCompanyName.FacadeProjectName.Tests.csproj @@ -7,7 +7,7 @@ - +