From 28da906e75f86f7dcf875ab11d76ecede775ee5f Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 30 Dec 2020 17:09:56 +0800 Subject: [PATCH 001/100] Add NormalizeContainerName method --- .../BlobStoring/Aliyun/AliyunBlobProvider.cs | 11 ++++--- .../Abp/BlobStoring/Aws/AwsBlobProvider.cs | 14 +++++---- .../BlobStoring/Azure/AzureBlobProvider.cs | 12 ++++---- ...nioBlobContainerConfigurationExtensions.cs | 1 + .../BlobStoring/Minio/MinioBlobProvider.cs | 10 ++++--- .../Volo/Abp/BlobStoring/BlobProviderBase.cs | 29 +++++++++++++++++-- 6 files changed, 57 insertions(+), 20 deletions(-) diff --git a/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProvider.cs index d6c9303afd..199c343659 100644 --- a/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProvider.cs +++ b/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProvider.cs @@ -10,13 +10,16 @@ namespace Volo.Abp.BlobStoring.Aliyun { protected IOssClientFactory OssClientFactory { get; } protected IAliyunBlobNameCalculator AliyunBlobNameCalculator { get; } + protected IServiceProvider ServiceProvider { get; } public AliyunBlobProvider( IOssClientFactory ossClientFactory, - IAliyunBlobNameCalculator aliyunBlobNameCalculator) + IAliyunBlobNameCalculator aliyunBlobNameCalculator, + IServiceProvider serviceProvider) { OssClientFactory = ossClientFactory; AliyunBlobNameCalculator = aliyunBlobNameCalculator; + ServiceProvider = serviceProvider; } protected virtual IOss GetOssClient(BlobContainerConfiguration blobContainerConfiguration) @@ -88,15 +91,15 @@ namespace Volo.Abp.BlobStoring.Aliyun return memoryStream; } - private static string GetContainerName(BlobProviderArgs args) + protected virtual string GetContainerName(BlobProviderArgs args) { var configuration = args.Configuration.GetAliyunConfiguration(); return configuration.ContainerName.IsNullOrWhiteSpace() ? args.ContainerName - : configuration.ContainerName; + : NormalizeContainerName(args, ServiceProvider, configuration.ContainerName); } - private bool BlobExists(IOss ossClient,string containerName, string blobName) + protected virtual bool BlobExists(IOss ossClient,string containerName, string blobName) { // Make sure Blob Container exists. return ossClient.DoesBucketExist(containerName) && diff --git a/framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProvider.cs index 191f9a0ac7..dbf2ce3848 100644 --- a/framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProvider.cs +++ b/framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProvider.cs @@ -12,12 +12,16 @@ namespace Volo.Abp.BlobStoring.Aws { protected IAwsBlobNameCalculator AwsBlobNameCalculator { get; } protected IAmazonS3ClientFactory AmazonS3ClientFactory { get; } + protected IServiceProvider ServiceProvider { get; } - public AwsBlobProvider(IAwsBlobNameCalculator awsBlobNameCalculator, - IAmazonS3ClientFactory amazonS3ClientFactory) + public AwsBlobProvider( + IAwsBlobNameCalculator awsBlobNameCalculator, + IAmazonS3ClientFactory amazonS3ClientFactory, + IServiceProvider serviceProvider) { AwsBlobNameCalculator = awsBlobNameCalculator; AmazonS3ClientFactory = amazonS3ClientFactory; + ServiceProvider = serviceProvider; } public async override Task SaveAsync(BlobProviderSaveArgs args) @@ -111,7 +115,7 @@ namespace Volo.Abp.BlobStoring.Aws return await AmazonS3ClientFactory.GetAmazonS3Client(configuration); } - private async Task BlobExistsAsync(AmazonS3Client amazonS3Client, string containerName, string blobName) + protected virtual async Task BlobExistsAsync(AmazonS3Client amazonS3Client, string containerName, string blobName) { // Make sure Blob Container exists. if (!await AmazonS3Util.DoesS3BucketExistV2Async(amazonS3Client, containerName)) @@ -147,12 +151,12 @@ namespace Volo.Abp.BlobStoring.Aws } } - private static string GetContainerName(BlobProviderArgs args) + protected virtual string GetContainerName(BlobProviderArgs args) { var configuration = args.Configuration.GetAwsConfiguration(); return configuration.ContainerName.IsNullOrWhiteSpace() ? args.ContainerName - : configuration.ContainerName; + : NormalizeContainerName(args, ServiceProvider, configuration.ContainerName); } } } diff --git a/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobProvider.cs index 3a9a062e76..58780c17b6 100644 --- a/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobProvider.cs +++ b/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobProvider.cs @@ -9,10 +9,12 @@ namespace Volo.Abp.BlobStoring.Azure public class AzureBlobProvider : BlobProviderBase, ITransientDependency { protected IAzureBlobNameCalculator AzureBlobNameCalculator { get; } + protected IServiceProvider ServiceProvider { get; } - public AzureBlobProvider(IAzureBlobNameCalculator azureBlobNameCalculator) + public AzureBlobProvider(IAzureBlobNameCalculator azureBlobNameCalculator, IServiceProvider serviceProvider) { AzureBlobNameCalculator = azureBlobNameCalculator; + ServiceProvider = serviceProvider; } public async override Task SaveAsync(BlobProviderSaveArgs args) @@ -87,22 +89,22 @@ namespace Volo.Abp.BlobStoring.Azure await blobContainerClient.CreateIfNotExistsAsync(); } - private async Task BlobExistsAsync(BlobProviderArgs args, string blobName) + protected virtual async Task BlobExistsAsync(BlobProviderArgs args, string blobName) { // Make sure Blob Container exists. return await ContainerExistsAsync(GetBlobContainerClient(args)) && (await GetBlobClient(args, blobName).ExistsAsync()).Value; } - private static string GetContainerName(BlobProviderArgs args) + protected virtual string GetContainerName(BlobProviderArgs args) { var configuration = args.Configuration.GetAzureConfiguration(); return configuration.ContainerName.IsNullOrWhiteSpace() ? args.ContainerName - : configuration.ContainerName; + : NormalizeContainerName(args, ServiceProvider, configuration.ContainerName); } - private static async Task ContainerExistsAsync(BlobContainerClient blobContainerClient) + protected virtual async Task ContainerExistsAsync(BlobContainerClient blobContainerClient) { return (await blobContainerClient.ExistsAsync()).Value; } diff --git a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobContainerConfigurationExtensions.cs b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobContainerConfigurationExtensions.cs index 3465914156..1449623ef4 100644 --- a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobContainerConfigurationExtensions.cs +++ b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobContainerConfigurationExtensions.cs @@ -15,6 +15,7 @@ namespace Volo.Abp.BlobStoring.Minio Action minioConfigureAction) { containerConfiguration.ProviderType = typeof(MinioBlobProvider); + containerConfiguration.NamingNormalizers.TryAdd(); minioConfigureAction(new MinioBlobProviderConfiguration(containerConfiguration)); diff --git a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs index fca23324dc..f8f1a1e880 100644 --- a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs +++ b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs @@ -10,10 +10,12 @@ namespace Volo.Abp.BlobStoring.Minio public class MinioBlobProvider : BlobProviderBase, ITransientDependency { protected IMinioBlobNameCalculator MinioBlobNameCalculator { get; } + protected IServiceProvider ServiceProvider { get; } - public MinioBlobProvider(IMinioBlobNameCalculator minioBlobNameCalculator) + public MinioBlobProvider(IMinioBlobNameCalculator minioBlobNameCalculator, IServiceProvider serviceProvider) { MinioBlobNameCalculator = minioBlobNameCalculator; + ServiceProvider = serviceProvider; } public async override Task SaveAsync(BlobProviderSaveArgs args) @@ -108,7 +110,7 @@ namespace Volo.Abp.BlobStoring.Minio } } - private async Task BlobExistsAsync(MinioClient client, string containerName , string blobName) + protected virtual async Task BlobExistsAsync(MinioClient client, string containerName , string blobName) { // Make sure Blob Container exists. if (await client.BucketExistsAsync(containerName)) @@ -133,13 +135,13 @@ namespace Volo.Abp.BlobStoring.Minio return false; } - private static string GetContainerName(BlobProviderArgs args) + protected virtual string GetContainerName(BlobProviderArgs args) { var configuration = args.Configuration.GetMinioConfiguration(); return configuration.BucketName.IsNullOrWhiteSpace() ? args.ContainerName - : configuration.BucketName; + : NormalizeContainerName(args, ServiceProvider, configuration.BucketName); } } } diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderBase.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderBase.cs index b1aafb6903..e0a798a7bb 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderBase.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderBase.cs @@ -1,5 +1,8 @@ -using System.IO; +using System; +using System.IO; +using System.Linq; using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; namespace Volo.Abp.BlobStoring { @@ -12,5 +15,27 @@ namespace Volo.Abp.BlobStoring public abstract Task ExistsAsync(BlobProviderExistsArgs args); public abstract Task GetOrNullAsync(BlobProviderGetArgs args); + + protected string NormalizeContainerName(BlobProviderArgs args, IServiceProvider serviceProvider, string containerName) + { + if (!args.Configuration.NamingNormalizers.Any()) + { + return containerName; + } + + using (var scope = serviceProvider.CreateScope()) + { + foreach (var normalizerType in args.Configuration.NamingNormalizers) + { + var normalizer = scope.ServiceProvider + .GetRequiredService(normalizerType) + .As(); + + containerName = normalizer.NormalizeContainerName(containerName); + } + + return containerName; + } + } } -} \ No newline at end of file +} From e457a7ede0ac34bdbd94d4fa96adf55b5c4b87b0 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 30 Dec 2020 17:37:34 +0800 Subject: [PATCH 002/100] Improved --- .../Abp/BlobStoring/Aliyun/AliyunBlobProviderConfiguration.cs | 2 +- .../Volo/Abp/BlobStoring/Aws/AwsBlobProviderConfiguration.cs | 2 +- .../Abp/BlobStoring/Azure/AzureBlobProviderConfiguration.cs | 2 +- .../Abp/BlobStoring/Minio/MinioBlobProviderConfiguration.cs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProviderConfiguration.cs b/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProviderConfiguration.cs index 276cbd8fc7..6b83d9f7a9 100644 --- a/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProviderConfiguration.cs +++ b/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProviderConfiguration.cs @@ -82,7 +82,7 @@ namespace Volo.Abp.BlobStoring.Aliyun public string ContainerName { get => _containerConfiguration.GetConfigurationOrDefault(AliyunBlobProviderConfigurationNames.ContainerName); - set => _containerConfiguration.SetConfiguration(AliyunBlobProviderConfigurationNames.ContainerName, Check.NotNullOrWhiteSpace(value, nameof(value))); + set => _containerConfiguration.SetConfiguration(AliyunBlobProviderConfigurationNames.ContainerName, value); } /// diff --git a/framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProviderConfiguration.cs b/framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProviderConfiguration.cs index 2be373e428..86d127c0d9 100644 --- a/framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProviderConfiguration.cs +++ b/framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProviderConfiguration.cs @@ -82,7 +82,7 @@ namespace Volo.Abp.BlobStoring.Aws public string ContainerName { get => _containerConfiguration.GetConfigurationOrDefault(AwsBlobProviderConfigurationNames.ContainerName); - set => _containerConfiguration.SetConfiguration(AwsBlobProviderConfigurationNames.ContainerName, Check.NotNullOrWhiteSpace(value, nameof(value))); + set => _containerConfiguration.SetConfiguration(AwsBlobProviderConfigurationNames.ContainerName, value); } /// diff --git a/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobProviderConfiguration.cs b/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobProviderConfiguration.cs index 969057d7d6..8b409e008b 100644 --- a/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobProviderConfiguration.cs +++ b/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobProviderConfiguration.cs @@ -17,7 +17,7 @@ public string ContainerName { get => _containerConfiguration.GetConfigurationOrDefault(AzureBlobProviderConfigurationNames.ContainerName); - set => _containerConfiguration.SetConfiguration(AzureBlobProviderConfigurationNames.ContainerName, Check.NotNullOrWhiteSpace(value, nameof(value))); + set => _containerConfiguration.SetConfiguration(AzureBlobProviderConfigurationNames.ContainerName, value); } /// diff --git a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProviderConfiguration.cs b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProviderConfiguration.cs index 395aa76a72..fb510843e2 100644 --- a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProviderConfiguration.cs +++ b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProviderConfiguration.cs @@ -5,7 +5,7 @@ public string BucketName { get => _containerConfiguration.GetConfigurationOrDefault(MinioBlobProviderConfigurationNames.BucketName); - set => _containerConfiguration.SetConfiguration(MinioBlobProviderConfigurationNames.BucketName, Check.NotNullOrWhiteSpace(value, nameof(value))); + set => _containerConfiguration.SetConfiguration(MinioBlobProviderConfigurationNames.BucketName, value); } /// From 26fb70beee671bb273fcab961e6ff0bc1b14e5eb Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 30 Dec 2020 18:12:46 +0800 Subject: [PATCH 003/100] Make NormalizeContainerName mehtod virtual --- .../Volo/Abp/BlobStoring/BlobProviderBase.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderBase.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderBase.cs index e0a798a7bb..d96b6fa94b 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderBase.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderBase.cs @@ -16,7 +16,7 @@ namespace Volo.Abp.BlobStoring public abstract Task GetOrNullAsync(BlobProviderGetArgs args); - protected string NormalizeContainerName(BlobProviderArgs args, IServiceProvider serviceProvider, string containerName) + protected virtual string NormalizeContainerName(BlobProviderArgs args, IServiceProvider serviceProvider, string containerName) { if (!args.Configuration.NamingNormalizers.Any()) { From 69a613d3f74b6d9ca4c0dfbfc066af55ef6ab0fe Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Thu, 14 Jan 2021 12:11:38 +0800 Subject: [PATCH 004/100] Add IBlobNormalizeNamingFactory --- .../BlobStoring/Aliyun/AliyunBlobProvider.cs | 8 +-- .../Abp/BlobStoring/Aws/AwsBlobProvider.cs | 8 +-- .../BlobStoring/Azure/AzureBlobProvider.cs | 10 +-- .../BlobStoring/Minio/MinioBlobProvider.cs | 10 +-- .../Volo/Abp/BlobStoring/BlobContainer.cs | 37 +++-------- .../Abp/BlobStoring/BlobContainerFactory.cs | 7 +- .../BlobStoring/BlobNormalizeNamingFactory.cs | 64 +++++++++++++++++++ .../Volo/Abp/BlobStoring/BlobProviderBase.cs | 27 +------- .../IBlobNormalizeNamingFactory.cs | 11 ++++ 9 files changed, 110 insertions(+), 72 deletions(-) create mode 100644 framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobNormalizeNamingFactory.cs create mode 100644 framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobNormalizeNamingFactory.cs diff --git a/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProvider.cs index 199c343659..52d8674c67 100644 --- a/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProvider.cs +++ b/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProvider.cs @@ -10,16 +10,16 @@ namespace Volo.Abp.BlobStoring.Aliyun { protected IOssClientFactory OssClientFactory { get; } protected IAliyunBlobNameCalculator AliyunBlobNameCalculator { get; } - protected IServiceProvider ServiceProvider { get; } + protected IBlobNormalizeNamingFactory BlobNormalizeNamingFactory { get; } public AliyunBlobProvider( IOssClientFactory ossClientFactory, IAliyunBlobNameCalculator aliyunBlobNameCalculator, - IServiceProvider serviceProvider) + IBlobNormalizeNamingFactory blobNormalizeNamingFactory) { OssClientFactory = ossClientFactory; AliyunBlobNameCalculator = aliyunBlobNameCalculator; - ServiceProvider = serviceProvider; + BlobNormalizeNamingFactory = blobNormalizeNamingFactory; } protected virtual IOss GetOssClient(BlobContainerConfiguration blobContainerConfiguration) @@ -96,7 +96,7 @@ namespace Volo.Abp.BlobStoring.Aliyun var configuration = args.Configuration.GetAliyunConfiguration(); return configuration.ContainerName.IsNullOrWhiteSpace() ? args.ContainerName - : NormalizeContainerName(args, ServiceProvider, configuration.ContainerName); + : BlobNormalizeNamingFactory.NormalizeContainerName(args.Configuration, configuration.ContainerName); } protected virtual bool BlobExists(IOss ossClient,string containerName, string blobName) diff --git a/framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProvider.cs index dbf2ce3848..991be2b37c 100644 --- a/framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProvider.cs +++ b/framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProvider.cs @@ -12,16 +12,16 @@ namespace Volo.Abp.BlobStoring.Aws { protected IAwsBlobNameCalculator AwsBlobNameCalculator { get; } protected IAmazonS3ClientFactory AmazonS3ClientFactory { get; } - protected IServiceProvider ServiceProvider { get; } + protected IBlobNormalizeNamingFactory BlobNormalizeNamingFactory { get; } public AwsBlobProvider( IAwsBlobNameCalculator awsBlobNameCalculator, IAmazonS3ClientFactory amazonS3ClientFactory, - IServiceProvider serviceProvider) + IBlobNormalizeNamingFactory blobNormalizeNamingFactory) { AwsBlobNameCalculator = awsBlobNameCalculator; AmazonS3ClientFactory = amazonS3ClientFactory; - ServiceProvider = serviceProvider; + BlobNormalizeNamingFactory = blobNormalizeNamingFactory; } public async override Task SaveAsync(BlobProviderSaveArgs args) @@ -156,7 +156,7 @@ namespace Volo.Abp.BlobStoring.Aws var configuration = args.Configuration.GetAwsConfiguration(); return configuration.ContainerName.IsNullOrWhiteSpace() ? args.ContainerName - : NormalizeContainerName(args, ServiceProvider, configuration.ContainerName); + : BlobNormalizeNamingFactory.NormalizeContainerName(args.Configuration, configuration.ContainerName); } } } diff --git a/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobProvider.cs index 58780c17b6..8e401b73c7 100644 --- a/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobProvider.cs +++ b/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobProvider.cs @@ -9,12 +9,14 @@ namespace Volo.Abp.BlobStoring.Azure public class AzureBlobProvider : BlobProviderBase, ITransientDependency { protected IAzureBlobNameCalculator AzureBlobNameCalculator { get; } - protected IServiceProvider ServiceProvider { get; } + protected IBlobNormalizeNamingFactory BlobNormalizeNamingFactory { get; } - public AzureBlobProvider(IAzureBlobNameCalculator azureBlobNameCalculator, IServiceProvider serviceProvider) + public AzureBlobProvider( + IAzureBlobNameCalculator azureBlobNameCalculator, + IBlobNormalizeNamingFactory blobNormalizeNamingFactory) { AzureBlobNameCalculator = azureBlobNameCalculator; - ServiceProvider = serviceProvider; + BlobNormalizeNamingFactory = blobNormalizeNamingFactory; } public async override Task SaveAsync(BlobProviderSaveArgs args) @@ -101,7 +103,7 @@ namespace Volo.Abp.BlobStoring.Azure var configuration = args.Configuration.GetAzureConfiguration(); return configuration.ContainerName.IsNullOrWhiteSpace() ? args.ContainerName - : NormalizeContainerName(args, ServiceProvider, configuration.ContainerName); + : BlobNormalizeNamingFactory.NormalizeContainerName(args.Configuration, configuration.ContainerName); } protected virtual async Task ContainerExistsAsync(BlobContainerClient blobContainerClient) diff --git a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs index f8f1a1e880..a182478017 100644 --- a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs +++ b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs @@ -10,12 +10,14 @@ namespace Volo.Abp.BlobStoring.Minio public class MinioBlobProvider : BlobProviderBase, ITransientDependency { protected IMinioBlobNameCalculator MinioBlobNameCalculator { get; } - protected IServiceProvider ServiceProvider { get; } + protected IBlobNormalizeNamingFactory BlobNormalizeNamingFactory { get; } - public MinioBlobProvider(IMinioBlobNameCalculator minioBlobNameCalculator, IServiceProvider serviceProvider) + public MinioBlobProvider( + IMinioBlobNameCalculator minioBlobNameCalculator, + IBlobNormalizeNamingFactory blobNormalizeNamingFactory) { MinioBlobNameCalculator = minioBlobNameCalculator; - ServiceProvider = serviceProvider; + BlobNormalizeNamingFactory = blobNormalizeNamingFactory; } public async override Task SaveAsync(BlobProviderSaveArgs args) @@ -141,7 +143,7 @@ namespace Volo.Abp.BlobStoring.Minio return configuration.BucketName.IsNullOrWhiteSpace() ? args.ContainerName - : NormalizeContainerName(args, ServiceProvider, configuration.BucketName); + : BlobNormalizeNamingFactory.NormalizeContainerName(args.Configuration, configuration.BucketName); } } } diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainer.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainer.cs index cd2287e964..a95cdcadbe 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainer.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainer.cs @@ -1,9 +1,7 @@ using System; using System.IO; -using System.Linq; using System.Threading; using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; using Volo.Abp.MultiTenancy; using Volo.Abp.Threading; @@ -88,12 +86,15 @@ namespace Volo.Abp.BlobStoring protected IServiceProvider ServiceProvider { get; } + protected IBlobNormalizeNamingFactory BlobNormalizeNamingFactory { get; } + public BlobContainer( string containerName, BlobContainerConfiguration configuration, IBlobProvider provider, ICurrentTenant currentTenant, ICancellationTokenProvider cancellationTokenProvider, + IBlobNormalizeNamingFactory blobNormalizeNamingFactory, IServiceProvider serviceProvider) { ContainerName = containerName; @@ -101,6 +102,7 @@ namespace Volo.Abp.BlobStoring Provider = provider; CurrentTenant = currentTenant; CancellationTokenProvider = cancellationTokenProvider; + BlobNormalizeNamingFactory = blobNormalizeNamingFactory; ServiceProvider = serviceProvider; } @@ -112,7 +114,7 @@ namespace Volo.Abp.BlobStoring { using (CurrentTenant.Change(GetTenantIdOrNull())) { - var (normalizedContainerName, normalizedBlobName) = NormalizeNaming(ContainerName, name); + var (normalizedContainerName, normalizedBlobName) = BlobNormalizeNamingFactory.NormalizeNaming(Configuration, ContainerName, name); await Provider.SaveAsync( new BlobProviderSaveArgs( @@ -134,7 +136,7 @@ namespace Volo.Abp.BlobStoring using (CurrentTenant.Change(GetTenantIdOrNull())) { var (normalizedContainerName, normalizedBlobName) = - NormalizeNaming(ContainerName, name); + BlobNormalizeNamingFactory.NormalizeNaming(Configuration, ContainerName, name); return await Provider.DeleteAsync( new BlobProviderDeleteArgs( @@ -154,7 +156,7 @@ namespace Volo.Abp.BlobStoring using (CurrentTenant.Change(GetTenantIdOrNull())) { var (normalizedContainerName, normalizedBlobName) = - NormalizeNaming(ContainerName, name); + BlobNormalizeNamingFactory.NormalizeNaming(Configuration, ContainerName, name); return await Provider.ExistsAsync( new BlobProviderExistsArgs( @@ -190,7 +192,7 @@ namespace Volo.Abp.BlobStoring using (CurrentTenant.Change(GetTenantIdOrNull())) { var (normalizedContainerName, normalizedBlobName) = - NormalizeNaming(ContainerName, name); + BlobNormalizeNamingFactory.NormalizeNaming(Configuration, ContainerName, name); return await Provider.GetOrNullAsync( new BlobProviderGetArgs( @@ -212,28 +214,5 @@ namespace Volo.Abp.BlobStoring return CurrentTenant.Id; } - - protected virtual (string, string) NormalizeNaming(string containerName, string blobName) - { - if (!Configuration.NamingNormalizers.Any()) - { - return (containerName, blobName); - } - - using (var scope = ServiceProvider.CreateScope()) - { - foreach (var normalizerType in Configuration.NamingNormalizers) - { - var normalizer = scope.ServiceProvider - .GetRequiredService(normalizerType) - .As(); - - containerName = normalizer.NormalizeContainerName(containerName); - blobName = normalizer.NormalizeBlobName(blobName); - } - - return (containerName, blobName); - } - } } } diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs index 7a4da39ef9..8013762164 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs @@ -17,18 +17,22 @@ namespace Volo.Abp.BlobStoring protected IServiceProvider ServiceProvider { get; } + protected IBlobNormalizeNamingFactory BlobNormalizeNamingFactory { get; } + public BlobContainerFactory( IBlobContainerConfigurationProvider configurationProvider, ICurrentTenant currentTenant, ICancellationTokenProvider cancellationTokenProvider, IBlobProviderSelector providerSelector, - IServiceProvider serviceProvider) + IServiceProvider serviceProvider, + IBlobNormalizeNamingFactory blobNormalizeNamingFactory) { ConfigurationProvider = configurationProvider; CurrentTenant = currentTenant; CancellationTokenProvider = cancellationTokenProvider; ProviderSelector = providerSelector; ServiceProvider = serviceProvider; + BlobNormalizeNamingFactory = blobNormalizeNamingFactory; } public virtual IBlobContainer Create(string name) @@ -41,6 +45,7 @@ namespace Volo.Abp.BlobStoring ProviderSelector.Get(name), CurrentTenant, CancellationTokenProvider, + BlobNormalizeNamingFactory, ServiceProvider ); } diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobNormalizeNamingFactory.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobNormalizeNamingFactory.cs new file mode 100644 index 0000000000..cafba9bec2 --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobNormalizeNamingFactory.cs @@ -0,0 +1,64 @@ +using System; +using System.Linq; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.BlobStoring +{ + public class BlobNormalizeNamingFactory : IBlobNormalizeNamingFactory, ITransientDependency + { + protected IServiceProvider ServiceProvider { get; } + + public BlobNormalizeNamingFactory(IServiceProvider serviceProvider) + { + ServiceProvider = serviceProvider; + } + + public (string containerName, string blobName) NormalizeNaming( + BlobContainerConfiguration configuration, + string containerName, + string blobName) + { + + if (!configuration.NamingNormalizers.Any()) + { + return (containerName, blobName); + } + + using (var scope = ServiceProvider.CreateScope()) + { + foreach (var normalizerType in configuration.NamingNormalizers) + { + var normalizer = scope.ServiceProvider + .GetRequiredService(normalizerType) + .As(); + + containerName = containerName.IsNullOrWhiteSpace()? containerName: normalizer.NormalizeContainerName(containerName); + blobName = blobName.IsNullOrWhiteSpace()? blobName: normalizer.NormalizeBlobName(blobName); + } + + return (containerName, blobName); + } + } + + public string NormalizeContainerName(BlobContainerConfiguration configuration, string containerName) + { + if (!configuration.NamingNormalizers.Any()) + { + return containerName; + } + + return NormalizeNaming(configuration, containerName, null).containerName; + } + + public string NormalizeBlobName(BlobContainerConfiguration configuration, string blobName) + { + if (!configuration.NamingNormalizers.Any()) + { + return blobName; + } + + return NormalizeNaming(configuration, null, blobName).blobName; + } + } +} diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderBase.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderBase.cs index d96b6fa94b..ea2bd1ed72 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderBase.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderBase.cs @@ -1,8 +1,5 @@ -using System; -using System.IO; -using System.Linq; +using System.IO; using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; namespace Volo.Abp.BlobStoring { @@ -15,27 +12,5 @@ namespace Volo.Abp.BlobStoring public abstract Task ExistsAsync(BlobProviderExistsArgs args); public abstract Task GetOrNullAsync(BlobProviderGetArgs args); - - protected virtual string NormalizeContainerName(BlobProviderArgs args, IServiceProvider serviceProvider, string containerName) - { - if (!args.Configuration.NamingNormalizers.Any()) - { - return containerName; - } - - using (var scope = serviceProvider.CreateScope()) - { - foreach (var normalizerType in args.Configuration.NamingNormalizers) - { - var normalizer = scope.ServiceProvider - .GetRequiredService(normalizerType) - .As(); - - containerName = normalizer.NormalizeContainerName(containerName); - } - - return containerName; - } - } } } diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobNormalizeNamingFactory.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobNormalizeNamingFactory.cs new file mode 100644 index 0000000000..281196051d --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobNormalizeNamingFactory.cs @@ -0,0 +1,11 @@ +namespace Volo.Abp.BlobStoring +{ + public interface IBlobNormalizeNamingFactory + { + (string containerName, string blobName) NormalizeNaming(BlobContainerConfiguration configuration, string containerName, string blobName); + + string NormalizeContainerName(BlobContainerConfiguration configuration, string containerName); + + string NormalizeBlobName(BlobContainerConfiguration configuration, string blobName); + } +} From d980ca961dfe4ea08c5986f123212ba8f986c003 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Thu, 14 Jan 2021 13:46:09 +0800 Subject: [PATCH 005/100] Rename IBlobNormalizeNamingFactory to IBlobNormalizeNamingService --- .../BlobStoring/Aliyun/AliyunBlobProvider.cs | 8 ++--- .../Abp/BlobStoring/Aws/AwsBlobProvider.cs | 8 ++--- .../BlobStoring/Azure/AzureBlobProvider.cs | 8 ++--- .../BlobStoring/Minio/MinioBlobProvider.cs | 8 ++--- .../Volo/Abp/BlobStoring/BlobContainer.cs | 36 +++++++++---------- .../Abp/BlobStoring/BlobContainerFactory.cs | 8 ++--- .../Abp/BlobStoring/BlobNormalizeNaming.cs | 15 ++++++++ ...ctory.cs => BlobNormalizeNamingService.cs} | 14 ++++---- ...tory.cs => IBlobNormalizeNamingService.cs} | 4 +-- 9 files changed, 62 insertions(+), 47 deletions(-) create mode 100644 framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobNormalizeNaming.cs rename framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/{BlobNormalizeNamingFactory.cs => BlobNormalizeNamingService.cs} (81%) rename framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/{IBlobNormalizeNamingFactory.cs => IBlobNormalizeNamingService.cs} (55%) diff --git a/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProvider.cs index 52d8674c67..b06377245c 100644 --- a/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProvider.cs +++ b/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProvider.cs @@ -10,16 +10,16 @@ namespace Volo.Abp.BlobStoring.Aliyun { protected IOssClientFactory OssClientFactory { get; } protected IAliyunBlobNameCalculator AliyunBlobNameCalculator { get; } - protected IBlobNormalizeNamingFactory BlobNormalizeNamingFactory { get; } + protected IBlobNormalizeNamingService BlobNormalizeNamingService { get; } public AliyunBlobProvider( IOssClientFactory ossClientFactory, IAliyunBlobNameCalculator aliyunBlobNameCalculator, - IBlobNormalizeNamingFactory blobNormalizeNamingFactory) + IBlobNormalizeNamingService blobNormalizeNamingService) { OssClientFactory = ossClientFactory; AliyunBlobNameCalculator = aliyunBlobNameCalculator; - BlobNormalizeNamingFactory = blobNormalizeNamingFactory; + BlobNormalizeNamingService = blobNormalizeNamingService; } protected virtual IOss GetOssClient(BlobContainerConfiguration blobContainerConfiguration) @@ -96,7 +96,7 @@ namespace Volo.Abp.BlobStoring.Aliyun var configuration = args.Configuration.GetAliyunConfiguration(); return configuration.ContainerName.IsNullOrWhiteSpace() ? args.ContainerName - : BlobNormalizeNamingFactory.NormalizeContainerName(args.Configuration, configuration.ContainerName); + : BlobNormalizeNamingService.NormalizeContainerName(args.Configuration, configuration.ContainerName); } protected virtual bool BlobExists(IOss ossClient,string containerName, string blobName) diff --git a/framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProvider.cs index 991be2b37c..939e91f4ef 100644 --- a/framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProvider.cs +++ b/framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProvider.cs @@ -12,16 +12,16 @@ namespace Volo.Abp.BlobStoring.Aws { protected IAwsBlobNameCalculator AwsBlobNameCalculator { get; } protected IAmazonS3ClientFactory AmazonS3ClientFactory { get; } - protected IBlobNormalizeNamingFactory BlobNormalizeNamingFactory { get; } + protected IBlobNormalizeNamingService BlobNormalizeNamingService { get; } public AwsBlobProvider( IAwsBlobNameCalculator awsBlobNameCalculator, IAmazonS3ClientFactory amazonS3ClientFactory, - IBlobNormalizeNamingFactory blobNormalizeNamingFactory) + IBlobNormalizeNamingService blobNormalizeNamingService) { AwsBlobNameCalculator = awsBlobNameCalculator; AmazonS3ClientFactory = amazonS3ClientFactory; - BlobNormalizeNamingFactory = blobNormalizeNamingFactory; + BlobNormalizeNamingService = blobNormalizeNamingService; } public async override Task SaveAsync(BlobProviderSaveArgs args) @@ -156,7 +156,7 @@ namespace Volo.Abp.BlobStoring.Aws var configuration = args.Configuration.GetAwsConfiguration(); return configuration.ContainerName.IsNullOrWhiteSpace() ? args.ContainerName - : BlobNormalizeNamingFactory.NormalizeContainerName(args.Configuration, configuration.ContainerName); + : BlobNormalizeNamingService.NormalizeContainerName(args.Configuration, configuration.ContainerName); } } } diff --git a/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobProvider.cs index 8e401b73c7..b43e7eb030 100644 --- a/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobProvider.cs +++ b/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobProvider.cs @@ -9,14 +9,14 @@ namespace Volo.Abp.BlobStoring.Azure public class AzureBlobProvider : BlobProviderBase, ITransientDependency { protected IAzureBlobNameCalculator AzureBlobNameCalculator { get; } - protected IBlobNormalizeNamingFactory BlobNormalizeNamingFactory { get; } + protected IBlobNormalizeNamingService BlobNormalizeNamingService { get; } public AzureBlobProvider( IAzureBlobNameCalculator azureBlobNameCalculator, - IBlobNormalizeNamingFactory blobNormalizeNamingFactory) + IBlobNormalizeNamingService blobNormalizeNamingService) { AzureBlobNameCalculator = azureBlobNameCalculator; - BlobNormalizeNamingFactory = blobNormalizeNamingFactory; + BlobNormalizeNamingService = blobNormalizeNamingService; } public async override Task SaveAsync(BlobProviderSaveArgs args) @@ -103,7 +103,7 @@ namespace Volo.Abp.BlobStoring.Azure var configuration = args.Configuration.GetAzureConfiguration(); return configuration.ContainerName.IsNullOrWhiteSpace() ? args.ContainerName - : BlobNormalizeNamingFactory.NormalizeContainerName(args.Configuration, configuration.ContainerName); + : BlobNormalizeNamingService.NormalizeContainerName(args.Configuration, configuration.ContainerName); } protected virtual async Task ContainerExistsAsync(BlobContainerClient blobContainerClient) diff --git a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs index a182478017..057e4ea0ba 100644 --- a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs +++ b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs @@ -10,14 +10,14 @@ namespace Volo.Abp.BlobStoring.Minio public class MinioBlobProvider : BlobProviderBase, ITransientDependency { protected IMinioBlobNameCalculator MinioBlobNameCalculator { get; } - protected IBlobNormalizeNamingFactory BlobNormalizeNamingFactory { get; } + protected IBlobNormalizeNamingService BlobNormalizeNamingService { get; } public MinioBlobProvider( IMinioBlobNameCalculator minioBlobNameCalculator, - IBlobNormalizeNamingFactory blobNormalizeNamingFactory) + IBlobNormalizeNamingService blobNormalizeNamingService) { MinioBlobNameCalculator = minioBlobNameCalculator; - BlobNormalizeNamingFactory = blobNormalizeNamingFactory; + BlobNormalizeNamingService = blobNormalizeNamingService; } public async override Task SaveAsync(BlobProviderSaveArgs args) @@ -143,7 +143,7 @@ namespace Volo.Abp.BlobStoring.Minio return configuration.BucketName.IsNullOrWhiteSpace() ? args.ContainerName - : BlobNormalizeNamingFactory.NormalizeContainerName(args.Configuration, configuration.BucketName); + : BlobNormalizeNamingService.NormalizeContainerName(args.Configuration, configuration.BucketName); } } } diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainer.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainer.cs index a95cdcadbe..c4d45b840a 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainer.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainer.cs @@ -86,7 +86,7 @@ namespace Volo.Abp.BlobStoring protected IServiceProvider ServiceProvider { get; } - protected IBlobNormalizeNamingFactory BlobNormalizeNamingFactory { get; } + protected IBlobNormalizeNamingService BlobNormalizeNamingService { get; } public BlobContainer( string containerName, @@ -94,7 +94,7 @@ namespace Volo.Abp.BlobStoring IBlobProvider provider, ICurrentTenant currentTenant, ICancellationTokenProvider cancellationTokenProvider, - IBlobNormalizeNamingFactory blobNormalizeNamingFactory, + IBlobNormalizeNamingService blobNormalizeNamingService, IServiceProvider serviceProvider) { ContainerName = containerName; @@ -102,7 +102,7 @@ namespace Volo.Abp.BlobStoring Provider = provider; CurrentTenant = currentTenant; CancellationTokenProvider = cancellationTokenProvider; - BlobNormalizeNamingFactory = blobNormalizeNamingFactory; + BlobNormalizeNamingService = blobNormalizeNamingService; ServiceProvider = serviceProvider; } @@ -114,13 +114,13 @@ namespace Volo.Abp.BlobStoring { using (CurrentTenant.Change(GetTenantIdOrNull())) { - var (normalizedContainerName, normalizedBlobName) = BlobNormalizeNamingFactory.NormalizeNaming(Configuration, ContainerName, name); + var blobNormalizeNaming = BlobNormalizeNamingService.NormalizeNaming(Configuration, ContainerName, name); await Provider.SaveAsync( new BlobProviderSaveArgs( - normalizedContainerName, + blobNormalizeNaming.ContainerName, Configuration, - normalizedBlobName, + blobNormalizeNaming.BlobName, stream, overrideExisting, CancellationTokenProvider.FallbackToProvider(cancellationToken) @@ -135,14 +135,14 @@ namespace Volo.Abp.BlobStoring { using (CurrentTenant.Change(GetTenantIdOrNull())) { - var (normalizedContainerName, normalizedBlobName) = - BlobNormalizeNamingFactory.NormalizeNaming(Configuration, ContainerName, name); + var blobNormalizeNaming = + BlobNormalizeNamingService.NormalizeNaming(Configuration, ContainerName, name); return await Provider.DeleteAsync( new BlobProviderDeleteArgs( - normalizedContainerName, + blobNormalizeNaming.ContainerName, Configuration, - normalizedBlobName, + blobNormalizeNaming.BlobName, CancellationTokenProvider.FallbackToProvider(cancellationToken) ) ); @@ -155,14 +155,14 @@ namespace Volo.Abp.BlobStoring { using (CurrentTenant.Change(GetTenantIdOrNull())) { - var (normalizedContainerName, normalizedBlobName) = - BlobNormalizeNamingFactory.NormalizeNaming(Configuration, ContainerName, name); + var blobNormalizeNaming = + BlobNormalizeNamingService.NormalizeNaming(Configuration, ContainerName, name); return await Provider.ExistsAsync( new BlobProviderExistsArgs( - normalizedContainerName, + blobNormalizeNaming.ContainerName, Configuration, - normalizedBlobName, + blobNormalizeNaming.BlobName, CancellationTokenProvider.FallbackToProvider(cancellationToken) ) ); @@ -191,14 +191,14 @@ namespace Volo.Abp.BlobStoring { using (CurrentTenant.Change(GetTenantIdOrNull())) { - var (normalizedContainerName, normalizedBlobName) = - BlobNormalizeNamingFactory.NormalizeNaming(Configuration, ContainerName, name); + var blobNormalizeNaming = + BlobNormalizeNamingService.NormalizeNaming(Configuration, ContainerName, name); return await Provider.GetOrNullAsync( new BlobProviderGetArgs( - normalizedContainerName, + blobNormalizeNaming.ContainerName, Configuration, - normalizedBlobName, + blobNormalizeNaming.BlobName, CancellationTokenProvider.FallbackToProvider(cancellationToken) ) ); diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs index 8013762164..0672554506 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs @@ -17,7 +17,7 @@ namespace Volo.Abp.BlobStoring protected IServiceProvider ServiceProvider { get; } - protected IBlobNormalizeNamingFactory BlobNormalizeNamingFactory { get; } + protected IBlobNormalizeNamingService BlobNormalizeNamingService { get; } public BlobContainerFactory( IBlobContainerConfigurationProvider configurationProvider, @@ -25,14 +25,14 @@ namespace Volo.Abp.BlobStoring ICancellationTokenProvider cancellationTokenProvider, IBlobProviderSelector providerSelector, IServiceProvider serviceProvider, - IBlobNormalizeNamingFactory blobNormalizeNamingFactory) + IBlobNormalizeNamingService blobNormalizeNamingService) { ConfigurationProvider = configurationProvider; CurrentTenant = currentTenant; CancellationTokenProvider = cancellationTokenProvider; ProviderSelector = providerSelector; ServiceProvider = serviceProvider; - BlobNormalizeNamingFactory = blobNormalizeNamingFactory; + BlobNormalizeNamingService = blobNormalizeNamingService; } public virtual IBlobContainer Create(string name) @@ -45,7 +45,7 @@ namespace Volo.Abp.BlobStoring ProviderSelector.Get(name), CurrentTenant, CancellationTokenProvider, - BlobNormalizeNamingFactory, + BlobNormalizeNamingService, ServiceProvider ); } diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobNormalizeNaming.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobNormalizeNaming.cs new file mode 100644 index 0000000000..e7ad89425b --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobNormalizeNaming.cs @@ -0,0 +1,15 @@ +namespace Volo.Abp.BlobStoring +{ + public class BlobNormalizeNaming + { + public string ContainerName { get; } + + public string BlobName { get; } + + public BlobNormalizeNaming(string containerName, string blobName) + { + ContainerName = containerName; + BlobName = blobName; + } + } +} diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobNormalizeNamingFactory.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobNormalizeNamingService.cs similarity index 81% rename from framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobNormalizeNamingFactory.cs rename to framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobNormalizeNamingService.cs index cafba9bec2..b2e057032a 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobNormalizeNamingFactory.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobNormalizeNamingService.cs @@ -5,16 +5,16 @@ using Volo.Abp.DependencyInjection; namespace Volo.Abp.BlobStoring { - public class BlobNormalizeNamingFactory : IBlobNormalizeNamingFactory, ITransientDependency + public class BlobNormalizeNamingService : IBlobNormalizeNamingService, ITransientDependency { protected IServiceProvider ServiceProvider { get; } - public BlobNormalizeNamingFactory(IServiceProvider serviceProvider) + public BlobNormalizeNamingService(IServiceProvider serviceProvider) { ServiceProvider = serviceProvider; } - public (string containerName, string blobName) NormalizeNaming( + public BlobNormalizeNaming NormalizeNaming( BlobContainerConfiguration configuration, string containerName, string blobName) @@ -22,7 +22,7 @@ namespace Volo.Abp.BlobStoring if (!configuration.NamingNormalizers.Any()) { - return (containerName, blobName); + return new BlobNormalizeNaming(containerName, blobName); } using (var scope = ServiceProvider.CreateScope()) @@ -37,7 +37,7 @@ namespace Volo.Abp.BlobStoring blobName = blobName.IsNullOrWhiteSpace()? blobName: normalizer.NormalizeBlobName(blobName); } - return (containerName, blobName); + return new BlobNormalizeNaming(containerName, blobName); } } @@ -48,7 +48,7 @@ namespace Volo.Abp.BlobStoring return containerName; } - return NormalizeNaming(configuration, containerName, null).containerName; + return NormalizeNaming(configuration, containerName, null).ContainerName; } public string NormalizeBlobName(BlobContainerConfiguration configuration, string blobName) @@ -58,7 +58,7 @@ namespace Volo.Abp.BlobStoring return blobName; } - return NormalizeNaming(configuration, null, blobName).blobName; + return NormalizeNaming(configuration, null, blobName).BlobName; } } } diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobNormalizeNamingFactory.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobNormalizeNamingService.cs similarity index 55% rename from framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobNormalizeNamingFactory.cs rename to framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobNormalizeNamingService.cs index 281196051d..fecb75ef6a 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobNormalizeNamingFactory.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobNormalizeNamingService.cs @@ -1,8 +1,8 @@ namespace Volo.Abp.BlobStoring { - public interface IBlobNormalizeNamingFactory + public interface IBlobNormalizeNamingService { - (string containerName, string blobName) NormalizeNaming(BlobContainerConfiguration configuration, string containerName, string blobName); + BlobNormalizeNaming NormalizeNaming(BlobContainerConfiguration configuration, string containerName, string blobName); string NormalizeContainerName(BlobContainerConfiguration configuration, string containerName); From b551e42fc98536d3c8062ed215e6ec648e83b756 Mon Sep 17 00:00:00 2001 From: Necati Meral Date: Fri, 15 Jan 2021 11:32:26 +0100 Subject: [PATCH 006/100] language selector should use whole row without version selector --- .../docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml index 1cdfe7ca2e..dc1ca956ed 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml @@ -126,7 +126,7 @@ @if (Model.LanguageSelectListItems.Count > 1) { -
+
From 7120c35161b94ebde819a6558365b90e34104b00 Mon Sep 17 00:00:00 2001 From: Necati Meral Date: Mon, 18 Jan 2021 07:45:45 +0100 Subject: [PATCH 007/100] consolidated duplicate `if` --- .../docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml index dc1ca956ed..b6a33ec2ad 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml @@ -126,7 +126,7 @@ @if (Model.LanguageSelectListItems.Count > 1) { -
+
From 21bc0bdc1171f9aca8e257693ca8bce9a215b202 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Tue, 9 Feb 2021 17:54:03 +0800 Subject: [PATCH 008/100] Add AddDefaultRepository method --- .../AbpCommonDbContextRegistrationOptions.cs | 22 +++++++- ...mmonDbContextRegistrationOptionsBuilder.cs | 14 +++++ .../Repositories/RepositoryRegistrarBase.cs | 16 +++++- .../RepositoryRegistration_Tests.cs | 54 +++++++++++++++++++ 4 files changed, 103 insertions(+), 3 deletions(-) diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/AbpCommonDbContextRegistrationOptions.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/AbpCommonDbContextRegistrationOptions.cs index dbd46811f2..babe1da1f9 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/AbpCommonDbContextRegistrationOptions.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/AbpCommonDbContextRegistrationOptions.cs @@ -29,6 +29,8 @@ namespace Volo.Abp.DependencyInjection public Dictionary CustomRepositories { get; } + public List DefaultRepositories { get; } + public bool SpecifiedDefaultRepositoryTypes => DefaultRepositoryImplementationType != null && DefaultRepositoryImplementationTypeWithoutKey != null; protected AbpCommonDbContextRegistrationOptions(Type originalDbContextType, IServiceCollection services) @@ -38,6 +40,7 @@ namespace Volo.Abp.DependencyInjection DefaultRepositoryDbContextType = originalDbContextType; CustomRepositories = new Dictionary(); ReplacedDbContextTypes = new List(); + DefaultRepositories = new List(); } public IAbpCommonDbContextRegistrationOptionsBuilder ReplaceDbContext() @@ -82,6 +85,23 @@ namespace Volo.Abp.DependencyInjection return AddDefaultRepositories(typeof(TDefaultRepositoryDbContext), includeAllEntities); } + public IAbpCommonDbContextRegistrationOptionsBuilder AddDefaultRepository() + { + return AddDefaultRepository(typeof(TEntity)); + } + + public IAbpCommonDbContextRegistrationOptionsBuilder AddDefaultRepository(Type entityType) + { + if (!typeof(IEntity).IsAssignableFrom(entityType)) + { + throw new AbpException($"Given entityType is not an entity: {entityType.AssemblyQualifiedName}. It must implement {typeof(IEntity<>).AssemblyQualifiedName}."); + } + + DefaultRepositories.AddIfNotContains(entityType); + + return this; + } + public IAbpCommonDbContextRegistrationOptionsBuilder AddRepository() { AddCustomRepository(typeof(TEntity), typeof(TRepository)); @@ -118,4 +138,4 @@ namespace Volo.Abp.DependencyInjection CustomRepositories[entityType] = repositoryType; } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/IAbpCommonDbContextRegistrationOptionsBuilder.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/IAbpCommonDbContextRegistrationOptionsBuilder.cs index 53d2f142cd..ebe49718b2 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/IAbpCommonDbContextRegistrationOptionsBuilder.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/IAbpCommonDbContextRegistrationOptionsBuilder.cs @@ -39,6 +39,20 @@ namespace Volo.Abp.DependencyInjection /// IAbpCommonDbContextRegistrationOptionsBuilder AddDefaultRepositories(Type defaultRepositoryDbContextType, bool includeAllEntities = false); + /// + /// Registers custom repository for a specific entity. + /// + /// Entity type + IAbpCommonDbContextRegistrationOptionsBuilder AddDefaultRepository(); + + + /// + /// Registers default repository for a specific entity. + /// + /// + /// + IAbpCommonDbContextRegistrationOptionsBuilder AddDefaultRepository(Type entityType); + /// /// Registers custom repository for a specific entity. /// Custom repositories overrides default repositories. diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryRegistrarBase.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryRegistrarBase.cs index f3b2fc388f..35129134c3 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryRegistrarBase.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryRegistrarBase.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.DependencyInjection; using Volo.Abp.Domain.Entities; @@ -27,6 +28,12 @@ namespace Volo.Abp.Domain.Repositories { RegisterDefaultRepositories(); } + + foreach (var entityType in Options.DefaultRepositories) + { + ShouldRegisterDefaultRepositoryFor(entityType); + RegisterDefaultRepository(entityType); + } } protected virtual void RegisterDefaultRepositories() @@ -68,7 +75,7 @@ namespace Volo.Abp.Domain.Repositories protected virtual bool ShouldRegisterDefaultRepositoryFor(Type entityType) { - if (!Options.RegisterDefaultRepositories) + if (!Options.RegisterDefaultRepositories && !Options.DefaultRepositories.Any()) { return false; } @@ -78,6 +85,11 @@ namespace Volo.Abp.Domain.Repositories return false; } + if (Options.DefaultRepositories.Contains(entityType)) + { + return true; + } + if (!Options.IncludeAllEntitiesForDefaultRepositories && !typeof(IAggregateRoot).IsAssignableFrom(entityType)) { return false; @@ -92,4 +104,4 @@ namespace Volo.Abp.Domain.Repositories protected abstract Type GetRepositoryType(Type dbContextType, Type entityType, Type primaryKeyType); } -} \ No newline at end of file +} diff --git a/framework/test/Volo.Abp.Ddd.Tests/Volo/Abp/Domain/Repositories/RepositoryRegistration_Tests.cs b/framework/test/Volo.Abp.Ddd.Tests/Volo/Abp/Domain/Repositories/RepositoryRegistration_Tests.cs index 85696fae21..32584f293e 100644 --- a/framework/test/Volo.Abp.Ddd.Tests/Volo/Abp/Domain/Repositories/RepositoryRegistration_Tests.cs +++ b/framework/test/Volo.Abp.Ddd.Tests/Volo/Abp/Domain/Repositories/RepositoryRegistration_Tests.cs @@ -189,6 +189,60 @@ namespace Volo.Abp.Domain.Repositories services.ShouldContainTransient(typeof(IRepository), typeof(MyTestCustomBaseRepository)); } + [Fact] + public void Should_Register_Default_Repository() + { + //Arrange + + var services = new ServiceCollection(); + + var options = new TestDbContextRegistrationOptions(typeof(MyFakeDbContext), services); + options.AddDefaultRepository(); + + //Act + + new MyTestRepositoryRegistrar(options).AddRepositories(); + + //MyTestAggregateRootWithoutPk + services.ShouldNotContainService(typeof(IReadOnlyRepository)); + services.ShouldNotContainService(typeof(IBasicRepository)); + services.ShouldNotContainService(typeof(IRepository)); + + //MyTestAggregateRootWithGuidPk + services.ShouldContainTransient(typeof(IReadOnlyRepository), typeof(MyTestDefaultRepository)); + services.ShouldContainTransient(typeof(IBasicRepository), typeof(MyTestDefaultRepository)); + services.ShouldContainTransient(typeof(IRepository), typeof(MyTestDefaultRepository)); + services.ShouldContainTransient(typeof(IReadOnlyRepository), typeof(MyTestDefaultRepository)); + services.ShouldContainTransient(typeof(IBasicRepository), typeof(MyTestDefaultRepository)); + services.ShouldContainTransient(typeof(IRepository), typeof(MyTestDefaultRepository)); + } + + [Fact] + public void Should_Not_Register_Default_Repository_If_Registered_Custom_Repository() + { + //Arrange + + var services = new ServiceCollection(); + + var options = new TestDbContextRegistrationOptions(typeof(MyFakeDbContext), services); + options + .AddDefaultRepository() + .AddRepository();; + + //Act + + new MyTestRepositoryRegistrar(options).AddRepositories(); + + //MyTestAggregateRootWithGuidPk + services.ShouldContainTransient(typeof(IReadOnlyRepository), typeof(MyTestAggregateRootWithDefaultPkCustomRepository)); + services.ShouldContainTransient(typeof(IBasicRepository), typeof(MyTestAggregateRootWithDefaultPkCustomRepository)); + services.ShouldContainTransient(typeof(IRepository), typeof(MyTestAggregateRootWithDefaultPkCustomRepository)); + services.ShouldContainTransient(typeof(IReadOnlyRepository), typeof(MyTestAggregateRootWithDefaultPkCustomRepository)); + services.ShouldContainTransient(typeof(IReadOnlyBasicRepository), typeof(MyTestAggregateRootWithDefaultPkCustomRepository)); + services.ShouldContainTransient(typeof(IBasicRepository), typeof(MyTestAggregateRootWithDefaultPkCustomRepository)); + services.ShouldContainTransient(typeof(IRepository), typeof(MyTestAggregateRootWithDefaultPkCustomRepository)); + } + public class MyTestRepositoryRegistrar : RepositoryRegistrarBase { public MyTestRepositoryRegistrar(AbpCommonDbContextRegistrationOptions options) From 3b6a0ee16c05ff728575be2e0979395e03bbc68b Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Tue, 9 Feb 2021 18:02:51 +0800 Subject: [PATCH 009/100] Update RepositoryRegistrarBase --- .../Repositories/RepositoryRegistrarBase.cs | 41 +++++++++++-------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryRegistrarBase.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryRegistrarBase.cs index 35129134c3..bf0be45bb6 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryRegistrarBase.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryRegistrarBase.cs @@ -18,34 +18,48 @@ namespace Volo.Abp.Domain.Repositories } public virtual void AddRepositories() + { + RegisterCustomRepositories(); + + RegisterDefaultRepositories(); + + RegisterSpecifiedDefaultRepositories(); + } + + protected virtual void RegisterCustomRepositories() { foreach (var customRepository in Options.CustomRepositories) { Options.Services.AddDefaultRepository(customRepository.Key, customRepository.Value); } + } - if (Options.RegisterDefaultRepositories) + protected virtual void RegisterDefaultRepositories() + { + if (!Options.RegisterDefaultRepositories) { - RegisterDefaultRepositories(); + return; } - foreach (var entityType in Options.DefaultRepositories) + foreach (var entityType in GetEntityTypes(Options.OriginalDbContextType)) { - ShouldRegisterDefaultRepositoryFor(entityType); + if (!ShouldRegisterDefaultRepositoryFor(entityType)) + { + continue; + } + RegisterDefaultRepository(entityType); } } - protected virtual void RegisterDefaultRepositories() + protected virtual void RegisterSpecifiedDefaultRepositories() { - foreach (var entityType in GetEntityTypes(Options.OriginalDbContextType)) + foreach (var entityType in Options.DefaultRepositories) { - if (!ShouldRegisterDefaultRepositoryFor(entityType)) + if (!Options.CustomRepositories.ContainsKey(entityType)) { - continue; + RegisterDefaultRepository(entityType); } - - RegisterDefaultRepository(entityType); } } @@ -75,7 +89,7 @@ namespace Volo.Abp.Domain.Repositories protected virtual bool ShouldRegisterDefaultRepositoryFor(Type entityType) { - if (!Options.RegisterDefaultRepositories && !Options.DefaultRepositories.Any()) + if (!Options.RegisterDefaultRepositories) { return false; } @@ -85,11 +99,6 @@ namespace Volo.Abp.Domain.Repositories return false; } - if (Options.DefaultRepositories.Contains(entityType)) - { - return true; - } - if (!Options.IncludeAllEntitiesForDefaultRepositories && !typeof(IAggregateRoot).IsAssignableFrom(entityType)) { return false; From b8207426d05d81663c02f93ffc54433ce643233c Mon Sep 17 00:00:00 2001 From: maliming Date: Sun, 14 Feb 2021 20:59:06 +0800 Subject: [PATCH 010/100] Ignore password validation in IdentityDataSeeder. Resolve #7677 --- .../Volo/Abp/Identity/IdentityDataSeeder.cs | 77 +++++++++---------- .../Volo/Abp/Identity/IdentityUserManager.cs | 11 +++ 2 files changed, 48 insertions(+), 40 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDataSeeder.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDataSeeder.cs index 9051dc7d66..851676b840 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDataSeeder.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDataSeeder.cs @@ -53,57 +53,54 @@ namespace Volo.Abp.Identity { await IdentityOptions.SetAsync(); - using (IdentityOptions.Value.Password.ClearRequirements()) + var result = new IdentityDataSeedResult(); + //"admin" user + const string adminUserName = "admin"; + var adminUser = await UserRepository.FindByNormalizedUserNameAsync( + LookupNormalizer.NormalizeName(adminUserName) + ); + + if (adminUser != null) { - var result = new IdentityDataSeedResult(); - //"admin" user - const string adminUserName = "admin"; - var adminUser = await UserRepository.FindByNormalizedUserNameAsync( - LookupNormalizer.NormalizeName(adminUserName) - ); + return result; + } - if (adminUser != null) - { - return result; - } + adminUser = new IdentityUser( + GuidGenerator.Create(), + adminUserName, + adminEmail, + tenantId + ) + { + Name = adminUserName + }; + + (await UserManager.CreateAsync(adminUser, adminPassword, validatePassword: false)).CheckErrors(); + result.CreatedAdminUser = true; - adminUser = new IdentityUser( + //"admin" role + const string adminRoleName = "admin"; + var adminRole = + await RoleRepository.FindByNormalizedNameAsync(LookupNormalizer.NormalizeName(adminRoleName)); + if (adminRole == null) + { + adminRole = new IdentityRole( GuidGenerator.Create(), - adminUserName, - adminEmail, + adminRoleName, tenantId ) { - Name = adminUserName + IsStatic = true, + IsPublic = true }; - (await UserManager.CreateAsync(adminUser, adminPassword)).CheckErrors(); - result.CreatedAdminUser = true; - - //"admin" role - const string adminRoleName = "admin"; - var adminRole = - await RoleRepository.FindByNormalizedNameAsync(LookupNormalizer.NormalizeName(adminRoleName)); - if (adminRole == null) - { - adminRole = new IdentityRole( - GuidGenerator.Create(), - adminRoleName, - tenantId - ) - { - IsStatic = true, - IsPublic = true - }; - - (await RoleManager.CreateAsync(adminRole)).CheckErrors(); - result.CreatedAdminRole = true; - } + (await RoleManager.CreateAsync(adminRole)).CheckErrors(); + result.CreatedAdminRole = true; + } - (await UserManager.AddToRoleAsync(adminUser, adminRoleName)).CheckErrors(); + (await UserManager.AddToRoleAsync(adminUser, adminRoleName)).CheckErrors(); - return result; - } + return result; } } } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs index 69376958b7..6450adfad9 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs @@ -60,6 +60,17 @@ namespace Volo.Abp.Identity CancellationTokenProvider = cancellationTokenProvider; } + public virtual async Task CreateAsync(IdentityUser user, string password, bool validatePassword) + { + var result = await CreateAsync(user); + if (!result.Succeeded) + { + return result; + } + + return await UpdatePasswordHash(user, password, validatePassword); + } + public virtual async Task GetByIdAsync(Guid id) { var user = await Store.FindByIdAsync(id.ToString(), CancellationToken); From 4d829820bbcaaf36b52bdb069a09860d80c54fe6 Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 15 Feb 2021 17:29:44 +0800 Subject: [PATCH 011/100] UpdatePasswordHash first when create an user & remove PasswordOptionsExtensions. --- .../Volo/Abp/Identity/IdentityUserManager.cs | 4 +-- .../Abp/Identity/PasswordOptionsExtensions.cs | 35 ------------------- 2 files changed, 2 insertions(+), 37 deletions(-) delete mode 100644 modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/PasswordOptionsExtensions.cs diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs index 6450adfad9..508728eea1 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs @@ -62,13 +62,13 @@ namespace Volo.Abp.Identity public virtual async Task CreateAsync(IdentityUser user, string password, bool validatePassword) { - var result = await CreateAsync(user); + var result = await UpdatePasswordHash(user, password, validatePassword); if (!result.Succeeded) { return result; } - return await UpdatePasswordHash(user, password, validatePassword); + return await CreateAsync(user); } public virtual async Task GetByIdAsync(Guid id) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/PasswordOptionsExtensions.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/PasswordOptionsExtensions.cs deleted file mode 100644 index 793cc6349e..0000000000 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/PasswordOptionsExtensions.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using Microsoft.AspNetCore.Identity; - -namespace Volo.Abp.Identity -{ - public static class PasswordOptionsExtensions - { - public static IDisposable ClearRequirements(this PasswordOptions options) - { - var oldRequireDigit = options.RequireDigit; - var oldRequiredLength = options.RequiredLength; - var oldRequireLowercase = options.RequireLowercase; - var oldRequireUppercase = options.RequireUppercase; - var oldRequiredUniqueChars = options.RequiredUniqueChars; - var oldRequireNonAlphanumeric = options.RequireNonAlphanumeric; - - options.RequireDigit = false; - options.RequiredLength = 1; - options.RequireLowercase = false; - options.RequireUppercase = false; - options.RequiredUniqueChars = 1; - options.RequireNonAlphanumeric = false; - - return new DisposeAction(() => - { - options.RequireDigit = oldRequireDigit; - options.RequiredLength = oldRequiredLength; - options.RequireLowercase = oldRequireLowercase; - options.RequireUppercase = oldRequireUppercase; - options.RequiredUniqueChars = oldRequiredUniqueChars; - options.RequireNonAlphanumeric = oldRequireNonAlphanumeric; - }); - } - } -} From 393f86babf42b4d1af6ba22684cabafb3a068d30 Mon Sep 17 00:00:00 2001 From: Alper Ebicoglu Date: Tue, 16 Feb 2021 23:33:51 +0300 Subject: [PATCH 012/100] added security header middleware. closes #7752 --- .../AbpApplicationBuilderExtensions.cs | 6 +++ .../Volo.Abp.AspNetCore.csproj | 1 + .../Security/AbpSecurityHeadersMiddleware.cs | 37 +++++++++++++++++++ .../Mvc/AbpAspNetCoreMvcTestModule.cs | 1 + .../app/VoloDocs.Web/VoloDocsWebModule.cs | 4 +- .../MyProjectNameHttpApiHostModule.cs | 1 + .../MyProjectNameHttpApiHostModule.cs | 1 + .../MyProjectNameIdentityServerModule.cs | 1 + .../MyProjectNameWebModule.cs | 1 + .../MyProjectNameWebModule.cs | 1 + 10 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Security/AbpSecurityHeadersMiddleware.cs diff --git a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs index 568ecfef7b..fab4a4bb80 100644 --- a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs @@ -6,6 +6,7 @@ using Microsoft.Extensions.Hosting; using Volo.Abp; using Volo.Abp.AspNetCore.Auditing; using Volo.Abp.AspNetCore.ExceptionHandling; +using Volo.Abp.AspNetCore.Security; using Volo.Abp.AspNetCore.Security.Claims; using Volo.Abp.AspNetCore.Tracing; using Volo.Abp.AspNetCore.Uow; @@ -82,5 +83,10 @@ namespace Microsoft.AspNetCore.Builder { return app.UseMiddleware(); } + + public static void UseAbpSecurityHeaders(this IApplicationBuilder app) + { + app.UseMiddleware(); + } } } diff --git a/framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj b/framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj index b191872339..eaa053c91a 100644 --- a/framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj +++ b/framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj @@ -25,6 +25,7 @@ + diff --git a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Security/AbpSecurityHeadersMiddleware.cs b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Security/AbpSecurityHeadersMiddleware.cs new file mode 100644 index 0000000000..09dddfabe7 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Security/AbpSecurityHeadersMiddleware.cs @@ -0,0 +1,37 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; + +namespace Volo.Abp.AspNetCore.Security +{ + public class AbpSecurityHeadersMiddleware + { + private readonly RequestDelegate _next; + + public AbpSecurityHeadersMiddleware(RequestDelegate next) + { + _next = next; + } + + public async Task Invoke(HttpContext httpContext) + { + /*X-Content-Type-Options header tells the browser to not try and “guess” what a mimetype of a resource might be, and to just take what mimetype the server has returned as fact.*/ + AddHeaderIfNotExists(httpContext, "X-Content-Type-Options", "nosniff"); + + /*X-XSS-Protection is a feature of Internet Explorer, Chrome and Safari that stops pages from loading when they detect reflected cross-site scripting (XSS) attacks*/ + AddHeaderIfNotExists(httpContext, "X-XSS-Protection", "1; mode=block"); + + /*The X-Frame-Options HTTP response header can be used to indicate whether or not a browser should be allowed to render a page in a ,