From b151c0f50daf527decb154345d8cf076366e8eec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 25 May 2020 19:53:38 +0300 Subject: [PATCH 01/27] Created initial Volo.Abp.BlobStoring package --- framework/Volo.Abp.sln | 7 ++ .../src/Volo.Abp.BlobStoring/FodyWeavers.xml | 3 + .../src/Volo.Abp.BlobStoring/FodyWeavers.xsd | 30 +++++++ .../Volo.Abp.BlobStoring.csproj | 21 +++++ .../Abp/BlobStoring/AbpBlobStoringModule.cs | 9 ++ .../Volo/Abp/BlobStoring/IBlobManager.cs | 87 +++++++++++++++++++ 6 files changed, 157 insertions(+) create mode 100644 framework/src/Volo.Abp.BlobStoring/FodyWeavers.xml create mode 100644 framework/src/Volo.Abp.BlobStoring/FodyWeavers.xsd create mode 100644 framework/src/Volo.Abp.BlobStoring/Volo.Abp.BlobStoring.csproj create mode 100644 framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringModule.cs create mode 100644 framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobManager.cs diff --git a/framework/Volo.Abp.sln b/framework/Volo.Abp.sln index 8e8dac2ce5..012ec976b6 100644 --- a/framework/Volo.Abp.sln +++ b/framework/Volo.Abp.sln @@ -291,6 +291,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.AspNetCore.SignalR EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Tests", "test\Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Tests\Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Tests.csproj", "{79323211-E658-493E-9863-035AA4C3F913}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.BlobStoring", "src\Volo.Abp.BlobStoring\Volo.Abp.BlobStoring.csproj", "{A0CFBDD6-A3CB-438C-83F1-5025F12E2D42}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -865,6 +867,10 @@ Global {79323211-E658-493E-9863-035AA4C3F913}.Debug|Any CPU.Build.0 = Debug|Any CPU {79323211-E658-493E-9863-035AA4C3F913}.Release|Any CPU.ActiveCfg = Release|Any CPU {79323211-E658-493E-9863-035AA4C3F913}.Release|Any CPU.Build.0 = Release|Any CPU + {A0CFBDD6-A3CB-438C-83F1-5025F12E2D42}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A0CFBDD6-A3CB-438C-83F1-5025F12E2D42}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A0CFBDD6-A3CB-438C-83F1-5025F12E2D42}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A0CFBDD6-A3CB-438C-83F1-5025F12E2D42}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1012,6 +1018,7 @@ Global {B64FCE08-E9D2-4984-BF12-FE199F257416} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {8B758716-DCC9-4223-8421-5588D1597487} = {447C8A77-E5F0-4538-8687-7383196D04EA} {79323211-E658-493E-9863-035AA4C3F913} = {447C8A77-E5F0-4538-8687-7383196D04EA} + {A0CFBDD6-A3CB-438C-83F1-5025F12E2D42} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5} diff --git a/framework/src/Volo.Abp.BlobStoring/FodyWeavers.xml b/framework/src/Volo.Abp.BlobStoring/FodyWeavers.xml new file mode 100644 index 0000000000..be0de3a908 --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring/FodyWeavers.xsd b/framework/src/Volo.Abp.BlobStoring/FodyWeavers.xsd new file mode 100644 index 0000000000..3f3946e282 --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring/Volo.Abp.BlobStoring.csproj b/framework/src/Volo.Abp.BlobStoring/Volo.Abp.BlobStoring.csproj new file mode 100644 index 0000000000..cbf13cea87 --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring/Volo.Abp.BlobStoring.csproj @@ -0,0 +1,21 @@ + + + + + + + netstandard2.0 + Volo.Abp.BlobStoring + Volo.Abp.BlobStoring + $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; + false + false + false + + + + + + + + diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringModule.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringModule.cs new file mode 100644 index 0000000000..d828c8434d --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringModule.cs @@ -0,0 +1,9 @@ +using Volo.Abp.Modularity; + +namespace Volo.Abp.BlobStoring +{ + public class AbpBlobStoringModule : AbpModule + { + + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobManager.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobManager.cs new file mode 100644 index 0000000000..26d3457cca --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobManager.cs @@ -0,0 +1,87 @@ +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace Volo.Abp.BlobStoring +{ + public interface IBlobContainer + { + /// + /// Saves a blob to the container. + /// + /// The name of the blob + /// A stream for the blob + /// + /// Set true to override if there is already a blob in the container with the given name. + /// If set to false (default), throws exception if there is already a blob in the container with the given name. + /// + /// Cancellation token + Task SaveAsync( + string name, + Stream stream, + bool overrideExisting = false, + CancellationToken cancellationToken = default + ); + + /// + /// Deletes a blob from the container. + /// + /// The name of the blob + /// Cancellation token + /// + /// Returns true if actually deleted the blob. + /// Returns false if the blob with the given was not exists. + /// + Task DeleteAsync( + string name, + CancellationToken cancellationToken = default + ); + + /// + /// Checks if a blob does exists in the container. + /// + /// The name of the blob + /// Cancellation token + Task ExistsAsync( + string name, + CancellationToken cancellationToken = default + ); + + /// + /// Gets a blob from the container. + /// It actually gets a to read the blob data. + /// It throws exception if there is no blob with the given . + /// Use if you want to get null if there is no blob with the given . + /// + /// The name of the blob + /// Cancellation token + /// + /// A to read the blob data. + /// + Task GetAsync( + string name, + CancellationToken cancellationToken = default + ); + + /// + /// Gets a blob from the container, or returns null if there is no blob with the given . + /// It actually gets a to read the blob data. + /// + /// The name of the blob + /// Cancellation token + /// + /// A to read the blob data. + /// + Task GetOrNullAsync( + string name, + CancellationToken cancellationToken = default + ); + + //TODO: Create shortcut extension methods: GetAsArraryAsync, GetAsStringAsync(encoding) (and null versions) + } + + public interface IBlobContainerManager + { + //Get (or create), Delete (if does exists) + } +} \ No newline at end of file From c73cd6962daf8c3503f02345ce85a3d91c0e0baf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 25 May 2020 21:55:11 +0300 Subject: [PATCH 02/27] Created basic interfaces for the storage. --- framework/Volo.Abp.sln | 7 +++ .../BlobContainerManagerExtensions.cs | 48 +++++++++++++++++++ .../BlobStoring/BlobContainerNameAttribute.cs | 41 ++++++++++++++++ .../Abp/BlobStoring/IBlobContainerManager.cs | 35 ++++++++++++++ .../Volo/Abp/BlobStoring/IBlobManager.cs | 5 -- .../Volo.Abp.BlobStoring.Tests.csproj | 16 +++++++ .../Abp/BlobStoring/AbpBlobStoringTestBase.cs | 9 ++++ .../BlobStoring/AbpBlobStoringTestModule.cs | 13 +++++ .../BlobContainerNameAttribute_Tests.cs | 35 ++++++++++++++ 9 files changed, 204 insertions(+), 5 deletions(-) create mode 100644 framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerManagerExtensions.cs create mode 100644 framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerNameAttribute.cs create mode 100644 framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobContainerManager.cs create mode 100644 framework/test/Volo.Abp.BlobStoring.Tests/Volo.Abp.BlobStoring.Tests.csproj create mode 100644 framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringTestBase.cs create mode 100644 framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringTestModule.cs create mode 100644 framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainerNameAttribute_Tests.cs diff --git a/framework/Volo.Abp.sln b/framework/Volo.Abp.sln index 012ec976b6..7c3df0ccfd 100644 --- a/framework/Volo.Abp.sln +++ b/framework/Volo.Abp.sln @@ -293,6 +293,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.AspNetCore.Mvc.UI. EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.BlobStoring", "src\Volo.Abp.BlobStoring\Volo.Abp.BlobStoring.csproj", "{A0CFBDD6-A3CB-438C-83F1-5025F12E2D42}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.BlobStoring.Tests", "test\Volo.Abp.BlobStoring.Tests\Volo.Abp.BlobStoring.Tests.csproj", "{D53A17BB-4E23-451D-AD9B-E1F6AC3F7958}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -871,6 +873,10 @@ Global {A0CFBDD6-A3CB-438C-83F1-5025F12E2D42}.Debug|Any CPU.Build.0 = Debug|Any CPU {A0CFBDD6-A3CB-438C-83F1-5025F12E2D42}.Release|Any CPU.ActiveCfg = Release|Any CPU {A0CFBDD6-A3CB-438C-83F1-5025F12E2D42}.Release|Any CPU.Build.0 = Release|Any CPU + {D53A17BB-4E23-451D-AD9B-E1F6AC3F7958}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D53A17BB-4E23-451D-AD9B-E1F6AC3F7958}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D53A17BB-4E23-451D-AD9B-E1F6AC3F7958}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D53A17BB-4E23-451D-AD9B-E1F6AC3F7958}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1019,6 +1025,7 @@ Global {8B758716-DCC9-4223-8421-5588D1597487} = {447C8A77-E5F0-4538-8687-7383196D04EA} {79323211-E658-493E-9863-035AA4C3F913} = {447C8A77-E5F0-4538-8687-7383196D04EA} {A0CFBDD6-A3CB-438C-83F1-5025F12E2D42} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} + {D53A17BB-4E23-451D-AD9B-E1F6AC3F7958} = {447C8A77-E5F0-4538-8687-7383196D04EA} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5} diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerManagerExtensions.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerManagerExtensions.cs new file mode 100644 index 0000000000..196d52ab25 --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerManagerExtensions.cs @@ -0,0 +1,48 @@ +using System.Threading; +using System.Threading.Tasks; + +namespace Volo.Abp.BlobStoring +{ + public static class BlobContainerManagerExtensions + { + /// + /// Gets a named container. + /// + /// The blob container manager + /// Cancellation token + /// + /// The container object. + /// + public static Task GetAsync( + this IBlobContainerManager blobContainerManager, + CancellationToken cancellationToken = default + ) + { + return blobContainerManager.GetAsync( + BlobContainerNameAttribute.GetContainerName(), + cancellationToken + ); + } + + /// + /// + /// + /// The blob container manager + /// Cancellation token + /// Type of the container + /// + /// Returns true if actually deleted the container. + /// Returns false if the container with the given type was not exists. + /// + public static Task DeleteAsync( + this IBlobContainerManager blobContainerManager, + CancellationToken cancellationToken = default + ) + { + return blobContainerManager.DeleteAsync( + BlobContainerNameAttribute.GetContainerName(), + cancellationToken + ); + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerNameAttribute.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerNameAttribute.cs new file mode 100644 index 0000000000..12bd91d669 --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerNameAttribute.cs @@ -0,0 +1,41 @@ +using System; +using System.Reflection; +using JetBrains.Annotations; + +namespace Volo.Abp.BlobStoring +{ + public class BlobContainerNameAttribute : Attribute + { + [NotNull] + public string Name { get; } + + public BlobContainerNameAttribute([NotNull] string name) + { + Check.NotNullOrWhiteSpace(name, nameof(name)); + + Name = name; + } + + public virtual string GetName(Type type) + { + return Name; + } + + public static string GetContainerName() + { + return GetContainerName(typeof(T)); + } + + public static string GetContainerName(Type type) + { + var nameAttribute = type.GetCustomAttribute(); + + if (nameAttribute == null) + { + return type.FullName; + } + + return nameAttribute.GetName(type); + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobContainerManager.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobContainerManager.cs new file mode 100644 index 0000000000..234d687d6c --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobContainerManager.cs @@ -0,0 +1,35 @@ +using System.Threading; +using System.Threading.Tasks; + +namespace Volo.Abp.BlobStoring +{ + public interface IBlobContainerManager + { + /// + /// Gets a named container. + /// + /// The name of the container + /// Cancellation token + /// + /// The container object. + /// + Task GetAsync( + string name, + CancellationToken cancellationToken = default + ); + + /// + /// Deletes a container. + /// + /// The name of the container + /// Cancellation token + /// + /// Returns true if actually deleted the container. + /// Returns false if the container with the given was not exists. + /// + Task DeleteAsync( + string name, + CancellationToken cancellationToken = default + ); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobManager.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobManager.cs index 26d3457cca..384b818110 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobManager.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobManager.cs @@ -79,9 +79,4 @@ namespace Volo.Abp.BlobStoring //TODO: Create shortcut extension methods: GetAsArraryAsync, GetAsStringAsync(encoding) (and null versions) } - - public interface IBlobContainerManager - { - //Get (or create), Delete (if does exists) - } } \ No newline at end of file diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo.Abp.BlobStoring.Tests.csproj b/framework/test/Volo.Abp.BlobStoring.Tests/Volo.Abp.BlobStoring.Tests.csproj new file mode 100644 index 0000000000..d1776263a2 --- /dev/null +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo.Abp.BlobStoring.Tests.csproj @@ -0,0 +1,16 @@ + + + + + + netcoreapp3.1 + + + + + + + + + + diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringTestBase.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringTestBase.cs new file mode 100644 index 0000000000..7027cb8147 --- /dev/null +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringTestBase.cs @@ -0,0 +1,9 @@ +using Volo.Abp.Testing; + +namespace Volo.Abp.BlobStoring +{ + public abstract class AbpBlobStoringTestBase : AbpIntegratedTest + { + + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringTestModule.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringTestModule.cs new file mode 100644 index 0000000000..63a0c5deb5 --- /dev/null +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringTestModule.cs @@ -0,0 +1,13 @@ +using Volo.Abp.Modularity; + +namespace Volo.Abp.BlobStoring +{ + [DependsOn( + typeof(AbpBlobStoringModule), + typeof(AbpTestBaseModule) + )] + public class AbpBlobStoringTestModule : AbpModule + { + + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainerNameAttribute_Tests.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainerNameAttribute_Tests.cs new file mode 100644 index 0000000000..a482e7811b --- /dev/null +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainerNameAttribute_Tests.cs @@ -0,0 +1,35 @@ +using Shouldly; +using Xunit; + +namespace Volo.Abp.BlobStoring +{ + public class BlobContainerNameAttribute_Tests + { + [Fact] + public void Should_Get_Specified_Name() + { + BlobContainerNameAttribute + .GetContainerName() + .ShouldBe("ContName2"); + } + + [Fact] + public void Should_Get_Full_Class_Name_If_Not_Specified() + { + BlobContainerNameAttribute + .GetContainerName() + .ShouldBe(typeof(MyContainerType1).FullName); + } + + private class MyContainerType1 + { + + } + + [BlobContainerName("ContName2")] + private class MyContainerType2 + { + + } + } +} \ No newline at end of file From 02246ea15aac01306704d0a064e6b82f08943249 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 25 May 2020 22:08:42 +0300 Subject: [PATCH 03/27] Create TypedBlobContainerWrapper. --- .../Abp/BlobStoring/AbpBlobStoringModule.cs | 11 ++++- .../BlobContainerManagerExtensions.cs | 30 ++----------- .../{IBlobManager.cs => IBlobContainer.cs} | 6 +++ .../Abp/BlobStoring/IBlobContainerFactory.cs | 20 +++++++++ .../Abp/BlobStoring/IBlobContainerManager.cs | 35 ---------------- .../BlobStoring/TypedBlobContainerWrapper.cs | 42 +++++++++++++++++++ 6 files changed, 81 insertions(+), 63 deletions(-) rename framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/{IBlobManager.cs => IBlobContainer.cs} (96%) create mode 100644 framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobContainerFactory.cs delete mode 100644 framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobContainerManager.cs create mode 100644 framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/TypedBlobContainerWrapper.cs diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringModule.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringModule.cs index d828c8434d..51b000f30c 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringModule.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringModule.cs @@ -1,9 +1,16 @@ -using Volo.Abp.Modularity; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Modularity; namespace Volo.Abp.BlobStoring { public class AbpBlobStoringModule : AbpModule { - + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddTransient( + typeof(IBlobContainer<>), + typeof(TypedBlobContainerWrapper<>) + ); + } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerManagerExtensions.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerManagerExtensions.cs index 196d52ab25..e397784344 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerManagerExtensions.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerManagerExtensions.cs @@ -1,5 +1,4 @@ using System.Threading; -using System.Threading.Tasks; namespace Volo.Abp.BlobStoring { @@ -8,38 +7,17 @@ namespace Volo.Abp.BlobStoring /// /// Gets a named container. /// - /// The blob container manager + /// The blob container manager /// Cancellation token /// /// The container object. /// - public static Task GetAsync( - this IBlobContainerManager blobContainerManager, + public static IBlobContainer Get( + this IBlobContainerFactory blobContainerFactory, CancellationToken cancellationToken = default ) { - return blobContainerManager.GetAsync( - BlobContainerNameAttribute.GetContainerName(), - cancellationToken - ); - } - - /// - /// - /// - /// The blob container manager - /// Cancellation token - /// Type of the container - /// - /// Returns true if actually deleted the container. - /// Returns false if the container with the given type was not exists. - /// - public static Task DeleteAsync( - this IBlobContainerManager blobContainerManager, - CancellationToken cancellationToken = default - ) - { - return blobContainerManager.DeleteAsync( + return blobContainerFactory.Get( BlobContainerNameAttribute.GetContainerName(), cancellationToken ); diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobManager.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobContainer.cs similarity index 96% rename from framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobManager.cs rename to framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobContainer.cs index 384b818110..a596565b5f 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobManager.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobContainer.cs @@ -4,6 +4,12 @@ using System.Threading.Tasks; namespace Volo.Abp.BlobStoring { + public interface IBlobContainer : IBlobContainer + where TContainer: class + { + + } + public interface IBlobContainer { /// diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobContainerFactory.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobContainerFactory.cs new file mode 100644 index 0000000000..856268b1bb --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobContainerFactory.cs @@ -0,0 +1,20 @@ +using System.Threading; + +namespace Volo.Abp.BlobStoring +{ + public interface IBlobContainerFactory + { + /// + /// Gets a named container. + /// + /// The name of the container + /// Cancellation token + /// + /// The container object. + /// + IBlobContainer Get( + string name, + CancellationToken cancellationToken = default + ); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobContainerManager.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobContainerManager.cs deleted file mode 100644 index 234d687d6c..0000000000 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobContainerManager.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Threading; -using System.Threading.Tasks; - -namespace Volo.Abp.BlobStoring -{ - public interface IBlobContainerManager - { - /// - /// Gets a named container. - /// - /// The name of the container - /// Cancellation token - /// - /// The container object. - /// - Task GetAsync( - string name, - CancellationToken cancellationToken = default - ); - - /// - /// Deletes a container. - /// - /// The name of the container - /// Cancellation token - /// - /// Returns true if actually deleted the container. - /// Returns false if the container with the given was not exists. - /// - Task DeleteAsync( - string name, - CancellationToken cancellationToken = default - ); - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/TypedBlobContainerWrapper.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/TypedBlobContainerWrapper.cs new file mode 100644 index 0000000000..a4f36c64a2 --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/TypedBlobContainerWrapper.cs @@ -0,0 +1,42 @@ +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace Volo.Abp.BlobStoring +{ + public class TypedBlobContainerWrapper : IBlobContainer + where TContainer: class + { + private readonly IBlobContainer _container; + + public TypedBlobContainerWrapper(IBlobContainerFactory blobContainerFactory) + { + _container = blobContainerFactory.Get(); + } + + public Task SaveAsync(string name, Stream stream, bool overrideExisting = false, CancellationToken cancellationToken = default) + { + return _container.SaveAsync(name, stream, overrideExisting, cancellationToken); + } + + public Task DeleteAsync(string name, CancellationToken cancellationToken = default) + { + return _container.DeleteAsync(name, cancellationToken); + } + + public Task ExistsAsync(string name, CancellationToken cancellationToken = default) + { + return _container.ExistsAsync(name, cancellationToken); + } + + public Task GetAsync(string name, CancellationToken cancellationToken = default) + { + return _container.GetAsync(name, cancellationToken); + } + + public Task GetOrNullAsync(string name, CancellationToken cancellationToken = default) + { + return _container.GetOrNullAsync(name, cancellationToken); + } + } +} \ No newline at end of file From 3821dbafa847bc4ab8d73f88c08fc9aad95ab58d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 25 May 2020 22:14:41 +0300 Subject: [PATCH 04/27] Rename Get to Create --- .../Volo/Abp/BlobStoring/BlobContainerManagerExtensions.cs | 4 ++-- .../Volo/Abp/BlobStoring/IBlobContainerFactory.cs | 2 +- .../Volo/Abp/BlobStoring/TypedBlobContainerWrapper.cs | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerManagerExtensions.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerManagerExtensions.cs index e397784344..1db2e2b10a 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerManagerExtensions.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerManagerExtensions.cs @@ -12,12 +12,12 @@ namespace Volo.Abp.BlobStoring /// /// The container object. /// - public static IBlobContainer Get( + public static IBlobContainer Create( this IBlobContainerFactory blobContainerFactory, CancellationToken cancellationToken = default ) { - return blobContainerFactory.Get( + return blobContainerFactory.Create( BlobContainerNameAttribute.GetContainerName(), cancellationToken ); diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobContainerFactory.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobContainerFactory.cs index 856268b1bb..8434e3ae23 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobContainerFactory.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobContainerFactory.cs @@ -12,7 +12,7 @@ namespace Volo.Abp.BlobStoring /// /// The container object. /// - IBlobContainer Get( + IBlobContainer Create( string name, CancellationToken cancellationToken = default ); diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/TypedBlobContainerWrapper.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/TypedBlobContainerWrapper.cs index a4f36c64a2..34d11bb46f 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/TypedBlobContainerWrapper.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/TypedBlobContainerWrapper.cs @@ -11,7 +11,7 @@ namespace Volo.Abp.BlobStoring public TypedBlobContainerWrapper(IBlobContainerFactory blobContainerFactory) { - _container = blobContainerFactory.Get(); + _container = blobContainerFactory.Create(); } public Task SaveAsync(string name, Stream stream, bool overrideExisting = false, CancellationToken cancellationToken = default) From 1f41cd5671b2c142a266b30e7bf56d7e4da8aea4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 25 May 2020 22:32:19 +0300 Subject: [PATCH 05/27] Introduce AbpBlobStoringOptions --- .../Abp/BlobStoring/AbpBlobStoringOptions.cs | 12 ++++++++ .../BlobStoring/BlobContainerConfiguration.cs | 9 ++++++ .../BlobContainerConfigurationDictionary.cs | 22 ++++++++++++++ .../AbpBlobStoringOptions_Tests.cs | 29 +++++++++++++++++++ .../BlobStoring/AbpBlobStoringTestModule.cs | 16 +++++++++- .../Volo/Abp/BlobStoring/TestContainer1.cs | 12 ++++++++ 6 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringOptions.cs create mode 100644 framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfiguration.cs create mode 100644 framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurationDictionary.cs create mode 100644 framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringOptions_Tests.cs create mode 100644 framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestContainer1.cs diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringOptions.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringOptions.cs new file mode 100644 index 0000000000..5c8fbe4666 --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringOptions.cs @@ -0,0 +1,12 @@ +namespace Volo.Abp.BlobStoring +{ + public class AbpBlobStoringOptions + { + public BlobContainerConfigurationDictionary Containers { get; set; } + + public AbpBlobStoringOptions() + { + Containers = new BlobContainerConfigurationDictionary(); + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfiguration.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfiguration.cs new file mode 100644 index 0000000000..096e5f9a67 --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfiguration.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace Volo.Abp.BlobStoring +{ + public class BlobContainerConfiguration : Dictionary + { + + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurationDictionary.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurationDictionary.cs new file mode 100644 index 0000000000..4ea2d2ba6e --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurationDictionary.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; + +namespace Volo.Abp.BlobStoring +{ + public class BlobContainerConfigurationDictionary : Dictionary + { + public BlobContainerConfigurationDictionary Configure(Action configureAction) + { + return Configure( + BlobContainerNameAttribute.GetContainerName(), + configureAction + ); + } + + public BlobContainerConfigurationDictionary Configure(string name, Action configureAction) + { + configureAction(this.GetOrAdd(name, () => new BlobContainerConfiguration())); + return this; + } + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringOptions_Tests.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringOptions_Tests.cs new file mode 100644 index 0000000000..250ec0b737 --- /dev/null +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringOptions_Tests.cs @@ -0,0 +1,29 @@ +using System.Collections.Generic; +using Microsoft.Extensions.Options; +using Shouldly; +using Xunit; + +namespace Volo.Abp.BlobStoring +{ + public class AbpBlobStoringOptions_Tests : AbpBlobStoringTestBase + { + private readonly AbpBlobStoringOptions _options; + + public AbpBlobStoringOptions_Tests() + { + _options = GetRequiredService>().Value; + } + + [Fact] + public void Should_Property_Set_And_Get_Options_For_Different_Containers() + { + var testContainer1Config = _options.Containers + .GetOrDefault(BlobContainerNameAttribute.GetContainerName()); + testContainer1Config.ShouldContainKeyAndValue("TestConfig1", "TestValue1"); + + var testContainer2Config = _options.Containers + .GetOrDefault(BlobContainerNameAttribute.GetContainerName()); + testContainer2Config.ShouldContainKeyAndValue("TestConfig2", "TestValue2"); + } + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringTestModule.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringTestModule.cs index 63a0c5deb5..429349d28f 100644 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringTestModule.cs +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringTestModule.cs @@ -8,6 +8,20 @@ namespace Volo.Abp.BlobStoring )] public class AbpBlobStoringTestModule : AbpModule { - + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.Containers + .Configure(container => + { + container["TestConfig1"] = "TestValue1"; + }) + .Configure(container => + { + container["TestConfig2"] = "TestValue2"; + }); + }); + } } } \ No newline at end of file diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestContainer1.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestContainer1.cs new file mode 100644 index 0000000000..1c11f61d50 --- /dev/null +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestContainer1.cs @@ -0,0 +1,12 @@ +namespace Volo.Abp.BlobStoring +{ + public class TestContainer1 + { + + } + + public class TestContainer2 + { + + } +} \ No newline at end of file From f5caaaaa85bdf412352d63c600551541cce0cda5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 26 May 2020 06:11:13 +0300 Subject: [PATCH 06/27] Implemented basic BlobContainerFactory. --- .../BlobStoring/BlobContainerConfiguration.cs | 12 ++- .../BlobContainerConfigurationDictionary.cs | 36 ++++++- .../Abp/BlobStoring/BlobContainerFactory.cs | 58 +++++++++++ .../BlobContainerToProviderAdapter.cs | 99 +++++++++++++++++++ .../BlobStoring/Providers/BlobProviderArgs.cs | 31 ++++++ .../Providers/BlobProviderDeleteArgs.cs | 21 ++++ .../Providers/BlobProviderExistsArgs.cs | 21 ++++ .../Providers/BlobProviderGetArgs.cs | 21 ++++ .../Providers/BlobProviderSaveArgs.cs | 41 ++++++++ .../BlobStoring/Providers/IBlobProvider.cs | 18 ++++ .../Volo/Abp/DynamicProxy/ProxyHelper.cs | 9 +- .../Volo.Abp.BlobStoring.Tests.csproj | 1 + .../AbpBlobStoringOptions_Tests.cs | 5 +- .../Abp/BlobStoring/AbpBlobStoringTestBase.cs | 5 +- .../BlobStoring/AbpBlobStoringTestModule.cs | 21 +++- .../BlobStoring/BlobContainerFactory_Tests.cs | 78 +++++++++++++++ .../BlobContainerNameAttribute_Tests.cs | 20 +--- .../BlobStoring/Fakes/FakeBlobProvider1.cs | 34 +++++++ .../BlobStoring/Fakes/FakeBlobProvider2.cs | 34 +++++++ .../Abp/BlobStoring/Fakes/FakeProviders.cs | 20 ++++ .../Volo/Abp/BlobStoring/TestContainer1.cs | 12 --- .../BlobStoring/TestObjects/TestContainer1.cs | 7 ++ .../BlobStoring/TestObjects/TestContainer2.cs | 8 ++ .../BlobStoring/TestObjects/TestContainer3.cs | 7 ++ 24 files changed, 581 insertions(+), 38 deletions(-) create mode 100644 framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs create mode 100644 framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobContainerToProviderAdapter.cs create mode 100644 framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderArgs.cs create mode 100644 framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderDeleteArgs.cs create mode 100644 framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderExistsArgs.cs create mode 100644 framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderGetArgs.cs create mode 100644 framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderSaveArgs.cs create mode 100644 framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/IBlobProvider.cs create mode 100644 framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainerFactory_Tests.cs create mode 100644 framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Fakes/FakeBlobProvider1.cs create mode 100644 framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Fakes/FakeBlobProvider2.cs create mode 100644 framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Fakes/FakeProviders.cs delete mode 100644 framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestContainer1.cs create mode 100644 framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestObjects/TestContainer1.cs create mode 100644 framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestObjects/TestContainer2.cs create mode 100644 framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestObjects/TestContainer3.cs diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfiguration.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfiguration.cs index 096e5f9a67..3974fe4d98 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfiguration.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfiguration.cs @@ -1,9 +1,19 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using JetBrains.Annotations; namespace Volo.Abp.BlobStoring { public class BlobContainerConfiguration : Dictionary { + [NotNull] + public string Name { get; } + public Type ProviderType { get; set; } + + public BlobContainerConfiguration([NotNull] string name) + { + Name = Check.NotNullOrWhiteSpace(name, nameof(name)); + } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurationDictionary.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurationDictionary.cs index 4ea2d2ba6e..391d0c51a1 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurationDictionary.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurationDictionary.cs @@ -1,22 +1,50 @@ using System; using System.Collections.Generic; +using System.IO; +using JetBrains.Annotations; namespace Volo.Abp.BlobStoring { public class BlobContainerConfigurationDictionary : Dictionary { - public BlobContainerConfigurationDictionary Configure(Action configureAction) + public BlobContainerConfiguration Default { get; } + + public BlobContainerConfigurationDictionary() + { + Default = new BlobContainerConfiguration("_default"); + } + + public BlobContainerConfigurationDictionary Configure( + Action configureAction) { return Configure( BlobContainerNameAttribute.GetContainerName(), configureAction ); } - - public BlobContainerConfigurationDictionary Configure(string name, Action configureAction) + + public BlobContainerConfigurationDictionary Configure( + [NotNull] string name, + [NotNull] Action configureAction) + { + Check.NotNullOrWhiteSpace(name, nameof(name)); + Check.NotNull(configureAction, nameof(configureAction)); + + configureAction(this.GetOrAdd(name, () => new BlobContainerConfiguration(name))); + + return this; + } + + public BlobContainerConfigurationDictionary ConfigureDefault(Action configureAction) { - configureAction(this.GetOrAdd(name, () => new BlobContainerConfiguration())); + configureAction(Default); return this; } + + public BlobContainerConfiguration GetOrDefaultConfiguration(string name) + { + return AbpDictionaryExtensions.GetOrDefault(this, name) ?? + Default; + } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs new file mode 100644 index 0000000000..731012a3b2 --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using JetBrains.Annotations; +using Microsoft.Extensions.Options; +using Volo.Abp.BlobStoring.Providers; +using Volo.Abp.DependencyInjection; +using Volo.Abp.DynamicProxy; + +namespace Volo.Abp.BlobStoring +{ + public class BlobContainerFactory : IBlobContainerFactory, ITransientDependency + { + public IEnumerable BlobProviders { get; } + + protected AbpBlobStoringOptions Options { get; } + + public BlobContainerFactory( + IOptions options, + IEnumerable blobProviders) + { + BlobProviders = blobProviders; + Options = options.Value; + } + + public virtual IBlobContainer Create(string name, CancellationToken cancellationToken = default) + { + var configuration = Options.Containers.GetOrDefaultConfiguration(name); + return new BlobContainerToProviderAdapter( + name, + configuration, + GetProvider(configuration) + ); + } + + [NotNull] + protected virtual IBlobProvider GetProvider(BlobContainerConfiguration configuration) + { + if (!BlobProviders.Any()) + { + throw new AbpException("No BLOB Storage provider was registered! At least one provider must be registered to be able to use the Blog Storing System."); + } + + foreach (var provider in BlobProviders) + { + if (ProxyHelper.GetUnProxiedType(provider).IsAssignableTo(configuration.ProviderType)) + { + return provider; + } + } + + throw new AbpException( + $"Could not find the BLOB Storage provider with the type ({configuration.ProviderType.AssemblyQualifiedName}) configured for the container {configuration.Name}" + ); + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobContainerToProviderAdapter.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobContainerToProviderAdapter.cs new file mode 100644 index 0000000000..c4aa6e9c6f --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobContainerToProviderAdapter.cs @@ -0,0 +1,99 @@ +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace Volo.Abp.BlobStoring.Providers +{ + public class BlobContainerToProviderAdapter : IBlobContainer + { + protected string ContainerName { get; } + + protected BlobContainerConfiguration ContainerConfiguration { get; } + + protected IBlobProvider Provider { get; } + + public BlobContainerToProviderAdapter( + string containerName, + BlobContainerConfiguration containerConfiguration, + IBlobProvider provider) + { + ContainerName = containerName; + ContainerConfiguration = containerConfiguration; + Provider = provider; + } + + public virtual Task SaveAsync( + string name, + Stream stream, + bool overrideExisting = false, + CancellationToken cancellationToken = default) + { + return Provider.SaveAsync( + new BlobProviderSaveArgs( + ContainerName, + ContainerConfiguration, + name, + stream, + overrideExisting, + cancellationToken + ) + ); + } + + public virtual Task DeleteAsync( + string name, + CancellationToken cancellationToken = default) + { + return Provider.DeleteAsync( + new BlobProviderDeleteArgs( + ContainerName, + ContainerConfiguration, + name, + cancellationToken + ) + ); + } + + public virtual Task ExistsAsync( + string name, + CancellationToken cancellationToken = default) + { + return Provider.ExistsAsync( + new BlobProviderExistsArgs( + ContainerName, + ContainerConfiguration, + name, + cancellationToken + ) + ); + } + + public virtual Task GetAsync( + string name, + CancellationToken cancellationToken = default) + { + return Provider.GetAsync( + new BlobProviderGetArgs( + ContainerName, + ContainerConfiguration, + name, + cancellationToken + ) + ); + } + + public virtual Task GetOrNullAsync( + string name, + CancellationToken cancellationToken = default) + { + return Provider.GetOrNullAsync( + new BlobProviderGetArgs( + ContainerName, + ContainerConfiguration, + name, + cancellationToken + ) + ); + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderArgs.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderArgs.cs new file mode 100644 index 0000000000..dc7029f3a2 --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderArgs.cs @@ -0,0 +1,31 @@ +using System.Threading; +using JetBrains.Annotations; + +namespace Volo.Abp.BlobStoring.Providers +{ + public abstract class BlobProviderArgs + { + [NotNull] + public string ContainerName { get; } + + [NotNull] + public BlobContainerConfiguration Configuration { get; } + + [NotNull] + public string BlobName { get; } + + public CancellationToken CancellationToken { get; } + + protected BlobProviderArgs( + [NotNull] string containerName, + [NotNull] BlobContainerConfiguration configuration, + [NotNull] string blobName, + CancellationToken cancellationToken = default) + { + ContainerName = Check.NotNullOrWhiteSpace(containerName, nameof(containerName)); + Configuration = Check.NotNull(configuration, nameof(configuration)); + BlobName = Check.NotNullOrWhiteSpace(blobName, nameof(blobName)); + CancellationToken = cancellationToken; + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderDeleteArgs.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderDeleteArgs.cs new file mode 100644 index 0000000000..e7545a0241 --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderDeleteArgs.cs @@ -0,0 +1,21 @@ +using System.Threading; +using JetBrains.Annotations; + +namespace Volo.Abp.BlobStoring.Providers +{ + public class BlobProviderDeleteArgs : BlobProviderArgs + { + public BlobProviderDeleteArgs( + [NotNull] string containerName, + [NotNull] BlobContainerConfiguration configuration, + [NotNull] string blobName, + CancellationToken cancellationToken = default) + : base( + containerName, + configuration, + blobName, + cancellationToken) + { + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderExistsArgs.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderExistsArgs.cs new file mode 100644 index 0000000000..686c438d08 --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderExistsArgs.cs @@ -0,0 +1,21 @@ +using System.Threading; +using JetBrains.Annotations; + +namespace Volo.Abp.BlobStoring.Providers +{ + public class BlobProviderExistsArgs : BlobProviderArgs + { + public BlobProviderExistsArgs( + [NotNull] string containerName, + [NotNull] BlobContainerConfiguration configuration, + [NotNull] string blobName, + CancellationToken cancellationToken = default) + : base( + containerName, + configuration, + blobName, + cancellationToken) + { + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderGetArgs.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderGetArgs.cs new file mode 100644 index 0000000000..949cc1053c --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderGetArgs.cs @@ -0,0 +1,21 @@ +using System.Threading; +using JetBrains.Annotations; + +namespace Volo.Abp.BlobStoring.Providers +{ + public class BlobProviderGetArgs : BlobProviderArgs + { + public BlobProviderGetArgs( + [NotNull] string containerName, + [NotNull] BlobContainerConfiguration configuration, + [NotNull] string blobName, + CancellationToken cancellationToken = default) + : base( + containerName, + configuration, + blobName, + cancellationToken) + { + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderSaveArgs.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderSaveArgs.cs new file mode 100644 index 0000000000..fb482f8e5a --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderSaveArgs.cs @@ -0,0 +1,41 @@ +using System.IO; +using System.Threading; +using JetBrains.Annotations; + +namespace Volo.Abp.BlobStoring.Providers +{ + public class BlobProviderSaveArgs + { + [NotNull] + public string ContainerName { get; } + + [NotNull] + public BlobContainerConfiguration Configuration { get; } + + [NotNull] + public string BlobName { get; } + + [NotNull] + public Stream BlobStream { get; } + + public bool OverrideExisting { get; } + + public CancellationToken CancellationToken { get; } + + public BlobProviderSaveArgs( + [NotNull] string containerName, + [NotNull] BlobContainerConfiguration configuration, + [NotNull] string blobName, + [NotNull] Stream blobStream, + bool overrideExisting = false, + CancellationToken cancellationToken = default) + { + ContainerName = Check.NotNullOrWhiteSpace(containerName, nameof(containerName)); + Configuration = Check.NotNull(configuration, nameof(configuration)); + BlobName = Check.NotNullOrWhiteSpace(blobName, nameof(blobName)); + BlobStream = Check.NotNull(blobStream, nameof(blobStream)); + OverrideExisting = overrideExisting; + CancellationToken = cancellationToken; + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/IBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/IBlobProvider.cs new file mode 100644 index 0000000000..23e67502f0 --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/IBlobProvider.cs @@ -0,0 +1,18 @@ +using System.IO; +using System.Threading.Tasks; + +namespace Volo.Abp.BlobStoring.Providers +{ + public interface IBlobProvider + { + Task SaveAsync(BlobProviderSaveArgs args); + + Task DeleteAsync(BlobProviderDeleteArgs args); + + Task ExistsAsync(BlobProviderExistsArgs args); + + Task GetAsync(BlobProviderGetArgs args); + + Task GetOrNullAsync(BlobProviderGetArgs args); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DynamicProxy/ProxyHelper.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DynamicProxy/ProxyHelper.cs index 96a1915e26..db7ff4b869 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/DynamicProxy/ProxyHelper.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DynamicProxy/ProxyHelper.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System; +using System.Linq; using System.Reflection; namespace Volo.Abp.DynamicProxy @@ -6,6 +7,7 @@ namespace Volo.Abp.DynamicProxy public static class ProxyHelper { private const string ProxyNamespace = "Castle.Proxies"; + /// /// Returns dynamic proxy target object if this is a proxied object, otherwise returns the given object. /// It supports Castle Dynamic Proxies. @@ -28,5 +30,10 @@ namespace Volo.Abp.DynamicProxy return targetField.GetValue(obj); } + + public static Type GetUnProxiedType(object obj) + { + return UnProxy(obj).GetType(); + } } } diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo.Abp.BlobStoring.Tests.csproj b/framework/test/Volo.Abp.BlobStoring.Tests/Volo.Abp.BlobStoring.Tests.csproj index d1776263a2..5ae7e10c44 100644 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo.Abp.BlobStoring.Tests.csproj +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo.Abp.BlobStoring.Tests.csproj @@ -8,6 +8,7 @@ + diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringOptions_Tests.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringOptions_Tests.cs index 250ec0b737..b4cd5e3be1 100644 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringOptions_Tests.cs +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringOptions_Tests.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using Microsoft.Extensions.Options; using Shouldly; +using Volo.Abp.BlobStoring.TestObjects; using Xunit; namespace Volo.Abp.BlobStoring @@ -18,11 +19,11 @@ namespace Volo.Abp.BlobStoring public void Should_Property_Set_And_Get_Options_For_Different_Containers() { var testContainer1Config = _options.Containers - .GetOrDefault(BlobContainerNameAttribute.GetContainerName()); + .GetOrDefaultConfiguration(BlobContainerNameAttribute.GetContainerName()); testContainer1Config.ShouldContainKeyAndValue("TestConfig1", "TestValue1"); var testContainer2Config = _options.Containers - .GetOrDefault(BlobContainerNameAttribute.GetContainerName()); + .GetOrDefaultConfiguration(BlobContainerNameAttribute.GetContainerName()); testContainer2Config.ShouldContainKeyAndValue("TestConfig2", "TestValue2"); } } diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringTestBase.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringTestBase.cs index 7027cb8147..07e34c599f 100644 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringTestBase.cs +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringTestBase.cs @@ -4,6 +4,9 @@ namespace Volo.Abp.BlobStoring { public abstract class AbpBlobStoringTestBase : AbpIntegratedTest { - + protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options) + { + options.UseAutofac(); + } } } \ No newline at end of file diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringTestModule.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringTestModule.cs index 429349d28f..dc29bff71c 100644 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringTestModule.cs +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringTestModule.cs @@ -1,25 +1,42 @@ -using Volo.Abp.Modularity; +using Microsoft.Extensions.DependencyInjection; +using NSubstitute; +using Volo.Abp.Autofac; +using Volo.Abp.BlobStoring.Fakes; +using Volo.Abp.BlobStoring.Providers; +using Volo.Abp.BlobStoring.TestObjects; +using Volo.Abp.Modularity; namespace Volo.Abp.BlobStoring { [DependsOn( typeof(AbpBlobStoringModule), - typeof(AbpTestBaseModule) + typeof(AbpTestBaseModule), + typeof(AbpAutofacModule) )] public class AbpBlobStoringTestModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { + context.Services.AddSingleton(Substitute.For()); + context.Services.AddSingleton(Substitute.For()); + Configure(options => { options.Containers + .ConfigureDefault(container => + { + container["TestConfigDefault"] = "TestValueDefault"; + container.ProviderType = typeof(FakeBlobProvider1); + }) .Configure(container => { container["TestConfig1"] = "TestValue1"; + container.ProviderType = typeof(FakeBlobProvider1); }) .Configure(container => { container["TestConfig2"] = "TestValue2"; + container.ProviderType = typeof(FakeBlobProvider2); }); }); } diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainerFactory_Tests.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainerFactory_Tests.cs new file mode 100644 index 0000000000..ce1bd0eec6 --- /dev/null +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainerFactory_Tests.cs @@ -0,0 +1,78 @@ +using System.Threading.Tasks; +using NSubstitute; +using Shouldly; +using Volo.Abp.BlobStoring.Fakes; +using Volo.Abp.BlobStoring.Providers; +using Volo.Abp.BlobStoring.TestObjects; +using Xunit; + +namespace Volo.Abp.BlobStoring +{ + public class BlobContainerFactory_Tests : AbpBlobStoringTestBase + { + private readonly IBlobContainerFactory _factory; + private readonly FakeProviders _fakeProviders; + + public BlobContainerFactory_Tests() + { + _factory = GetRequiredService(); + _fakeProviders = GetRequiredService(); + } + + [Fact] + public async Task Should_Create_Containers_With_Configured_Providers() + { + // TestContainer1 with FakeBlobProvider1 + + await _fakeProviders.Provider1 + .DidNotReceiveWithAnyArgs() + .ExistsAsync(default); + + await _factory + .Create() + .ExistsAsync("TestBlob1"); + + await _fakeProviders.Provider1 + .Received(1) + .ExistsAsync(Arg.Is(args => + args.ContainerName == BlobContainerNameAttribute.GetContainerName() && + args.BlobName == "TestBlob1" + ) + ); + + // TestContainer2 with FakeBlobProvider2 + + await _fakeProviders.Provider2 + .DidNotReceiveWithAnyArgs() + .ExistsAsync(default); + + await _factory + .Create() + .ExistsAsync("TestBlob2"); + + await _fakeProviders.Provider2 + .Received(1) + .ExistsAsync(Arg.Is(args => + args.ContainerName == BlobContainerNameAttribute.GetContainerName() && + args.BlobName == "TestBlob2" + ) + ); + + // TestContainer3 with FakeBlobProvider1 (default provider) + + _fakeProviders.Provider1.ClearReceivedCalls(); + + await _factory + .Create() + .ExistsAsync("TestBlob3"); + + await _fakeProviders.Provider1 + .Received(1) + .ExistsAsync(Arg.Is(t => + t.ContainerName == BlobContainerNameAttribute.GetContainerName() && + t.BlobName == "TestBlob3" + ) + ); + } + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainerNameAttribute_Tests.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainerNameAttribute_Tests.cs index a482e7811b..242b195a0c 100644 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainerNameAttribute_Tests.cs +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainerNameAttribute_Tests.cs @@ -1,4 +1,5 @@ using Shouldly; +using Volo.Abp.BlobStoring.TestObjects; using Xunit; namespace Volo.Abp.BlobStoring @@ -9,27 +10,16 @@ namespace Volo.Abp.BlobStoring public void Should_Get_Specified_Name() { BlobContainerNameAttribute - .GetContainerName() - .ShouldBe("ContName2"); + .GetContainerName() + .ShouldBe("Test2"); } [Fact] public void Should_Get_Full_Class_Name_If_Not_Specified() { BlobContainerNameAttribute - .GetContainerName() - .ShouldBe(typeof(MyContainerType1).FullName); - } - - private class MyContainerType1 - { - - } - - [BlobContainerName("ContName2")] - private class MyContainerType2 - { - + .GetContainerName() + .ShouldBe(typeof(TestContainer1).FullName); } } } \ No newline at end of file diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Fakes/FakeBlobProvider1.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Fakes/FakeBlobProvider1.cs new file mode 100644 index 0000000000..4eb401e0fb --- /dev/null +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Fakes/FakeBlobProvider1.cs @@ -0,0 +1,34 @@ +using System.IO; +using System.Threading.Tasks; +using Volo.Abp.BlobStoring.Providers; + +namespace Volo.Abp.BlobStoring.Fakes +{ + public class FakeBlobProvider1 : IBlobProvider + { + public virtual Task SaveAsync(BlobProviderSaveArgs args) + { + throw new System.NotImplementedException(); + } + + public virtual Task DeleteAsync(BlobProviderDeleteArgs args) + { + throw new System.NotImplementedException(); + } + + public virtual Task ExistsAsync(BlobProviderExistsArgs args) + { + throw new System.NotImplementedException(); + } + + public virtual Task GetAsync(BlobProviderGetArgs args) + { + throw new System.NotImplementedException(); + } + + public virtual Task GetOrNullAsync(BlobProviderGetArgs args) + { + throw new System.NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Fakes/FakeBlobProvider2.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Fakes/FakeBlobProvider2.cs new file mode 100644 index 0000000000..233bed8d16 --- /dev/null +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Fakes/FakeBlobProvider2.cs @@ -0,0 +1,34 @@ +using System.IO; +using System.Threading.Tasks; +using Volo.Abp.BlobStoring.Providers; + +namespace Volo.Abp.BlobStoring.Fakes +{ + public class FakeBlobProvider2 : IBlobProvider + { + public virtual Task SaveAsync(BlobProviderSaveArgs args) + { + throw new System.NotImplementedException(); + } + + public virtual Task DeleteAsync(BlobProviderDeleteArgs args) + { + throw new System.NotImplementedException(); + } + + public virtual Task ExistsAsync(BlobProviderExistsArgs args) + { + throw new System.NotImplementedException(); + } + + public virtual Task GetAsync(BlobProviderGetArgs args) + { + throw new System.NotImplementedException(); + } + + public virtual Task GetOrNullAsync(BlobProviderGetArgs args) + { + throw new System.NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Fakes/FakeProviders.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Fakes/FakeProviders.cs new file mode 100644 index 0000000000..045f835e59 --- /dev/null +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Fakes/FakeProviders.cs @@ -0,0 +1,20 @@ +using System.Collections.Generic; +using System.Linq; +using Volo.Abp.BlobStoring.Providers; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.BlobStoring.Fakes +{ + public class FakeProviders : ISingletonDependency + { + public FakeBlobProvider1 Provider1 { get; } + + public FakeBlobProvider2 Provider2 { get; } + + public FakeProviders(IEnumerable providers) + { + Provider1 = providers.OfType().Single(); + Provider2 = providers.OfType().Single(); + } + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestContainer1.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestContainer1.cs deleted file mode 100644 index 1c11f61d50..0000000000 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestContainer1.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Volo.Abp.BlobStoring -{ - public class TestContainer1 - { - - } - - public class TestContainer2 - { - - } -} \ No newline at end of file diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestObjects/TestContainer1.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestObjects/TestContainer1.cs new file mode 100644 index 0000000000..61c84a1148 --- /dev/null +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestObjects/TestContainer1.cs @@ -0,0 +1,7 @@ +namespace Volo.Abp.BlobStoring.TestObjects +{ + public class TestContainer1 + { + + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestObjects/TestContainer2.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestObjects/TestContainer2.cs new file mode 100644 index 0000000000..3193da3749 --- /dev/null +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestObjects/TestContainer2.cs @@ -0,0 +1,8 @@ +namespace Volo.Abp.BlobStoring.TestObjects +{ + [BlobContainerName("Test2")] + public class TestContainer2 + { + + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestObjects/TestContainer3.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestObjects/TestContainer3.cs new file mode 100644 index 0000000000..b96a71c1b7 --- /dev/null +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestObjects/TestContainer3.cs @@ -0,0 +1,7 @@ +namespace Volo.Abp.BlobStoring.TestObjects +{ + public class TestContainer3 + { + + } +} \ No newline at end of file From d5b9e0ad14badec1287f040ce12c054bdde94ad4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 26 May 2020 06:15:26 +0300 Subject: [PATCH 07/27] added tests: BlobContainer_Injection_Tests --- .../BlobStoring/BlobContainerFactory_Tests.cs | 2 +- .../BlobContainer_Injection_Tests.cs | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainer_Injection_Tests.cs diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainerFactory_Tests.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainerFactory_Tests.cs index ce1bd0eec6..47afbf7336 100644 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainerFactory_Tests.cs +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainerFactory_Tests.cs @@ -18,7 +18,7 @@ namespace Volo.Abp.BlobStoring _factory = GetRequiredService(); _fakeProviders = GetRequiredService(); } - + [Fact] public async Task Should_Create_Containers_With_Configured_Providers() { diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainer_Injection_Tests.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainer_Injection_Tests.cs new file mode 100644 index 0000000000..aef26f991b --- /dev/null +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainer_Injection_Tests.cs @@ -0,0 +1,22 @@ +using Shouldly; +using Volo.Abp.BlobStoring.TestObjects; +using Xunit; + +namespace Volo.Abp.BlobStoring +{ + public class BlobContainer_Injection_Tests : AbpBlobStoringTestBase + { + [Fact] + public void Test() + { + GetRequiredService>() + .ShouldBeOfType>(); + + GetRequiredService>() + .ShouldBeOfType>(); + + GetRequiredService>() + .ShouldBeOfType>(); + } + } +} \ No newline at end of file From f897a67f6322c1f43faf6120005b4a8fdb298da9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 26 May 2020 06:16:32 +0300 Subject: [PATCH 08/27] Rename to BlobContainerFactoryExtensions --- .../Abp/BlobStoring/BlobContainerConfigurationDictionary.cs | 1 - ...erManagerExtensions.cs => BlobContainerFactoryExtensions.cs} | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) rename framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/{BlobContainerManagerExtensions.cs => BlobContainerFactoryExtensions.cs} (93%) diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurationDictionary.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurationDictionary.cs index 391d0c51a1..00bb659de4 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurationDictionary.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurationDictionary.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.IO; using JetBrains.Annotations; namespace Volo.Abp.BlobStoring diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerManagerExtensions.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactoryExtensions.cs similarity index 93% rename from framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerManagerExtensions.cs rename to framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactoryExtensions.cs index 1db2e2b10a..34483c1849 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerManagerExtensions.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactoryExtensions.cs @@ -2,7 +2,7 @@ namespace Volo.Abp.BlobStoring { - public static class BlobContainerManagerExtensions + public static class BlobContainerFactoryExtensions { /// /// Gets a named container. From 1cf0382bf7f1770b35711caa7e2146074f04a14e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 26 May 2020 06:28:11 +0300 Subject: [PATCH 09/27] remove name from BlobContainerConfiguration --- .../Volo/Abp/BlobStoring/AbpBlobStoringOptions.cs | 2 +- .../Volo/Abp/BlobStoring/BlobContainerConfiguration.cs | 9 --------- .../BlobContainerConfigurationDictionary.cs | 10 ++-------- .../Volo/Abp/BlobStoring/BlobContainerFactory.cs | 10 ++++++---- 4 files changed, 9 insertions(+), 22 deletions(-) diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringOptions.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringOptions.cs index 5c8fbe4666..09f7ae34f0 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringOptions.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringOptions.cs @@ -2,7 +2,7 @@ { public class AbpBlobStoringOptions { - public BlobContainerConfigurationDictionary Containers { get; set; } + public BlobContainerConfigurationDictionary Containers { get; } public AbpBlobStoringOptions() { diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfiguration.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfiguration.cs index 3974fe4d98..d5e480c3aa 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfiguration.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfiguration.cs @@ -1,19 +1,10 @@ using System; using System.Collections.Generic; -using JetBrains.Annotations; namespace Volo.Abp.BlobStoring { public class BlobContainerConfiguration : Dictionary { - [NotNull] - public string Name { get; } - public Type ProviderType { get; set; } - - public BlobContainerConfiguration([NotNull] string name) - { - Name = Check.NotNullOrWhiteSpace(name, nameof(name)); - } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurationDictionary.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurationDictionary.cs index 00bb659de4..43ac7dad68 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurationDictionary.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurationDictionary.cs @@ -10,7 +10,7 @@ namespace Volo.Abp.BlobStoring public BlobContainerConfigurationDictionary() { - Default = new BlobContainerConfiguration("_default"); + Default = new BlobContainerConfiguration(); } public BlobContainerConfigurationDictionary Configure( @@ -29,7 +29,7 @@ namespace Volo.Abp.BlobStoring Check.NotNullOrWhiteSpace(name, nameof(name)); Check.NotNull(configureAction, nameof(configureAction)); - configureAction(this.GetOrAdd(name, () => new BlobContainerConfiguration(name))); + configureAction(this.GetOrAdd(name, () => new BlobContainerConfiguration())); return this; } @@ -39,11 +39,5 @@ namespace Volo.Abp.BlobStoring configureAction(Default); return this; } - - public BlobContainerConfiguration GetOrDefaultConfiguration(string name) - { - return AbpDictionaryExtensions.GetOrDefault(this, name) ?? - Default; - } } } \ No newline at end of file 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 731012a3b2..b28b1f1ebd 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs @@ -26,16 +26,18 @@ namespace Volo.Abp.BlobStoring public virtual IBlobContainer Create(string name, CancellationToken cancellationToken = default) { - var configuration = Options.Containers.GetOrDefaultConfiguration(name); + var configuration = Options.Containers.GetOrDefault(name); return new BlobContainerToProviderAdapter( name, configuration, - GetProvider(configuration) + GetProvider(name, configuration) ); } [NotNull] - protected virtual IBlobProvider GetProvider(BlobContainerConfiguration configuration) + protected virtual IBlobProvider GetProvider( + string containerName, + BlobContainerConfiguration configuration) { if (!BlobProviders.Any()) { @@ -51,7 +53,7 @@ namespace Volo.Abp.BlobStoring } throw new AbpException( - $"Could not find the BLOB Storage provider with the type ({configuration.ProviderType.AssemblyQualifiedName}) configured for the container {configuration.Name}" + $"Could not find the BLOB Storage provider with the type ({configuration.ProviderType.AssemblyQualifiedName}) configured for the container {containerName} and no default provider was set." ); } } From d28db0f4ada47844f779af168176947ef015aae8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 26 May 2020 06:29:38 +0300 Subject: [PATCH 10/27] Fix BlobContainerFactory --- .../Volo/Abp/BlobStoring/BlobContainerFactory.cs | 2 +- .../Volo/Abp/BlobStoring/AbpBlobStoringOptions_Tests.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) 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 b28b1f1ebd..245070d591 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs @@ -26,7 +26,7 @@ namespace Volo.Abp.BlobStoring public virtual IBlobContainer Create(string name, CancellationToken cancellationToken = default) { - var configuration = Options.Containers.GetOrDefault(name); + var configuration = Options.Containers.GetOrDefault(name) ?? Options.Containers.Default; return new BlobContainerToProviderAdapter( name, configuration, diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringOptions_Tests.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringOptions_Tests.cs index b4cd5e3be1..0593029f10 100644 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringOptions_Tests.cs +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringOptions_Tests.cs @@ -19,11 +19,11 @@ namespace Volo.Abp.BlobStoring public void Should_Property_Set_And_Get_Options_For_Different_Containers() { var testContainer1Config = _options.Containers - .GetOrDefaultConfiguration(BlobContainerNameAttribute.GetContainerName()); + .GetOrDefault(BlobContainerNameAttribute.GetContainerName()); testContainer1Config.ShouldContainKeyAndValue("TestConfig1", "TestValue1"); var testContainer2Config = _options.Containers - .GetOrDefaultConfiguration(BlobContainerNameAttribute.GetContainerName()); + .GetOrDefault(BlobContainerNameAttribute.GetContainerName()); testContainer2Config.ShouldContainKeyAndValue("TestConfig2", "TestValue2"); } } From 602e8af162ec9de02c92b0e1c924cb7c49266b9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 26 May 2020 06:56:06 +0300 Subject: [PATCH 11/27] Revise the blob configurations. --- .../BlobStoring/BlobContainerConfiguration.cs | 50 ++++++++++++++++++- .../BlobContainerConfigurationDictionary.cs | 25 +++++++++- .../Abp/BlobStoring/BlobContainerFactory.cs | 2 +- .../AbpBlobStoringOptions_Tests.cs | 22 ++++++-- .../BlobStoring/AbpBlobStoringTestModule.cs | 6 +-- 5 files changed, 94 insertions(+), 11 deletions(-) diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfiguration.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfiguration.cs index d5e480c3aa..c649ea3ffa 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfiguration.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfiguration.cs @@ -1,10 +1,58 @@ using System; using System.Collections.Generic; +using JetBrains.Annotations; namespace Volo.Abp.BlobStoring { - public class BlobContainerConfiguration : Dictionary + public class BlobContainerConfiguration { public Type ProviderType { get; set; } + + [NotNull] + private readonly Dictionary _properties; + + [CanBeNull] + private readonly BlobContainerConfiguration _fallbackConfiguration; + + public BlobContainerConfiguration(BlobContainerConfiguration fallbackConfiguration = null) + { + _fallbackConfiguration = fallbackConfiguration; + _properties = new Dictionary(); + } + + [CanBeNull] + public T GetConfigurationOrDefault(string name, T defaultValue = default) + { + return (T) GetConfigurationOrNull(name, defaultValue); + } + + [CanBeNull] + public object GetConfigurationOrNull(string name, object defaultValue = null) + { + return _properties.GetOrDefault(name) ?? + _fallbackConfiguration?.GetConfigurationOrNull(name, defaultValue) ?? + defaultValue; + } + + [NotNull] + public BlobContainerConfiguration SetConfiguration([NotNull] string name, [CanBeNull] object value) + { + Check.NotNullOrWhiteSpace(name, nameof(name)); + Check.NotNull(value, nameof(value)); + + _properties[name] = value; + + return this; + } + + [NotNull] + public BlobContainerConfiguration ClearConfiguration([NotNull] string name) + { + Check.NotNullOrWhiteSpace(name, nameof(name)); + + _properties.Remove(name); + + return this; + } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurationDictionary.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurationDictionary.cs index 43ac7dad68..9475e6c355 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurationDictionary.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurationDictionary.cs @@ -4,13 +4,16 @@ using JetBrains.Annotations; namespace Volo.Abp.BlobStoring { - public class BlobContainerConfigurationDictionary : Dictionary + public class BlobContainerConfigurationDictionary { public BlobContainerConfiguration Default { get; } + private readonly Dictionary _containers; + public BlobContainerConfigurationDictionary() { Default = new BlobContainerConfiguration(); + _containers = new Dictionary(); } public BlobContainerConfigurationDictionary Configure( @@ -29,7 +32,7 @@ namespace Volo.Abp.BlobStoring Check.NotNullOrWhiteSpace(name, nameof(name)); Check.NotNull(configureAction, nameof(configureAction)); - configureAction(this.GetOrAdd(name, () => new BlobContainerConfiguration())); + configureAction(_containers.GetOrAdd(name, () => new BlobContainerConfiguration(Default))); return this; } @@ -39,5 +42,23 @@ namespace Volo.Abp.BlobStoring configureAction(Default); return this; } + + [NotNull] + public BlobContainerConfiguration GetConfiguration([NotNull] string name) + { + Check.NotNullOrWhiteSpace(name, nameof(name)); + + return _containers.GetOrDefault(name) ?? + Default; + } + + [NotNull] + public BlobContainerConfiguration GetConfiguration([NotNull] string name) + { + Check.NotNullOrWhiteSpace(name, nameof(name)); + + return _containers.GetOrDefault(name) ?? + Default; + } } } \ No newline at end of file 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 245070d591..3ea949071c 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs @@ -26,7 +26,7 @@ namespace Volo.Abp.BlobStoring public virtual IBlobContainer Create(string name, CancellationToken cancellationToken = default) { - var configuration = Options.Containers.GetOrDefault(name) ?? Options.Containers.Default; + var configuration = Options.Containers.GetConfiguration(name); return new BlobContainerToProviderAdapter( name, configuration, diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringOptions_Tests.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringOptions_Tests.cs index 0593029f10..84193664fd 100644 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringOptions_Tests.cs +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringOptions_Tests.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using Microsoft.Extensions.Options; using Shouldly; +using Volo.Abp.BlobStoring.Fakes; using Volo.Abp.BlobStoring.TestObjects; using Xunit; @@ -19,12 +20,25 @@ namespace Volo.Abp.BlobStoring public void Should_Property_Set_And_Get_Options_For_Different_Containers() { var testContainer1Config = _options.Containers - .GetOrDefault(BlobContainerNameAttribute.GetContainerName()); - testContainer1Config.ShouldContainKeyAndValue("TestConfig1", "TestValue1"); + .GetConfiguration(BlobContainerNameAttribute.GetContainerName()); + testContainer1Config.ProviderType.ShouldBe(typeof(FakeBlobProvider1)); + testContainer1Config.GetConfigurationOrDefault("TestConfig1").ShouldBe("TestValue1"); + testContainer1Config.GetConfigurationOrDefault("TestConfigDefault").ShouldBe("TestValueDefault"); var testContainer2Config = _options.Containers - .GetOrDefault(BlobContainerNameAttribute.GetContainerName()); - testContainer2Config.ShouldContainKeyAndValue("TestConfig2", "TestValue2"); + .GetConfiguration(BlobContainerNameAttribute.GetContainerName()); + testContainer2Config.ProviderType.ShouldBe(typeof(FakeBlobProvider2)); + testContainer2Config.GetConfigurationOrNull("TestConfig2").ShouldBe("TestValue2"); + testContainer2Config.GetConfigurationOrNull("TestConfigDefault").ShouldBe("TestValueDefault"); + } + + [Fact] + public void Should_Fallback_To_Default_Configuration_If_Not_Specialized() + { + var config = _options.Containers + .GetConfiguration(BlobContainerNameAttribute.GetContainerName()); + config.ProviderType.ShouldBe(typeof(FakeBlobProvider1)); + config.GetConfigurationOrNull("TestConfigDefault").ShouldBe("TestValueDefault"); } } } \ No newline at end of file diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringTestModule.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringTestModule.cs index dc29bff71c..041f9e19f4 100644 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringTestModule.cs +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringTestModule.cs @@ -25,17 +25,17 @@ namespace Volo.Abp.BlobStoring options.Containers .ConfigureDefault(container => { - container["TestConfigDefault"] = "TestValueDefault"; + container.SetConfiguration("TestConfigDefault", "TestValueDefault"); container.ProviderType = typeof(FakeBlobProvider1); }) .Configure(container => { - container["TestConfig1"] = "TestValue1"; + container.SetConfiguration("TestConfig1", "TestValue1"); container.ProviderType = typeof(FakeBlobProvider1); }) .Configure(container => { - container["TestConfig2"] = "TestValue2"; + container.SetConfiguration("TestConfig2", "TestValue2"); container.ProviderType = typeof(FakeBlobProvider2); }); }); From cd2db84fb780d048c8201c5730f8f9db514cb958 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 26 May 2020 07:02:18 +0300 Subject: [PATCH 12/27] Adjust namespaces. --- .../Volo/Abp/BlobStoring/AbpBlobStoringModule.cs | 1 + .../Volo/Abp/BlobStoring/AbpBlobStoringOptions.cs | 4 +++- .../{ => Containers}/BlobContainerConfiguration.cs | 2 +- .../BlobContainerConfigurationDictionary.cs | 2 +- .../BlobStoring/{ => Containers}/BlobContainerFactory.cs | 2 +- .../{ => Containers}/BlobContainerFactoryExtensions.cs | 2 +- .../{ => Containers}/BlobContainerNameAttribute.cs | 2 +- .../Abp/BlobStoring/{ => Containers}/IBlobContainer.cs | 2 +- .../BlobStoring/{ => Containers}/IBlobContainerFactory.cs | 2 +- .../{ => Containers}/TypedBlobContainerWrapper.cs | 2 +- .../Providers/BlobContainerToProviderAdapter.cs | 1 + .../Volo/Abp/BlobStoring/Providers/BlobProviderArgs.cs | 1 + .../Abp/BlobStoring/Providers/BlobProviderDeleteArgs.cs | 1 + .../Abp/BlobStoring/Providers/BlobProviderExistsArgs.cs | 1 + .../Volo/Abp/BlobStoring/Providers/BlobProviderGetArgs.cs | 1 + .../Volo/Abp/BlobStoring/Providers/BlobProviderSaveArgs.cs | 1 + .../Volo.Abp.BlobStoring.Tests.csproj | 4 ++++ .../Volo/Abp/BlobStoring/AbpBlobStoringOptions_Tests.cs | 5 +++-- .../Volo/Abp/BlobStoring/AbpBlobStoringTestModule.cs | 4 ++-- .../{ => Containers}/BlobContainerFactory_Tests.cs | 7 +++---- .../{ => Containers}/BlobContainerNameAttribute_Tests.cs | 4 ++-- .../{ => Containers}/BlobContainer_Injection_Tests.cs | 4 ++-- .../BlobStoring/Containers/TestObjects/TestContainer1.cs | 7 +++++++ .../{ => Containers}/TestObjects/TestContainer2.cs | 2 +- .../BlobStoring/Containers/TestObjects/TestContainer3.cs | 7 +++++++ .../BlobStoring/{ => Providers}/Fakes/FakeBlobProvider1.cs | 3 +-- .../BlobStoring/{ => Providers}/Fakes/FakeBlobProvider2.cs | 3 +-- .../Abp/BlobStoring/{ => Providers}/Fakes/FakeProviders.cs | 3 +-- .../Volo/Abp/BlobStoring/TestObjects/TestContainer1.cs | 7 ------- .../Volo/Abp/BlobStoring/TestObjects/TestContainer3.cs | 7 ------- 30 files changed, 52 insertions(+), 42 deletions(-) rename framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/{ => Containers}/BlobContainerConfiguration.cs (97%) rename framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/{ => Containers}/BlobContainerConfigurationDictionary.cs (97%) rename framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/{ => Containers}/BlobContainerFactory.cs (97%) rename framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/{ => Containers}/BlobContainerFactoryExtensions.cs (94%) rename framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/{ => Containers}/BlobContainerNameAttribute.cs (95%) rename framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/{ => Containers}/IBlobContainer.cs (98%) rename framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/{ => Containers}/IBlobContainerFactory.cs (92%) rename framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/{ => Containers}/TypedBlobContainerWrapper.cs (97%) rename framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/{ => Containers}/BlobContainerFactory_Tests.cs (94%) rename framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/{ => Containers}/BlobContainerNameAttribute_Tests.cs (85%) rename framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/{ => Containers}/BlobContainer_Injection_Tests.cs (87%) create mode 100644 framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/TestObjects/TestContainer1.cs rename framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/{ => Containers}/TestObjects/TestContainer2.cs (60%) create mode 100644 framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/TestObjects/TestContainer3.cs rename framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/{ => Providers}/Fakes/FakeBlobProvider1.cs (91%) rename framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/{ => Providers}/Fakes/FakeBlobProvider2.cs (91%) rename framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/{ => Providers}/Fakes/FakeProviders.cs (86%) delete mode 100644 framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestObjects/TestContainer1.cs delete mode 100644 framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestObjects/TestContainer3.cs diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringModule.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringModule.cs index 51b000f30c..d2c4aa87bc 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringModule.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringModule.cs @@ -1,4 +1,5 @@ using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.BlobStoring.Containers; using Volo.Abp.Modularity; namespace Volo.Abp.BlobStoring diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringOptions.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringOptions.cs index 09f7ae34f0..7f48243fe6 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringOptions.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringOptions.cs @@ -1,4 +1,6 @@ -namespace Volo.Abp.BlobStoring +using Volo.Abp.BlobStoring.Containers; + +namespace Volo.Abp.BlobStoring { public class AbpBlobStoringOptions { diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfiguration.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/BlobContainerConfiguration.cs similarity index 97% rename from framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfiguration.cs rename to framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/BlobContainerConfiguration.cs index c649ea3ffa..5c78ccb991 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfiguration.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/BlobContainerConfiguration.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using JetBrains.Annotations; -namespace Volo.Abp.BlobStoring +namespace Volo.Abp.BlobStoring.Containers { public class BlobContainerConfiguration { diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurationDictionary.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/BlobContainerConfigurationDictionary.cs similarity index 97% rename from framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurationDictionary.cs rename to framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/BlobContainerConfigurationDictionary.cs index 9475e6c355..80a431867d 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurationDictionary.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/BlobContainerConfigurationDictionary.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using JetBrains.Annotations; -namespace Volo.Abp.BlobStoring +namespace Volo.Abp.BlobStoring.Containers { public class BlobContainerConfigurationDictionary { diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/BlobContainerFactory.cs similarity index 97% rename from framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs rename to framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/BlobContainerFactory.cs index 3ea949071c..3acb7528b0 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/BlobContainerFactory.cs @@ -8,7 +8,7 @@ using Volo.Abp.BlobStoring.Providers; using Volo.Abp.DependencyInjection; using Volo.Abp.DynamicProxy; -namespace Volo.Abp.BlobStoring +namespace Volo.Abp.BlobStoring.Containers { public class BlobContainerFactory : IBlobContainerFactory, ITransientDependency { diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactoryExtensions.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/BlobContainerFactoryExtensions.cs similarity index 94% rename from framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactoryExtensions.cs rename to framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/BlobContainerFactoryExtensions.cs index 34483c1849..69b1313c91 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactoryExtensions.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/BlobContainerFactoryExtensions.cs @@ -1,6 +1,6 @@ using System.Threading; -namespace Volo.Abp.BlobStoring +namespace Volo.Abp.BlobStoring.Containers { public static class BlobContainerFactoryExtensions { diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerNameAttribute.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/BlobContainerNameAttribute.cs similarity index 95% rename from framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerNameAttribute.cs rename to framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/BlobContainerNameAttribute.cs index 12bd91d669..7b86e67259 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerNameAttribute.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/BlobContainerNameAttribute.cs @@ -2,7 +2,7 @@ using System.Reflection; using JetBrains.Annotations; -namespace Volo.Abp.BlobStoring +namespace Volo.Abp.BlobStoring.Containers { public class BlobContainerNameAttribute : Attribute { diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobContainer.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/IBlobContainer.cs similarity index 98% rename from framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobContainer.cs rename to framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/IBlobContainer.cs index a596565b5f..9c96244655 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobContainer.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/IBlobContainer.cs @@ -2,7 +2,7 @@ using System.Threading; using System.Threading.Tasks; -namespace Volo.Abp.BlobStoring +namespace Volo.Abp.BlobStoring.Containers { public interface IBlobContainer : IBlobContainer where TContainer: class diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobContainerFactory.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/IBlobContainerFactory.cs similarity index 92% rename from framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobContainerFactory.cs rename to framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/IBlobContainerFactory.cs index 8434e3ae23..7171542b07 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobContainerFactory.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/IBlobContainerFactory.cs @@ -1,6 +1,6 @@ using System.Threading; -namespace Volo.Abp.BlobStoring +namespace Volo.Abp.BlobStoring.Containers { public interface IBlobContainerFactory { diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/TypedBlobContainerWrapper.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/TypedBlobContainerWrapper.cs similarity index 97% rename from framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/TypedBlobContainerWrapper.cs rename to framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/TypedBlobContainerWrapper.cs index 34d11bb46f..a528795102 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/TypedBlobContainerWrapper.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/TypedBlobContainerWrapper.cs @@ -2,7 +2,7 @@ using System.Threading; using System.Threading.Tasks; -namespace Volo.Abp.BlobStoring +namespace Volo.Abp.BlobStoring.Containers { public class TypedBlobContainerWrapper : IBlobContainer where TContainer: class diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobContainerToProviderAdapter.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobContainerToProviderAdapter.cs index c4aa6e9c6f..14f1128329 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobContainerToProviderAdapter.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobContainerToProviderAdapter.cs @@ -1,6 +1,7 @@ using System.IO; using System.Threading; using System.Threading.Tasks; +using Volo.Abp.BlobStoring.Containers; namespace Volo.Abp.BlobStoring.Providers { diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderArgs.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderArgs.cs index dc7029f3a2..f1175e0940 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderArgs.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderArgs.cs @@ -1,5 +1,6 @@ using System.Threading; using JetBrains.Annotations; +using Volo.Abp.BlobStoring.Containers; namespace Volo.Abp.BlobStoring.Providers { diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderDeleteArgs.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderDeleteArgs.cs index e7545a0241..3f1b78b5c1 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderDeleteArgs.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderDeleteArgs.cs @@ -1,5 +1,6 @@ using System.Threading; using JetBrains.Annotations; +using Volo.Abp.BlobStoring.Containers; namespace Volo.Abp.BlobStoring.Providers { diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderExistsArgs.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderExistsArgs.cs index 686c438d08..3a6d0e90c5 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderExistsArgs.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderExistsArgs.cs @@ -1,5 +1,6 @@ using System.Threading; using JetBrains.Annotations; +using Volo.Abp.BlobStoring.Containers; namespace Volo.Abp.BlobStoring.Providers { diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderGetArgs.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderGetArgs.cs index 949cc1053c..3a92eb0a9c 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderGetArgs.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderGetArgs.cs @@ -1,5 +1,6 @@ using System.Threading; using JetBrains.Annotations; +using Volo.Abp.BlobStoring.Containers; namespace Volo.Abp.BlobStoring.Providers { diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderSaveArgs.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderSaveArgs.cs index fb482f8e5a..9ae8faa603 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderSaveArgs.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderSaveArgs.cs @@ -1,6 +1,7 @@ using System.IO; using System.Threading; using JetBrains.Annotations; +using Volo.Abp.BlobStoring.Containers; namespace Volo.Abp.BlobStoring.Providers { diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo.Abp.BlobStoring.Tests.csproj b/framework/test/Volo.Abp.BlobStoring.Tests/Volo.Abp.BlobStoring.Tests.csproj index 5ae7e10c44..c6e16a39b2 100644 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo.Abp.BlobStoring.Tests.csproj +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo.Abp.BlobStoring.Tests.csproj @@ -14,4 +14,8 @@ + + + + diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringOptions_Tests.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringOptions_Tests.cs index 84193664fd..9f538926ba 100644 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringOptions_Tests.cs +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringOptions_Tests.cs @@ -1,8 +1,9 @@ using System.Collections.Generic; using Microsoft.Extensions.Options; using Shouldly; -using Volo.Abp.BlobStoring.Fakes; -using Volo.Abp.BlobStoring.TestObjects; +using Volo.Abp.BlobStoring.Containers; +using Volo.Abp.BlobStoring.Containers.TestObjects; +using Volo.Abp.BlobStoring.Providers.Fakes; using Xunit; namespace Volo.Abp.BlobStoring diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringTestModule.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringTestModule.cs index 041f9e19f4..9283c6f8d0 100644 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringTestModule.cs +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringTestModule.cs @@ -1,9 +1,9 @@ using Microsoft.Extensions.DependencyInjection; using NSubstitute; using Volo.Abp.Autofac; -using Volo.Abp.BlobStoring.Fakes; +using Volo.Abp.BlobStoring.Containers.TestObjects; using Volo.Abp.BlobStoring.Providers; -using Volo.Abp.BlobStoring.TestObjects; +using Volo.Abp.BlobStoring.Providers.Fakes; using Volo.Abp.Modularity; namespace Volo.Abp.BlobStoring diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainerFactory_Tests.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/BlobContainerFactory_Tests.cs similarity index 94% rename from framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainerFactory_Tests.cs rename to framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/BlobContainerFactory_Tests.cs index 47afbf7336..70c6c509ad 100644 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainerFactory_Tests.cs +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/BlobContainerFactory_Tests.cs @@ -1,12 +1,11 @@ using System.Threading.Tasks; using NSubstitute; -using Shouldly; -using Volo.Abp.BlobStoring.Fakes; +using Volo.Abp.BlobStoring.Containers.TestObjects; using Volo.Abp.BlobStoring.Providers; -using Volo.Abp.BlobStoring.TestObjects; +using Volo.Abp.BlobStoring.Providers.Fakes; using Xunit; -namespace Volo.Abp.BlobStoring +namespace Volo.Abp.BlobStoring.Containers { public class BlobContainerFactory_Tests : AbpBlobStoringTestBase { diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainerNameAttribute_Tests.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/BlobContainerNameAttribute_Tests.cs similarity index 85% rename from framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainerNameAttribute_Tests.cs rename to framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/BlobContainerNameAttribute_Tests.cs index 242b195a0c..f332d1571a 100644 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainerNameAttribute_Tests.cs +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/BlobContainerNameAttribute_Tests.cs @@ -1,8 +1,8 @@ using Shouldly; -using Volo.Abp.BlobStoring.TestObjects; +using Volo.Abp.BlobStoring.Containers.TestObjects; using Xunit; -namespace Volo.Abp.BlobStoring +namespace Volo.Abp.BlobStoring.Containers { public class BlobContainerNameAttribute_Tests { diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainer_Injection_Tests.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/BlobContainer_Injection_Tests.cs similarity index 87% rename from framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainer_Injection_Tests.cs rename to framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/BlobContainer_Injection_Tests.cs index aef26f991b..bc5eb79d9f 100644 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainer_Injection_Tests.cs +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/BlobContainer_Injection_Tests.cs @@ -1,8 +1,8 @@ using Shouldly; -using Volo.Abp.BlobStoring.TestObjects; +using Volo.Abp.BlobStoring.Containers.TestObjects; using Xunit; -namespace Volo.Abp.BlobStoring +namespace Volo.Abp.BlobStoring.Containers { public class BlobContainer_Injection_Tests : AbpBlobStoringTestBase { diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/TestObjects/TestContainer1.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/TestObjects/TestContainer1.cs new file mode 100644 index 0000000000..9000e2857d --- /dev/null +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/TestObjects/TestContainer1.cs @@ -0,0 +1,7 @@ +namespace Volo.Abp.BlobStoring.Containers.TestObjects +{ + public class TestContainer1 + { + + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestObjects/TestContainer2.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/TestObjects/TestContainer2.cs similarity index 60% rename from framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestObjects/TestContainer2.cs rename to framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/TestObjects/TestContainer2.cs index 3193da3749..48add50d24 100644 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestObjects/TestContainer2.cs +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/TestObjects/TestContainer2.cs @@ -1,4 +1,4 @@ -namespace Volo.Abp.BlobStoring.TestObjects +namespace Volo.Abp.BlobStoring.Containers.TestObjects { [BlobContainerName("Test2")] public class TestContainer2 diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/TestObjects/TestContainer3.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/TestObjects/TestContainer3.cs new file mode 100644 index 0000000000..8d7f8629c2 --- /dev/null +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/TestObjects/TestContainer3.cs @@ -0,0 +1,7 @@ +namespace Volo.Abp.BlobStoring.Containers.TestObjects +{ + public class TestContainer3 + { + + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Fakes/FakeBlobProvider1.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Providers/Fakes/FakeBlobProvider1.cs similarity index 91% rename from framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Fakes/FakeBlobProvider1.cs rename to framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Providers/Fakes/FakeBlobProvider1.cs index 4eb401e0fb..7eef06cb92 100644 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Fakes/FakeBlobProvider1.cs +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Providers/Fakes/FakeBlobProvider1.cs @@ -1,8 +1,7 @@ using System.IO; using System.Threading.Tasks; -using Volo.Abp.BlobStoring.Providers; -namespace Volo.Abp.BlobStoring.Fakes +namespace Volo.Abp.BlobStoring.Providers.Fakes { public class FakeBlobProvider1 : IBlobProvider { diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Fakes/FakeBlobProvider2.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Providers/Fakes/FakeBlobProvider2.cs similarity index 91% rename from framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Fakes/FakeBlobProvider2.cs rename to framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Providers/Fakes/FakeBlobProvider2.cs index 233bed8d16..666a862f75 100644 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Fakes/FakeBlobProvider2.cs +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Providers/Fakes/FakeBlobProvider2.cs @@ -1,8 +1,7 @@ using System.IO; using System.Threading.Tasks; -using Volo.Abp.BlobStoring.Providers; -namespace Volo.Abp.BlobStoring.Fakes +namespace Volo.Abp.BlobStoring.Providers.Fakes { public class FakeBlobProvider2 : IBlobProvider { diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Fakes/FakeProviders.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Providers/Fakes/FakeProviders.cs similarity index 86% rename from framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Fakes/FakeProviders.cs rename to framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Providers/Fakes/FakeProviders.cs index 045f835e59..cb5754acde 100644 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Fakes/FakeProviders.cs +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Providers/Fakes/FakeProviders.cs @@ -1,9 +1,8 @@ using System.Collections.Generic; using System.Linq; -using Volo.Abp.BlobStoring.Providers; using Volo.Abp.DependencyInjection; -namespace Volo.Abp.BlobStoring.Fakes +namespace Volo.Abp.BlobStoring.Providers.Fakes { public class FakeProviders : ISingletonDependency { diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestObjects/TestContainer1.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestObjects/TestContainer1.cs deleted file mode 100644 index 61c84a1148..0000000000 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestObjects/TestContainer1.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Volo.Abp.BlobStoring.TestObjects -{ - public class TestContainer1 - { - - } -} \ No newline at end of file diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestObjects/TestContainer3.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestObjects/TestContainer3.cs deleted file mode 100644 index b96a71c1b7..0000000000 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestObjects/TestContainer3.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Volo.Abp.BlobStoring.TestObjects -{ - public class TestContainer3 - { - - } -} \ No newline at end of file From 67e79533efbeeec7647e38536a60ce3f869a3cfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 26 May 2020 07:10:17 +0300 Subject: [PATCH 13/27] Support default blob container. --- .../Volo/Abp/BlobStoring/AbpBlobStoringModule.cs | 6 ++++++ .../BlobContainerToProviderAdapter.cs | 4 ++-- .../Abp/BlobStoring/Containers/DefaultContainer.cs | 8 ++++++++ .../Containers/BlobContainer_Injection_Tests.cs | 12 +++++++++++- 4 files changed, 27 insertions(+), 3 deletions(-) rename framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/{Providers => Containers}/BlobContainerToProviderAdapter.cs (97%) create mode 100644 framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/DefaultContainer.cs diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringModule.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringModule.cs index d2c4aa87bc..99806d605b 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringModule.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringModule.cs @@ -12,6 +12,12 @@ namespace Volo.Abp.BlobStoring typeof(IBlobContainer<>), typeof(TypedBlobContainerWrapper<>) ); + + context.Services.AddTransient( + typeof(IBlobContainer), + serviceProvider => serviceProvider + .GetRequiredService>() + ); } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobContainerToProviderAdapter.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/BlobContainerToProviderAdapter.cs similarity index 97% rename from framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobContainerToProviderAdapter.cs rename to framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/BlobContainerToProviderAdapter.cs index 14f1128329..0e134bf229 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobContainerToProviderAdapter.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/BlobContainerToProviderAdapter.cs @@ -1,9 +1,9 @@ using System.IO; using System.Threading; using System.Threading.Tasks; -using Volo.Abp.BlobStoring.Containers; +using Volo.Abp.BlobStoring.Providers; -namespace Volo.Abp.BlobStoring.Providers +namespace Volo.Abp.BlobStoring.Containers { public class BlobContainerToProviderAdapter : IBlobContainer { diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/DefaultContainer.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/DefaultContainer.cs new file mode 100644 index 0000000000..7afc3c83ac --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/DefaultContainer.cs @@ -0,0 +1,8 @@ +namespace Volo.Abp.BlobStoring.Containers +{ + [BlobContainerName("Default")] + public class DefaultContainer + { + + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/BlobContainer_Injection_Tests.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/BlobContainer_Injection_Tests.cs index bc5eb79d9f..6e55922758 100644 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/BlobContainer_Injection_Tests.cs +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/BlobContainer_Injection_Tests.cs @@ -7,8 +7,18 @@ namespace Volo.Abp.BlobStoring.Containers public class BlobContainer_Injection_Tests : AbpBlobStoringTestBase { [Fact] - public void Test() + public void Should_Inject_DefaultContainer_For_Non_Generic_Interface() { + GetRequiredService() + .ShouldBeOfType>(); + } + + [Fact] + public void Should_Inject_Specified_Container_For_Generic_Interface() + { + GetRequiredService>() + .ShouldBeOfType>(); + GetRequiredService>() .ShouldBeOfType>(); From 0457322d0ec1e64215e81406ca6acbd2e72eaae6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 26 May 2020 07:20:07 +0300 Subject: [PATCH 14/27] Added Volo.Abp.BlobStoring.FileSystem package and test project. --- framework/Volo.Abp.sln | 14 +++++++++ .../FodyWeavers.xml | 3 ++ .../FodyWeavers.xsd | 30 +++++++++++++++++++ .../Volo.Abp.BlobStoring.FileSystem.csproj | 21 +++++++++++++ .../AbpBlobStoringFileSystemModule.cs | 13 ++++++++ ...lo.Abp.BlobStoring.FileSystem.Tests.csproj | 17 +++++++++++ .../AbpBlobStoringFileSystemTestModule.cs | 13 ++++++++ .../FileSystem/AbpBlobStoringTestBase.cs | 12 ++++++++ .../Volo.Abp.BlobStoring.Tests.csproj | 6 +--- 9 files changed, 124 insertions(+), 5 deletions(-) create mode 100644 framework/src/Volo.Abp.BlobStoring.FileSystem/FodyWeavers.xml create mode 100644 framework/src/Volo.Abp.BlobStoring.FileSystem/FodyWeavers.xsd create mode 100644 framework/src/Volo.Abp.BlobStoring.FileSystem/Volo.Abp.BlobStoring.FileSystem.csproj create mode 100644 framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/AbpBlobStoringFileSystemModule.cs create mode 100644 framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo.Abp.BlobStoring.FileSystem.Tests.csproj create mode 100644 framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo/Abp/BlobStoring/FileSystem/AbpBlobStoringFileSystemTestModule.cs create mode 100644 framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo/Abp/BlobStoring/FileSystem/AbpBlobStoringTestBase.cs diff --git a/framework/Volo.Abp.sln b/framework/Volo.Abp.sln index 7c3df0ccfd..165e62334c 100644 --- a/framework/Volo.Abp.sln +++ b/framework/Volo.Abp.sln @@ -295,6 +295,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.BlobStoring", "src EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.BlobStoring.Tests", "test\Volo.Abp.BlobStoring.Tests\Volo.Abp.BlobStoring.Tests.csproj", "{D53A17BB-4E23-451D-AD9B-E1F6AC3F7958}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.BlobStoring.FileSystem", "src\Volo.Abp.BlobStoring.FileSystem\Volo.Abp.BlobStoring.FileSystem.csproj", "{02B1FBE2-850E-4612-ABC6-DD62BCF2DD6B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.BlobStoring.FileSystem.Tests", "test\Volo.Abp.BlobStoring.FileSystem.Tests\Volo.Abp.BlobStoring.FileSystem.Tests.csproj", "{68443D4A-1608-4039-B995-7AF4CF82E9F8}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -877,6 +881,14 @@ Global {D53A17BB-4E23-451D-AD9B-E1F6AC3F7958}.Debug|Any CPU.Build.0 = Debug|Any CPU {D53A17BB-4E23-451D-AD9B-E1F6AC3F7958}.Release|Any CPU.ActiveCfg = Release|Any CPU {D53A17BB-4E23-451D-AD9B-E1F6AC3F7958}.Release|Any CPU.Build.0 = Release|Any CPU + {02B1FBE2-850E-4612-ABC6-DD62BCF2DD6B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {02B1FBE2-850E-4612-ABC6-DD62BCF2DD6B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {02B1FBE2-850E-4612-ABC6-DD62BCF2DD6B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {02B1FBE2-850E-4612-ABC6-DD62BCF2DD6B}.Release|Any CPU.Build.0 = Release|Any CPU + {68443D4A-1608-4039-B995-7AF4CF82E9F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {68443D4A-1608-4039-B995-7AF4CF82E9F8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {68443D4A-1608-4039-B995-7AF4CF82E9F8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {68443D4A-1608-4039-B995-7AF4CF82E9F8}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1026,6 +1038,8 @@ Global {79323211-E658-493E-9863-035AA4C3F913} = {447C8A77-E5F0-4538-8687-7383196D04EA} {A0CFBDD6-A3CB-438C-83F1-5025F12E2D42} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {D53A17BB-4E23-451D-AD9B-E1F6AC3F7958} = {447C8A77-E5F0-4538-8687-7383196D04EA} + {02B1FBE2-850E-4612-ABC6-DD62BCF2DD6B} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} + {68443D4A-1608-4039-B995-7AF4CF82E9F8} = {447C8A77-E5F0-4538-8687-7383196D04EA} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5} diff --git a/framework/src/Volo.Abp.BlobStoring.FileSystem/FodyWeavers.xml b/framework/src/Volo.Abp.BlobStoring.FileSystem/FodyWeavers.xml new file mode 100644 index 0000000000..be0de3a908 --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring.FileSystem/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring.FileSystem/FodyWeavers.xsd b/framework/src/Volo.Abp.BlobStoring.FileSystem/FodyWeavers.xsd new file mode 100644 index 0000000000..3f3946e282 --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring.FileSystem/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo.Abp.BlobStoring.FileSystem.csproj b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo.Abp.BlobStoring.FileSystem.csproj new file mode 100644 index 0000000000..03fcbbd374 --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo.Abp.BlobStoring.FileSystem.csproj @@ -0,0 +1,21 @@ + + + + + + + netstandard2.0 + Volo.Abp.BlobStoring.FileSystem + Volo.Abp.BlobStoring.FileSystem + $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; + false + false + false + + + + + + + + diff --git a/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/AbpBlobStoringFileSystemModule.cs b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/AbpBlobStoringFileSystemModule.cs new file mode 100644 index 0000000000..249bbfaa78 --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/AbpBlobStoringFileSystemModule.cs @@ -0,0 +1,13 @@ +using System; +using Volo.Abp.Modularity; + +namespace Volo.Abp.BlobStoring.FileSystem +{ + [DependsOn( + typeof(AbpBlobStoringModule) + )] + public class AbpBlobStoringFileSystemModule : AbpModule + { + + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo.Abp.BlobStoring.FileSystem.Tests.csproj b/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo.Abp.BlobStoring.FileSystem.Tests.csproj new file mode 100644 index 0000000000..1ac7ba2414 --- /dev/null +++ b/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo.Abp.BlobStoring.FileSystem.Tests.csproj @@ -0,0 +1,17 @@ + + + + + + netcoreapp3.1 + + + + + + + + + + + diff --git a/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo/Abp/BlobStoring/FileSystem/AbpBlobStoringFileSystemTestModule.cs b/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo/Abp/BlobStoring/FileSystem/AbpBlobStoringFileSystemTestModule.cs new file mode 100644 index 0000000000..925f7b6783 --- /dev/null +++ b/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo/Abp/BlobStoring/FileSystem/AbpBlobStoringFileSystemTestModule.cs @@ -0,0 +1,13 @@ +using System; +using Volo.Abp.Modularity; + +namespace Volo.Abp.BlobStoring.FileSystem +{ + [DependsOn( + typeof(AbpBlobStoringFileSystemModule) + )] + public class AbpBlobStoringFileSystemTestModule : AbpModule + { + + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo/Abp/BlobStoring/FileSystem/AbpBlobStoringTestBase.cs b/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo/Abp/BlobStoring/FileSystem/AbpBlobStoringTestBase.cs new file mode 100644 index 0000000000..8fdd832a5b --- /dev/null +++ b/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo/Abp/BlobStoring/FileSystem/AbpBlobStoringTestBase.cs @@ -0,0 +1,12 @@ +using Volo.Abp.Testing; + +namespace Volo.Abp.BlobStoring.FileSystem +{ + public abstract class AbpBlobStoringFileSystemTestBase : AbpIntegratedTest + { + protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options) + { + options.UseAutofac(); + } + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo.Abp.BlobStoring.Tests.csproj b/framework/test/Volo.Abp.BlobStoring.Tests/Volo.Abp.BlobStoring.Tests.csproj index c6e16a39b2..d9535ff176 100644 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo.Abp.BlobStoring.Tests.csproj +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo.Abp.BlobStoring.Tests.csproj @@ -9,13 +9,9 @@ - + - - - - From cf4cd772a850beeaee618369c80779a5ae80d6ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 26 May 2020 07:20:21 +0300 Subject: [PATCH 15/27] Added Volo.Abp.BlobStoring to nuget build. --- nupkg/common.ps1 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nupkg/common.ps1 b/nupkg/common.ps1 index 8f1fb99536..d056ae032d 100644 --- a/nupkg/common.ps1 +++ b/nupkg/common.ps1 @@ -55,6 +55,8 @@ $projects = ( "framework/src/Volo.Abp.BackgroundJobs.Quartz", "framework/src/Volo.Abp.BackgroundWorkers", "framework/src/Volo.Abp.BackgroundWorkers.Quartz", + "framework/src/Volo.Abp.BlobStoring", + "framework/src/Volo.Abp.BlobStoring.FileSystem", "framework/src/Volo.Abp.Caching", "framework/src/Volo.Abp.Castle.Core", "framework/src/Volo.Abp.Cli.Core", From 058bc0eebc26b88469d5a4ddd47c028062c179cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 26 May 2020 07:22:05 +0300 Subject: [PATCH 16/27] Re-arrange namespaces. --- .../Volo/Abp/BlobStoring/AbpBlobStoringModule.cs | 1 - .../Volo/Abp/BlobStoring/AbpBlobStoringOptions.cs | 4 +--- .../{Containers => }/BlobContainerConfiguration.cs | 2 +- .../BlobContainerConfigurationDictionary.cs | 2 +- .../BlobStoring/{Containers => }/BlobContainerFactory.cs | 3 +-- .../{Containers => }/BlobContainerFactoryExtensions.cs | 2 +- .../{Containers => }/BlobContainerNameAttribute.cs | 2 +- .../{Containers => }/BlobContainerToProviderAdapter.cs | 3 +-- .../Abp/BlobStoring/{Providers => }/BlobProviderArgs.cs | 3 +-- .../BlobStoring/{Providers => }/BlobProviderDeleteArgs.cs | 3 +-- .../BlobStoring/{Providers => }/BlobProviderExistsArgs.cs | 3 +-- .../Abp/BlobStoring/{Providers => }/BlobProviderGetArgs.cs | 3 +-- .../BlobStoring/{Providers => }/BlobProviderSaveArgs.cs | 3 +-- .../Abp/BlobStoring/{Containers => }/DefaultContainer.cs | 2 +- .../Abp/BlobStoring/{Containers => }/IBlobContainer.cs | 2 +- .../BlobStoring/{Containers => }/IBlobContainerFactory.cs | 2 +- .../Volo/Abp/BlobStoring/{Providers => }/IBlobProvider.cs | 2 +- .../{Containers => }/TypedBlobContainerWrapper.cs | 2 +- .../Volo/Abp/BlobStoring/AbpBlobStoringOptions_Tests.cs | 5 ++--- .../Volo/Abp/BlobStoring/AbpBlobStoringTestModule.cs | 5 ++--- .../{Containers => }/BlobContainerFactory_Tests.cs | 7 +++---- .../{Containers => }/BlobContainerNameAttribute_Tests.cs | 4 ++-- .../{Containers => }/BlobContainer_Injection_Tests.cs | 4 ++-- .../BlobStoring/Containers/TestObjects/TestContainer1.cs | 7 ------- .../BlobStoring/Containers/TestObjects/TestContainer3.cs | 7 ------- .../BlobStoring/{Providers => }/Fakes/FakeBlobProvider1.cs | 2 +- .../BlobStoring/{Providers => }/Fakes/FakeBlobProvider2.cs | 2 +- .../Abp/BlobStoring/{Providers => }/Fakes/FakeProviders.cs | 2 +- .../Volo/Abp/BlobStoring/TestObjects/TestContainer1.cs | 7 +++++++ .../{Containers => }/TestObjects/TestContainer2.cs | 2 +- .../Volo/Abp/BlobStoring/TestObjects/TestContainer3.cs | 7 +++++++ 31 files changed, 46 insertions(+), 59 deletions(-) rename framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/{Containers => }/BlobContainerConfiguration.cs (97%) rename framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/{Containers => }/BlobContainerConfigurationDictionary.cs (97%) rename framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/{Containers => }/BlobContainerFactory.cs (96%) rename framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/{Containers => }/BlobContainerFactoryExtensions.cs (94%) rename framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/{Containers => }/BlobContainerNameAttribute.cs (95%) rename framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/{Containers => }/BlobContainerToProviderAdapter.cs (97%) rename framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/{Providers => }/BlobProviderArgs.cs (92%) rename framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/{Providers => }/BlobProviderDeleteArgs.cs (86%) rename framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/{Providers => }/BlobProviderExistsArgs.cs (86%) rename framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/{Providers => }/BlobProviderGetArgs.cs (86%) rename framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/{Providers => }/BlobProviderSaveArgs.cs (94%) rename framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/{Containers => }/DefaultContainer.cs (66%) rename framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/{Containers => }/IBlobContainer.cs (98%) rename framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/{Containers => }/IBlobContainerFactory.cs (92%) rename framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/{Providers => }/IBlobProvider.cs (91%) rename framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/{Containers => }/TypedBlobContainerWrapper.cs (97%) rename framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/{Containers => }/BlobContainerFactory_Tests.cs (93%) rename framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/{Containers => }/BlobContainerNameAttribute_Tests.cs (85%) rename framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/{Containers => }/BlobContainer_Injection_Tests.cs (91%) delete mode 100644 framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/TestObjects/TestContainer1.cs delete mode 100644 framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/TestObjects/TestContainer3.cs rename framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/{Providers => }/Fakes/FakeBlobProvider1.cs (94%) rename framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/{Providers => }/Fakes/FakeBlobProvider2.cs (94%) rename framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/{Providers => }/Fakes/FakeProviders.cs (91%) create mode 100644 framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestObjects/TestContainer1.cs rename framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/{Containers => }/TestObjects/TestContainer2.cs (60%) create mode 100644 framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestObjects/TestContainer3.cs diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringModule.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringModule.cs index 99806d605b..aec7b013e8 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringModule.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringModule.cs @@ -1,5 +1,4 @@ using Microsoft.Extensions.DependencyInjection; -using Volo.Abp.BlobStoring.Containers; using Volo.Abp.Modularity; namespace Volo.Abp.BlobStoring diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringOptions.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringOptions.cs index 7f48243fe6..09f7ae34f0 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringOptions.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringOptions.cs @@ -1,6 +1,4 @@ -using Volo.Abp.BlobStoring.Containers; - -namespace Volo.Abp.BlobStoring +namespace Volo.Abp.BlobStoring { public class AbpBlobStoringOptions { diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/BlobContainerConfiguration.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfiguration.cs similarity index 97% rename from framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/BlobContainerConfiguration.cs rename to framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfiguration.cs index 5c78ccb991..c649ea3ffa 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/BlobContainerConfiguration.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfiguration.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using JetBrains.Annotations; -namespace Volo.Abp.BlobStoring.Containers +namespace Volo.Abp.BlobStoring { public class BlobContainerConfiguration { diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/BlobContainerConfigurationDictionary.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurationDictionary.cs similarity index 97% rename from framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/BlobContainerConfigurationDictionary.cs rename to framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurationDictionary.cs index 80a431867d..9475e6c355 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/BlobContainerConfigurationDictionary.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurationDictionary.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using JetBrains.Annotations; -namespace Volo.Abp.BlobStoring.Containers +namespace Volo.Abp.BlobStoring { public class BlobContainerConfigurationDictionary { diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/BlobContainerFactory.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs similarity index 96% rename from framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/BlobContainerFactory.cs rename to framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs index 3acb7528b0..ee5341c1da 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/BlobContainerFactory.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs @@ -4,11 +4,10 @@ using System.Linq; using System.Threading; using JetBrains.Annotations; using Microsoft.Extensions.Options; -using Volo.Abp.BlobStoring.Providers; using Volo.Abp.DependencyInjection; using Volo.Abp.DynamicProxy; -namespace Volo.Abp.BlobStoring.Containers +namespace Volo.Abp.BlobStoring { public class BlobContainerFactory : IBlobContainerFactory, ITransientDependency { diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/BlobContainerFactoryExtensions.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactoryExtensions.cs similarity index 94% rename from framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/BlobContainerFactoryExtensions.cs rename to framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactoryExtensions.cs index 69b1313c91..34483c1849 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/BlobContainerFactoryExtensions.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactoryExtensions.cs @@ -1,6 +1,6 @@ using System.Threading; -namespace Volo.Abp.BlobStoring.Containers +namespace Volo.Abp.BlobStoring { public static class BlobContainerFactoryExtensions { diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/BlobContainerNameAttribute.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerNameAttribute.cs similarity index 95% rename from framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/BlobContainerNameAttribute.cs rename to framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerNameAttribute.cs index 7b86e67259..12bd91d669 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/BlobContainerNameAttribute.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerNameAttribute.cs @@ -2,7 +2,7 @@ using System.Reflection; using JetBrains.Annotations; -namespace Volo.Abp.BlobStoring.Containers +namespace Volo.Abp.BlobStoring { public class BlobContainerNameAttribute : Attribute { diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/BlobContainerToProviderAdapter.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerToProviderAdapter.cs similarity index 97% rename from framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/BlobContainerToProviderAdapter.cs rename to framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerToProviderAdapter.cs index 0e134bf229..8ecd498a52 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/BlobContainerToProviderAdapter.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerToProviderAdapter.cs @@ -1,9 +1,8 @@ using System.IO; using System.Threading; using System.Threading.Tasks; -using Volo.Abp.BlobStoring.Providers; -namespace Volo.Abp.BlobStoring.Containers +namespace Volo.Abp.BlobStoring { public class BlobContainerToProviderAdapter : IBlobContainer { diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderArgs.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderArgs.cs similarity index 92% rename from framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderArgs.cs rename to framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderArgs.cs index f1175e0940..fcc264977a 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderArgs.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderArgs.cs @@ -1,8 +1,7 @@ using System.Threading; using JetBrains.Annotations; -using Volo.Abp.BlobStoring.Containers; -namespace Volo.Abp.BlobStoring.Providers +namespace Volo.Abp.BlobStoring { public abstract class BlobProviderArgs { diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderDeleteArgs.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderDeleteArgs.cs similarity index 86% rename from framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderDeleteArgs.cs rename to framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderDeleteArgs.cs index 3f1b78b5c1..146074d444 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderDeleteArgs.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderDeleteArgs.cs @@ -1,8 +1,7 @@ using System.Threading; using JetBrains.Annotations; -using Volo.Abp.BlobStoring.Containers; -namespace Volo.Abp.BlobStoring.Providers +namespace Volo.Abp.BlobStoring { public class BlobProviderDeleteArgs : BlobProviderArgs { diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderExistsArgs.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderExistsArgs.cs similarity index 86% rename from framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderExistsArgs.cs rename to framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderExistsArgs.cs index 3a6d0e90c5..dee2e144f7 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderExistsArgs.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderExistsArgs.cs @@ -1,8 +1,7 @@ using System.Threading; using JetBrains.Annotations; -using Volo.Abp.BlobStoring.Containers; -namespace Volo.Abp.BlobStoring.Providers +namespace Volo.Abp.BlobStoring { public class BlobProviderExistsArgs : BlobProviderArgs { diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderGetArgs.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderGetArgs.cs similarity index 86% rename from framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderGetArgs.cs rename to framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderGetArgs.cs index 3a92eb0a9c..f3087e9805 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderGetArgs.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderGetArgs.cs @@ -1,8 +1,7 @@ using System.Threading; using JetBrains.Annotations; -using Volo.Abp.BlobStoring.Containers; -namespace Volo.Abp.BlobStoring.Providers +namespace Volo.Abp.BlobStoring { public class BlobProviderGetArgs : BlobProviderArgs { diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderSaveArgs.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderSaveArgs.cs similarity index 94% rename from framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderSaveArgs.cs rename to framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderSaveArgs.cs index 9ae8faa603..d1a5f3845e 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/BlobProviderSaveArgs.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderSaveArgs.cs @@ -1,9 +1,8 @@ using System.IO; using System.Threading; using JetBrains.Annotations; -using Volo.Abp.BlobStoring.Containers; -namespace Volo.Abp.BlobStoring.Providers +namespace Volo.Abp.BlobStoring { public class BlobProviderSaveArgs { diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/DefaultContainer.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/DefaultContainer.cs similarity index 66% rename from framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/DefaultContainer.cs rename to framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/DefaultContainer.cs index 7afc3c83ac..64f907e564 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/DefaultContainer.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/DefaultContainer.cs @@ -1,4 +1,4 @@ -namespace Volo.Abp.BlobStoring.Containers +namespace Volo.Abp.BlobStoring { [BlobContainerName("Default")] public class DefaultContainer diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/IBlobContainer.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobContainer.cs similarity index 98% rename from framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/IBlobContainer.cs rename to framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobContainer.cs index 9c96244655..a596565b5f 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/IBlobContainer.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobContainer.cs @@ -2,7 +2,7 @@ using System.Threading; using System.Threading.Tasks; -namespace Volo.Abp.BlobStoring.Containers +namespace Volo.Abp.BlobStoring { public interface IBlobContainer : IBlobContainer where TContainer: class diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/IBlobContainerFactory.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobContainerFactory.cs similarity index 92% rename from framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/IBlobContainerFactory.cs rename to framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobContainerFactory.cs index 7171542b07..8434e3ae23 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/IBlobContainerFactory.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobContainerFactory.cs @@ -1,6 +1,6 @@ using System.Threading; -namespace Volo.Abp.BlobStoring.Containers +namespace Volo.Abp.BlobStoring { public interface IBlobContainerFactory { diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/IBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobProvider.cs similarity index 91% rename from framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/IBlobProvider.cs rename to framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobProvider.cs index 23e67502f0..be6a2dd648 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Providers/IBlobProvider.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobProvider.cs @@ -1,7 +1,7 @@ using System.IO; using System.Threading.Tasks; -namespace Volo.Abp.BlobStoring.Providers +namespace Volo.Abp.BlobStoring { public interface IBlobProvider { diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/TypedBlobContainerWrapper.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/TypedBlobContainerWrapper.cs similarity index 97% rename from framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/TypedBlobContainerWrapper.cs rename to framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/TypedBlobContainerWrapper.cs index a528795102..34d11bb46f 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/Containers/TypedBlobContainerWrapper.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/TypedBlobContainerWrapper.cs @@ -2,7 +2,7 @@ using System.Threading; using System.Threading.Tasks; -namespace Volo.Abp.BlobStoring.Containers +namespace Volo.Abp.BlobStoring { public class TypedBlobContainerWrapper : IBlobContainer where TContainer: class diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringOptions_Tests.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringOptions_Tests.cs index 9f538926ba..84193664fd 100644 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringOptions_Tests.cs +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringOptions_Tests.cs @@ -1,9 +1,8 @@ using System.Collections.Generic; using Microsoft.Extensions.Options; using Shouldly; -using Volo.Abp.BlobStoring.Containers; -using Volo.Abp.BlobStoring.Containers.TestObjects; -using Volo.Abp.BlobStoring.Providers.Fakes; +using Volo.Abp.BlobStoring.Fakes; +using Volo.Abp.BlobStoring.TestObjects; using Xunit; namespace Volo.Abp.BlobStoring diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringTestModule.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringTestModule.cs index 9283c6f8d0..0d150a20ea 100644 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringTestModule.cs +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringTestModule.cs @@ -1,9 +1,8 @@ using Microsoft.Extensions.DependencyInjection; using NSubstitute; using Volo.Abp.Autofac; -using Volo.Abp.BlobStoring.Containers.TestObjects; -using Volo.Abp.BlobStoring.Providers; -using Volo.Abp.BlobStoring.Providers.Fakes; +using Volo.Abp.BlobStoring.Fakes; +using Volo.Abp.BlobStoring.TestObjects; using Volo.Abp.Modularity; namespace Volo.Abp.BlobStoring diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/BlobContainerFactory_Tests.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainerFactory_Tests.cs similarity index 93% rename from framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/BlobContainerFactory_Tests.cs rename to framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainerFactory_Tests.cs index 70c6c509ad..359470106e 100644 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/BlobContainerFactory_Tests.cs +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainerFactory_Tests.cs @@ -1,11 +1,10 @@ using System.Threading.Tasks; using NSubstitute; -using Volo.Abp.BlobStoring.Containers.TestObjects; -using Volo.Abp.BlobStoring.Providers; -using Volo.Abp.BlobStoring.Providers.Fakes; +using Volo.Abp.BlobStoring.Fakes; +using Volo.Abp.BlobStoring.TestObjects; using Xunit; -namespace Volo.Abp.BlobStoring.Containers +namespace Volo.Abp.BlobStoring { public class BlobContainerFactory_Tests : AbpBlobStoringTestBase { diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/BlobContainerNameAttribute_Tests.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainerNameAttribute_Tests.cs similarity index 85% rename from framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/BlobContainerNameAttribute_Tests.cs rename to framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainerNameAttribute_Tests.cs index f332d1571a..242b195a0c 100644 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/BlobContainerNameAttribute_Tests.cs +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainerNameAttribute_Tests.cs @@ -1,8 +1,8 @@ using Shouldly; -using Volo.Abp.BlobStoring.Containers.TestObjects; +using Volo.Abp.BlobStoring.TestObjects; using Xunit; -namespace Volo.Abp.BlobStoring.Containers +namespace Volo.Abp.BlobStoring { public class BlobContainerNameAttribute_Tests { diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/BlobContainer_Injection_Tests.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainer_Injection_Tests.cs similarity index 91% rename from framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/BlobContainer_Injection_Tests.cs rename to framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainer_Injection_Tests.cs index 6e55922758..7dc74fa14c 100644 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/BlobContainer_Injection_Tests.cs +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainer_Injection_Tests.cs @@ -1,8 +1,8 @@ using Shouldly; -using Volo.Abp.BlobStoring.Containers.TestObjects; +using Volo.Abp.BlobStoring.TestObjects; using Xunit; -namespace Volo.Abp.BlobStoring.Containers +namespace Volo.Abp.BlobStoring { public class BlobContainer_Injection_Tests : AbpBlobStoringTestBase { diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/TestObjects/TestContainer1.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/TestObjects/TestContainer1.cs deleted file mode 100644 index 9000e2857d..0000000000 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/TestObjects/TestContainer1.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Volo.Abp.BlobStoring.Containers.TestObjects -{ - public class TestContainer1 - { - - } -} \ No newline at end of file diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/TestObjects/TestContainer3.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/TestObjects/TestContainer3.cs deleted file mode 100644 index 8d7f8629c2..0000000000 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/TestObjects/TestContainer3.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Volo.Abp.BlobStoring.Containers.TestObjects -{ - public class TestContainer3 - { - - } -} \ No newline at end of file diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Providers/Fakes/FakeBlobProvider1.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Fakes/FakeBlobProvider1.cs similarity index 94% rename from framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Providers/Fakes/FakeBlobProvider1.cs rename to framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Fakes/FakeBlobProvider1.cs index 7eef06cb92..38fef18d66 100644 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Providers/Fakes/FakeBlobProvider1.cs +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Fakes/FakeBlobProvider1.cs @@ -1,7 +1,7 @@ using System.IO; using System.Threading.Tasks; -namespace Volo.Abp.BlobStoring.Providers.Fakes +namespace Volo.Abp.BlobStoring.Fakes { public class FakeBlobProvider1 : IBlobProvider { diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Providers/Fakes/FakeBlobProvider2.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Fakes/FakeBlobProvider2.cs similarity index 94% rename from framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Providers/Fakes/FakeBlobProvider2.cs rename to framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Fakes/FakeBlobProvider2.cs index 666a862f75..dc0e40d3d8 100644 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Providers/Fakes/FakeBlobProvider2.cs +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Fakes/FakeBlobProvider2.cs @@ -1,7 +1,7 @@ using System.IO; using System.Threading.Tasks; -namespace Volo.Abp.BlobStoring.Providers.Fakes +namespace Volo.Abp.BlobStoring.Fakes { public class FakeBlobProvider2 : IBlobProvider { diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Providers/Fakes/FakeProviders.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Fakes/FakeProviders.cs similarity index 91% rename from framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Providers/Fakes/FakeProviders.cs rename to framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Fakes/FakeProviders.cs index cb5754acde..e66e8b6adc 100644 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Providers/Fakes/FakeProviders.cs +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Fakes/FakeProviders.cs @@ -2,7 +2,7 @@ using System.Linq; using Volo.Abp.DependencyInjection; -namespace Volo.Abp.BlobStoring.Providers.Fakes +namespace Volo.Abp.BlobStoring.Fakes { public class FakeProviders : ISingletonDependency { diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestObjects/TestContainer1.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestObjects/TestContainer1.cs new file mode 100644 index 0000000000..61c84a1148 --- /dev/null +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestObjects/TestContainer1.cs @@ -0,0 +1,7 @@ +namespace Volo.Abp.BlobStoring.TestObjects +{ + public class TestContainer1 + { + + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/TestObjects/TestContainer2.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestObjects/TestContainer2.cs similarity index 60% rename from framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/TestObjects/TestContainer2.cs rename to framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestObjects/TestContainer2.cs index 48add50d24..3193da3749 100644 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/Containers/TestObjects/TestContainer2.cs +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestObjects/TestContainer2.cs @@ -1,4 +1,4 @@ -namespace Volo.Abp.BlobStoring.Containers.TestObjects +namespace Volo.Abp.BlobStoring.TestObjects { [BlobContainerName("Test2")] public class TestContainer2 diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestObjects/TestContainer3.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestObjects/TestContainer3.cs new file mode 100644 index 0000000000..b96a71c1b7 --- /dev/null +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/TestObjects/TestContainer3.cs @@ -0,0 +1,7 @@ +namespace Volo.Abp.BlobStoring.TestObjects +{ + public class TestContainer3 + { + + } +} \ No newline at end of file From 9b32873a69b6c0312459de44fd41750af83f852b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 26 May 2020 10:27:08 +0300 Subject: [PATCH 17/27] Created FileSystemBlobProvider. Renamed blob container classes. --- ...temBlobContainerConfigurationExtensions.cs | 24 +++ .../FileSystem/FileSystemBlobProvider.cs | 79 ++++++++ .../FileSystemBlobProviderConfiguration.cs | 19 ++ ...ileSystemBlobProviderConfigurationNames.cs | 8 + .../Volo.Abp.BlobStoring.csproj | 2 + .../Abp/BlobStoring/AbpBlobStoringModule.cs | 8 +- .../Volo/Abp/BlobStoring/BlobContainer.cs | 190 ++++++++++++++++++ .../BlobStoring/BlobContainerConfiguration.cs | 37 ++-- .../BlobContainerConfigurationExtensions.cs | 27 +++ .../Abp/BlobStoring/BlobContainerFactory.cs | 24 ++- .../BlobContainerToProviderAdapter.cs | 99 --------- .../Volo/Abp/BlobStoring/BlobProviderArgs.cs | 7 +- .../Volo/Abp/BlobStoring/BlobProviderBase.cs | 28 +++ .../Abp/BlobStoring/BlobProviderDeleteArgs.cs | 5 +- .../Abp/BlobStoring/BlobProviderExistsArgs.cs | 5 +- .../Abp/BlobStoring/BlobProviderGetArgs.cs | 5 +- .../Abp/BlobStoring/BlobProviderSaveArgs.cs | 27 +-- .../Volo/Abp/BlobStoring/IBlobProvider.cs | 3 +- .../BlobStoring/TypedBlobContainerWrapper.cs | 42 ---- .../Volo/Abp/IO/DirectoryHelper.cs | 8 + .../Volo.Abp.Core/Volo/Abp/IO/FileHelper.cs | 9 +- .../BlobContainer_Injection_Tests.cs | 10 +- 22 files changed, 476 insertions(+), 190 deletions(-) create mode 100644 framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobContainerConfigurationExtensions.cs create mode 100644 framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobProvider.cs create mode 100644 framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobProviderConfiguration.cs create mode 100644 framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobProviderConfigurationNames.cs create mode 100644 framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainer.cs create mode 100644 framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurationExtensions.cs delete mode 100644 framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerToProviderAdapter.cs create mode 100644 framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderBase.cs delete mode 100644 framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/TypedBlobContainerWrapper.cs diff --git a/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobContainerConfigurationExtensions.cs b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobContainerConfigurationExtensions.cs new file mode 100644 index 0000000000..24357554eb --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobContainerConfigurationExtensions.cs @@ -0,0 +1,24 @@ +using System; + +namespace Volo.Abp.BlobStoring.FileSystem +{ + public static class FileSystemBlobContainerConfigurationExtensions + { + public static FileSystemBlobProviderConfiguration GetFileSystemConfiguration( + this BlobContainerConfiguration containerConfiguration) + { + return new FileSystemBlobProviderConfiguration(containerConfiguration); + } + + public static BlobContainerConfiguration UseFileSystem( + this BlobContainerConfiguration containerConfiguration, + Action fileSystemConfigureAction) + { + containerConfiguration.ProviderType = typeof(FileSystemBlobProvider); + + fileSystemConfigureAction(new FileSystemBlobProviderConfiguration(containerConfiguration)); + + return containerConfiguration; + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobProvider.cs new file mode 100644 index 0000000000..55ed50a45b --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobProvider.cs @@ -0,0 +1,79 @@ +using System.IO; +using System.Threading.Tasks; +using Volo.Abp.IO; + +namespace Volo.Abp.BlobStoring.FileSystem +{ + //TODO: What if the file is being used on create, delete or read? + + public class FileSystemBlobProvider : BlobProviderBase + { + public override async Task SaveAsync(BlobProviderSaveArgs args) + { + var filePath = CalculateBlobFilePath(args); + + DirectoryHelper.CreateIfNotExists(Path.GetDirectoryName(filePath)); + + var fileMode = args.OverrideExisting + ? FileMode.Create + : FileMode.CreateNew; + + using (var fileStream = File.Open(filePath, fileMode, FileAccess.Write)) + { + //TODO: Truely implement this (like this? http://writeasync.net/?p=2621 or https://www.infoworld.com/article/2995387/how-to-perform-asynchronous-file-operations-in-c.html) + + await args.BlobStream.CopyToAsync( + fileStream, + 81920, //this is already the default value, but needed to set to be able to pass the cancellationToken + args.CancellationToken + ); + + await fileStream.FlushAsync(); + } + } + + public override Task DeleteAsync(BlobProviderDeleteArgs args) + { + var filePath = CalculateBlobFilePath(args); + + return Task.FromResult(FileHelper.DeleteIfExists(filePath)); + } + + public override Task ExistsAsync(BlobProviderExistsArgs args) + { + var filePath = CalculateBlobFilePath(args); + + return Task.FromResult(File.Exists(filePath)); + } + + public override Task GetOrNullAsync(BlobProviderGetArgs args) + { + var filePath = CalculateBlobFilePath(args); + + if (!File.Exists(filePath)) + { + return Task.FromResult(null); + } + + return Task.FromResult(File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)); + } + + protected virtual string CalculateBlobFilePath(BlobProviderArgs args) + { + var blobPath = args.Configuration.GetFileSystemConfiguration().BasePath; + + if (args.TenantId == null) + { + blobPath = Path.Combine(blobPath, "host"); + } + else + { + blobPath = Path.Combine(blobPath, "tenants", args.TenantId.Value.ToString("D")); + } + + blobPath = Path.Combine(blobPath, args.ContainerName, args.BlobName); + + return blobPath; + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobProviderConfiguration.cs b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobProviderConfiguration.cs new file mode 100644 index 0000000000..f6a700d09a --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobProviderConfiguration.cs @@ -0,0 +1,19 @@ +namespace Volo.Abp.BlobStoring.FileSystem +{ + public class FileSystemBlobProviderConfiguration + { + + public string BasePath + { + get => _containerConfiguration.GetConfiguration(FileSystemBlobProviderConfigurationNames.BasePath); + set => _containerConfiguration.SetConfiguration(FileSystemBlobProviderConfigurationNames.BasePath, Check.NotNullOrWhiteSpace(value, nameof(value))); + } + + private readonly BlobContainerConfiguration _containerConfiguration; + + public FileSystemBlobProviderConfiguration(BlobContainerConfiguration containerConfiguration) + { + _containerConfiguration = containerConfiguration; + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobProviderConfigurationNames.cs b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobProviderConfigurationNames.cs new file mode 100644 index 0000000000..6670f6f76e --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobProviderConfigurationNames.cs @@ -0,0 +1,8 @@ +namespace Volo.Abp.BlobStoring.FileSystem +{ + public static class FileSystemBlobProviderConfigurationNames + { + public const string BasePath = "BasePath"; + + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring/Volo.Abp.BlobStoring.csproj b/framework/src/Volo.Abp.BlobStoring/Volo.Abp.BlobStoring.csproj index cbf13cea87..850f98b5f1 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo.Abp.BlobStoring.csproj +++ b/framework/src/Volo.Abp.BlobStoring/Volo.Abp.BlobStoring.csproj @@ -16,6 +16,8 @@ + + diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringModule.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringModule.cs index aec7b013e8..35970ea169 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringModule.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringModule.cs @@ -1,15 +1,21 @@ using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Modularity; +using Volo.Abp.MultiTenancy; +using Volo.Abp.Threading; namespace Volo.Abp.BlobStoring { + [DependsOn( + typeof(AbpMultiTenancyModule), + typeof(AbpThreadingModule) + )] public class AbpBlobStoringModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { context.Services.AddTransient( typeof(IBlobContainer<>), - typeof(TypedBlobContainerWrapper<>) + typeof(BlobContainer<>) ); context.Services.AddTransient( diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainer.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainer.cs new file mode 100644 index 0000000000..859c5f85be --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainer.cs @@ -0,0 +1,190 @@ +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.MultiTenancy; +using Volo.Abp.Threading; + +namespace Volo.Abp.BlobStoring +{ + public class BlobContainer : IBlobContainer + where TContainer : class + { + private readonly IBlobContainer _container; + + public BlobContainer(IBlobContainerFactory blobContainerFactory) + { + _container = blobContainerFactory.Create(); + } + + public Task SaveAsync( + string name, + Stream stream, + bool overrideExisting = false, + CancellationToken cancellationToken = default) + { + return _container.SaveAsync( + name, + stream, + overrideExisting, + cancellationToken + ); + } + + public Task DeleteAsync( + string name, + CancellationToken cancellationToken = default) + { + return _container.DeleteAsync( + name, + cancellationToken + ); + } + + public Task ExistsAsync( + string name, + CancellationToken cancellationToken = default) + { + return _container.ExistsAsync( + name, + cancellationToken + ); + } + + public Task GetAsync( + string name, + CancellationToken cancellationToken = default) + { + return _container.GetAsync( + name, + cancellationToken + ); + } + + public Task GetOrNullAsync( + string name, + CancellationToken cancellationToken = default) + { + return _container.GetOrNullAsync( + name, + cancellationToken + ); + } + } + + public class BlobContainer : IBlobContainer + { + protected string ContainerName { get; } + + protected BlobContainerConfiguration Configuration { get; } + + protected IBlobProvider Provider { get; } + + protected ICurrentTenant CurrentTenant { get; } + + protected ICancellationTokenProvider CancellationTokenProvider { get; } + + public BlobContainer( + string containerName, + BlobContainerConfiguration configuration, + IBlobProvider provider, + ICurrentTenant currentTenant, + ICancellationTokenProvider cancellationTokenProvider) + { + ContainerName = containerName; + Configuration = configuration; + Provider = provider; + CurrentTenant = currentTenant; + CancellationTokenProvider = cancellationTokenProvider; + } + + public virtual Task SaveAsync( + string name, + Stream stream, + bool overrideExisting = false, + CancellationToken cancellationToken = default) + { + return Provider.SaveAsync( + new BlobProviderSaveArgs( + ContainerName, + Configuration, + name, + stream, + overrideExisting, + GetTenantIdOrNull(), + CancellationTokenProvider.FallbackToProvider(cancellationToken) + ) + ); + } + + public virtual Task DeleteAsync( + string name, + CancellationToken cancellationToken = default) + { + return Provider.DeleteAsync( + new BlobProviderDeleteArgs( + ContainerName, + Configuration, + name, + GetTenantIdOrNull(), + CancellationTokenProvider.FallbackToProvider(cancellationToken) + ) + ); + } + + public virtual Task ExistsAsync( + string name, + CancellationToken cancellationToken = default) + { + return Provider.ExistsAsync( + new BlobProviderExistsArgs( + ContainerName, + Configuration, + name, + GetTenantIdOrNull(), + CancellationTokenProvider.FallbackToProvider(cancellationToken) + ) + ); + } + + public virtual Task GetAsync( + string name, + CancellationToken cancellationToken = default) + { + return Provider.GetAsync( + new BlobProviderGetArgs( + ContainerName, + Configuration, + name, + GetTenantIdOrNull(), + CancellationTokenProvider.FallbackToProvider(cancellationToken) + ) + ); + } + + public virtual Task GetOrNullAsync( + string name, + CancellationToken cancellationToken = default) + { + return Provider.GetOrNullAsync( + new BlobProviderGetArgs( + ContainerName, + Configuration, + name, + GetTenantIdOrNull(), + CancellationTokenProvider.FallbackToProvider(cancellationToken) + ) + ); + } + + protected virtual Guid? GetTenantIdOrNull() + { + if (!Configuration.IsMultiTenant) + { + return null; + } + + return CurrentTenant.Id; + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfiguration.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfiguration.cs index c649ea3ffa..46f13a1c3d 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfiguration.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfiguration.cs @@ -6,14 +6,27 @@ namespace Volo.Abp.BlobStoring { public class BlobContainerConfiguration { + /// + /// The provider to be used to store BLOBs of this container. + /// public Type ProviderType { get; set; } - [NotNull] - private readonly Dictionary _properties; - - [CanBeNull] - private readonly BlobContainerConfiguration _fallbackConfiguration; - + /// + /// Indicates whether this container is multi-tenant or not. + /// + /// If this is false and your application is multi-tenant, + /// then the container is shared by all tenants in the system. + /// + /// This can be true even if your application is not multi-tenant. + /// + /// Default: true. + /// + public bool IsMultiTenant { get; set; } = true; + + [NotNull] private readonly Dictionary _properties; + + [CanBeNull] private readonly BlobContainerConfiguration _fallbackConfiguration; + public BlobContainerConfiguration(BlobContainerConfiguration fallbackConfiguration = null) { _fallbackConfiguration = fallbackConfiguration; @@ -25,7 +38,7 @@ namespace Volo.Abp.BlobStoring { return (T) GetConfigurationOrNull(name, defaultValue); } - + [CanBeNull] public object GetConfigurationOrNull(string name, object defaultValue = null) { @@ -33,25 +46,25 @@ namespace Volo.Abp.BlobStoring _fallbackConfiguration?.GetConfigurationOrNull(name, defaultValue) ?? defaultValue; } - + [NotNull] public BlobContainerConfiguration SetConfiguration([NotNull] string name, [CanBeNull] object value) { Check.NotNullOrWhiteSpace(name, nameof(name)); Check.NotNull(value, nameof(value)); - + _properties[name] = value; - + return this; } - + [NotNull] public BlobContainerConfiguration ClearConfiguration([NotNull] string name) { Check.NotNullOrWhiteSpace(name, nameof(name)); _properties.Remove(name); - + return this; } } diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurationExtensions.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurationExtensions.cs new file mode 100644 index 0000000000..ca437b0ad0 --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurationExtensions.cs @@ -0,0 +1,27 @@ +using JetBrains.Annotations; + +namespace Volo.Abp.BlobStoring +{ + public static class BlobContainerConfigurationExtensions + { + public static T GetConfiguration( + [NotNull] this BlobContainerConfiguration containerConfiguration, + [NotNull] string name) + { + return (T) containerConfiguration.GetConfiguration(name); + } + + public static object GetConfiguration( + [NotNull] this BlobContainerConfiguration containerConfiguration, + [NotNull] string name) + { + var value = containerConfiguration.GetConfigurationOrNull(name); + if (value == null) + { + throw new AbpException($"Could not find the configuration value for '{name}'!"); + } + + return value; + } + } +} \ No newline at end of file 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 ee5341c1da..33b511fa55 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs @@ -6,30 +6,42 @@ using JetBrains.Annotations; using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; using Volo.Abp.DynamicProxy; +using Volo.Abp.MultiTenancy; +using Volo.Abp.Threading; namespace Volo.Abp.BlobStoring { public class BlobContainerFactory : IBlobContainerFactory, ITransientDependency { - public IEnumerable BlobProviders { get; } - protected AbpBlobStoringOptions Options { get; } + protected IEnumerable BlobProviders { get; } + + protected ICurrentTenant CurrentTenant { get; } + + protected ICancellationTokenProvider CancellationTokenProvider { get; } + public BlobContainerFactory( IOptions options, - IEnumerable blobProviders) + IEnumerable blobProviders, + ICurrentTenant currentTenant, + ICancellationTokenProvider cancellationTokenProvider) { - BlobProviders = blobProviders; Options = options.Value; + BlobProviders = blobProviders; + CurrentTenant = currentTenant; + CancellationTokenProvider = cancellationTokenProvider; } public virtual IBlobContainer Create(string name, CancellationToken cancellationToken = default) { var configuration = Options.Containers.GetConfiguration(name); - return new BlobContainerToProviderAdapter( + return new BlobContainer( name, configuration, - GetProvider(name, configuration) + GetProvider(name, configuration), + CurrentTenant, + CancellationTokenProvider ); } diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerToProviderAdapter.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerToProviderAdapter.cs deleted file mode 100644 index 8ecd498a52..0000000000 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerToProviderAdapter.cs +++ /dev/null @@ -1,99 +0,0 @@ -using System.IO; -using System.Threading; -using System.Threading.Tasks; - -namespace Volo.Abp.BlobStoring -{ - public class BlobContainerToProviderAdapter : IBlobContainer - { - protected string ContainerName { get; } - - protected BlobContainerConfiguration ContainerConfiguration { get; } - - protected IBlobProvider Provider { get; } - - public BlobContainerToProviderAdapter( - string containerName, - BlobContainerConfiguration containerConfiguration, - IBlobProvider provider) - { - ContainerName = containerName; - ContainerConfiguration = containerConfiguration; - Provider = provider; - } - - public virtual Task SaveAsync( - string name, - Stream stream, - bool overrideExisting = false, - CancellationToken cancellationToken = default) - { - return Provider.SaveAsync( - new BlobProviderSaveArgs( - ContainerName, - ContainerConfiguration, - name, - stream, - overrideExisting, - cancellationToken - ) - ); - } - - public virtual Task DeleteAsync( - string name, - CancellationToken cancellationToken = default) - { - return Provider.DeleteAsync( - new BlobProviderDeleteArgs( - ContainerName, - ContainerConfiguration, - name, - cancellationToken - ) - ); - } - - public virtual Task ExistsAsync( - string name, - CancellationToken cancellationToken = default) - { - return Provider.ExistsAsync( - new BlobProviderExistsArgs( - ContainerName, - ContainerConfiguration, - name, - cancellationToken - ) - ); - } - - public virtual Task GetAsync( - string name, - CancellationToken cancellationToken = default) - { - return Provider.GetAsync( - new BlobProviderGetArgs( - ContainerName, - ContainerConfiguration, - name, - cancellationToken - ) - ); - } - - public virtual Task GetOrNullAsync( - string name, - CancellationToken cancellationToken = default) - { - return Provider.GetOrNullAsync( - new BlobProviderGetArgs( - ContainerName, - ContainerConfiguration, - name, - cancellationToken - ) - ); - } - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderArgs.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderArgs.cs index fcc264977a..e1ad228839 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderArgs.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderArgs.cs @@ -1,4 +1,5 @@ -using System.Threading; +using System; +using System.Threading; using JetBrains.Annotations; namespace Volo.Abp.BlobStoring @@ -15,16 +16,20 @@ namespace Volo.Abp.BlobStoring public string BlobName { get; } public CancellationToken CancellationToken { get; } + + public Guid? TenantId { get; } protected BlobProviderArgs( [NotNull] string containerName, [NotNull] BlobContainerConfiguration configuration, [NotNull] string blobName, + [CanBeNull] Guid? tenantId = null, CancellationToken cancellationToken = default) { ContainerName = Check.NotNullOrWhiteSpace(containerName, nameof(containerName)); Configuration = Check.NotNull(configuration, nameof(configuration)); BlobName = Check.NotNullOrWhiteSpace(blobName, nameof(blobName)); + TenantId = tenantId; CancellationToken = cancellationToken; } } diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderBase.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderBase.cs new file mode 100644 index 0000000000..eb047acf2d --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderBase.cs @@ -0,0 +1,28 @@ +using System.IO; +using System.Threading.Tasks; + +namespace Volo.Abp.BlobStoring +{ + public abstract class BlobProviderBase : IBlobProvider + { + public abstract Task SaveAsync(BlobProviderSaveArgs args); + + public abstract Task DeleteAsync(BlobProviderDeleteArgs args); + + public abstract Task ExistsAsync(BlobProviderExistsArgs args); + + public virtual async Task GetAsync(BlobProviderGetArgs args) + { + var result = await GetOrNullAsync(args); + if (result == null) + { + //TODO: Consider to throw some type of "not found" exception and handle on the HTTP status side + throw new AbpException($"Could not found the requested BLOB '{args.BlobName}' in the container '{args.ContainerName}'!"); + } + + return result; + } + + public abstract Task GetOrNullAsync(BlobProviderGetArgs args); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderDeleteArgs.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderDeleteArgs.cs index 146074d444..aa4aae1eb2 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderDeleteArgs.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderDeleteArgs.cs @@ -1,4 +1,5 @@ -using System.Threading; +using System; +using System.Threading; using JetBrains.Annotations; namespace Volo.Abp.BlobStoring @@ -9,11 +10,13 @@ namespace Volo.Abp.BlobStoring [NotNull] string containerName, [NotNull] BlobContainerConfiguration configuration, [NotNull] string blobName, + [CanBeNull] Guid? tenantId = null, CancellationToken cancellationToken = default) : base( containerName, configuration, blobName, + tenantId, cancellationToken) { } diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderExistsArgs.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderExistsArgs.cs index dee2e144f7..a55b22a233 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderExistsArgs.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderExistsArgs.cs @@ -1,4 +1,5 @@ -using System.Threading; +using System; +using System.Threading; using JetBrains.Annotations; namespace Volo.Abp.BlobStoring @@ -9,11 +10,13 @@ namespace Volo.Abp.BlobStoring [NotNull] string containerName, [NotNull] BlobContainerConfiguration configuration, [NotNull] string blobName, + [CanBeNull] Guid? tenantId = null, CancellationToken cancellationToken = default) : base( containerName, configuration, blobName, + tenantId, cancellationToken) { } diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderGetArgs.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderGetArgs.cs index f3087e9805..94374698c7 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderGetArgs.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderGetArgs.cs @@ -1,4 +1,5 @@ -using System.Threading; +using System; +using System.Threading; using JetBrains.Annotations; namespace Volo.Abp.BlobStoring @@ -9,11 +10,13 @@ namespace Volo.Abp.BlobStoring [NotNull] string containerName, [NotNull] BlobContainerConfiguration configuration, [NotNull] string blobName, + [CanBeNull] Guid? tenantId = null, CancellationToken cancellationToken = default) : base( containerName, configuration, blobName, + tenantId, cancellationToken) { } diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderSaveArgs.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderSaveArgs.cs index d1a5f3845e..a81938fb7d 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderSaveArgs.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderSaveArgs.cs @@ -1,41 +1,34 @@ -using System.IO; +using System; +using System.IO; using System.Threading; using JetBrains.Annotations; namespace Volo.Abp.BlobStoring { - public class BlobProviderSaveArgs + public class BlobProviderSaveArgs : BlobProviderArgs { - [NotNull] - public string ContainerName { get; } - - [NotNull] - public BlobContainerConfiguration Configuration { get; } - - [NotNull] - public string BlobName { get; } - [NotNull] public Stream BlobStream { get; } public bool OverrideExisting { get; } - public CancellationToken CancellationToken { get; } - public BlobProviderSaveArgs( [NotNull] string containerName, [NotNull] BlobContainerConfiguration configuration, [NotNull] string blobName, [NotNull] Stream blobStream, bool overrideExisting = false, + [CanBeNull] Guid? tenantId = null, CancellationToken cancellationToken = default) + : base( + containerName, + configuration, + blobName, + tenantId, + cancellationToken) { - ContainerName = Check.NotNullOrWhiteSpace(containerName, nameof(containerName)); - Configuration = Check.NotNull(configuration, nameof(configuration)); - BlobName = Check.NotNullOrWhiteSpace(blobName, nameof(blobName)); BlobStream = Check.NotNull(blobStream, nameof(blobStream)); OverrideExisting = overrideExisting; - CancellationToken = cancellationToken; } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobProvider.cs index be6a2dd648..a1546e3159 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobProvider.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobProvider.cs @@ -1,4 +1,5 @@ -using System.IO; +using System; +using System.IO; using System.Threading.Tasks; namespace Volo.Abp.BlobStoring diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/TypedBlobContainerWrapper.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/TypedBlobContainerWrapper.cs deleted file mode 100644 index 34d11bb46f..0000000000 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/TypedBlobContainerWrapper.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System.IO; -using System.Threading; -using System.Threading.Tasks; - -namespace Volo.Abp.BlobStoring -{ - public class TypedBlobContainerWrapper : IBlobContainer - where TContainer: class - { - private readonly IBlobContainer _container; - - public TypedBlobContainerWrapper(IBlobContainerFactory blobContainerFactory) - { - _container = blobContainerFactory.Create(); - } - - public Task SaveAsync(string name, Stream stream, bool overrideExisting = false, CancellationToken cancellationToken = default) - { - return _container.SaveAsync(name, stream, overrideExisting, cancellationToken); - } - - public Task DeleteAsync(string name, CancellationToken cancellationToken = default) - { - return _container.DeleteAsync(name, cancellationToken); - } - - public Task ExistsAsync(string name, CancellationToken cancellationToken = default) - { - return _container.ExistsAsync(name, cancellationToken); - } - - public Task GetAsync(string name, CancellationToken cancellationToken = default) - { - return _container.GetAsync(name, cancellationToken); - } - - public Task GetOrNullAsync(string name, CancellationToken cancellationToken = default) - { - return _container.GetOrNullAsync(name, cancellationToken); - } - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/IO/DirectoryHelper.cs b/framework/src/Volo.Abp.Core/Volo/Abp/IO/DirectoryHelper.cs index b864695430..23f8de610a 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/IO/DirectoryHelper.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/IO/DirectoryHelper.cs @@ -16,6 +16,14 @@ namespace Volo.Abp.IO Directory.CreateDirectory(directory); } } + + public static void CreateIfNotExists(DirectoryInfo directory) + { + if (!directory.Exists) + { + directory.Create(); + } + } public static bool IsSubDirectoryOf([NotNull] string parentDirectoryPath, [NotNull] string childDirectoryPath) { diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/IO/FileHelper.cs b/framework/src/Volo.Abp.Core/Volo/Abp/IO/FileHelper.cs index a945784352..8f4a15bdf5 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/IO/FileHelper.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/IO/FileHelper.cs @@ -17,12 +17,15 @@ namespace Volo.Abp.IO /// Checks and deletes given file if it does exists. /// /// Path of the file - public static void DeleteIfExists(string filePath) + public static bool DeleteIfExists(string filePath) { - if (File.Exists(filePath)) + if (!File.Exists(filePath)) { - File.Delete(filePath); + return false; } + + File.Delete(filePath); + return true; } /// diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainer_Injection_Tests.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainer_Injection_Tests.cs index 7dc74fa14c..bd4ec2c47a 100644 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainer_Injection_Tests.cs +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobContainer_Injection_Tests.cs @@ -10,23 +10,23 @@ namespace Volo.Abp.BlobStoring public void Should_Inject_DefaultContainer_For_Non_Generic_Interface() { GetRequiredService() - .ShouldBeOfType>(); + .ShouldBeOfType>(); } [Fact] public void Should_Inject_Specified_Container_For_Generic_Interface() { GetRequiredService>() - .ShouldBeOfType>(); + .ShouldBeOfType>(); GetRequiredService>() - .ShouldBeOfType>(); + .ShouldBeOfType>(); GetRequiredService>() - .ShouldBeOfType>(); + .ShouldBeOfType>(); GetRequiredService>() - .ShouldBeOfType>(); + .ShouldBeOfType>(); } } } \ No newline at end of file From cb1f33b01a95fa6641ed1733cd8731f477fe1a3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 26 May 2020 11:05:16 +0300 Subject: [PATCH 18/27] Register FileSystemBlobProvider to DI. --- .../Volo/Abp/BlobStoring/FileSystem/FileSystemBlobProvider.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobProvider.cs index 55ed50a45b..23b8ea45d6 100644 --- a/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobProvider.cs +++ b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobProvider.cs @@ -1,12 +1,13 @@ using System.IO; using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; using Volo.Abp.IO; namespace Volo.Abp.BlobStoring.FileSystem { //TODO: What if the file is being used on create, delete or read? - public class FileSystemBlobProvider : BlobProviderBase + public class FileSystemBlobProvider : BlobProviderBase, ITransientDependency { public override async Task SaveAsync(BlobProviderSaveArgs args) { From 96491312d0f2ba18b94797ca079fa5feadaf8e01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 26 May 2020 11:10:48 +0300 Subject: [PATCH 19/27] Remove IBlobProvider.GetAsync --- .../Volo/Abp/BlobStoring/BlobContainer.cs | 10 +++++++++- .../Volo/Abp/BlobStoring/BlobProviderBase.cs | 12 ------------ .../Volo/Abp/BlobStoring/IBlobProvider.cs | 2 -- 3 files changed, 9 insertions(+), 15 deletions(-) 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 859c5f85be..700549e957 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainer.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainer.cs @@ -151,7 +151,7 @@ namespace Volo.Abp.BlobStoring string name, CancellationToken cancellationToken = default) { - return Provider.GetAsync( + var stream = Provider.GetOrNullAsync( new BlobProviderGetArgs( ContainerName, Configuration, @@ -160,6 +160,14 @@ namespace Volo.Abp.BlobStoring CancellationTokenProvider.FallbackToProvider(cancellationToken) ) ); + + if (stream == null) + { + //TODO: Consider to throw some type of "not found" exception and handle on the HTTP status side + throw new AbpException($"Could not found the requested BLOB '{name}' in the container '{ContainerName}'!"); + } + + return stream; } public virtual Task GetOrNullAsync( 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 eb047acf2d..b1aafb6903 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderBase.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderBase.cs @@ -11,18 +11,6 @@ namespace Volo.Abp.BlobStoring public abstract Task ExistsAsync(BlobProviderExistsArgs args); - public virtual async Task GetAsync(BlobProviderGetArgs args) - { - var result = await GetOrNullAsync(args); - if (result == null) - { - //TODO: Consider to throw some type of "not found" exception and handle on the HTTP status side - throw new AbpException($"Could not found the requested BLOB '{args.BlobName}' in the container '{args.ContainerName}'!"); - } - - return result; - } - public abstract Task GetOrNullAsync(BlobProviderGetArgs args); } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobProvider.cs index a1546e3159..d7332589c5 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobProvider.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobProvider.cs @@ -12,8 +12,6 @@ namespace Volo.Abp.BlobStoring Task ExistsAsync(BlobProviderExistsArgs args); - Task GetAsync(BlobProviderGetArgs args); - Task GetOrNullAsync(BlobProviderGetArgs args); } } \ No newline at end of file From 2df975c90aef1282b51d8bd694f1ffb48956fa0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 26 May 2020 11:20:43 +0300 Subject: [PATCH 20/27] Extract DefaultBlobContainerConfigurationProvider to allow to customize getting the configuration. --- ...ontainerConfigurationProviderExtensions.cs | 11 ++++++++++ .../Abp/BlobStoring/BlobContainerFactory.cs | 11 +++++----- ...faultBlobContainerConfigurationProvider.cs | 20 +++++++++++++++++++ .../IBlobContainerConfigurationProvider.cs | 7 +++++++ .../AbpBlobStoringOptions_Tests.cs | 13 +++++------- 5 files changed, 48 insertions(+), 14 deletions(-) create mode 100644 framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurationProviderExtensions.cs create mode 100644 framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/DefaultBlobContainerConfigurationProvider.cs create mode 100644 framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobContainerConfigurationProvider.cs diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurationProviderExtensions.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurationProviderExtensions.cs new file mode 100644 index 0000000000..a199d8a72f --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurationProviderExtensions.cs @@ -0,0 +1,11 @@ +namespace Volo.Abp.BlobStoring +{ + public static class BlobContainerConfigurationProviderExtensions + { + public static BlobContainerConfiguration Get( + this IBlobContainerConfigurationProvider configurationProvider) + { + return configurationProvider.Get(BlobContainerNameAttribute.GetContainerName()); + } + } +} \ No newline at end of file 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 33b511fa55..dd56035d09 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using JetBrains.Annotations; -using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; using Volo.Abp.DynamicProxy; using Volo.Abp.MultiTenancy; @@ -13,29 +12,29 @@ namespace Volo.Abp.BlobStoring { public class BlobContainerFactory : IBlobContainerFactory, ITransientDependency { - protected AbpBlobStoringOptions Options { get; } - protected IEnumerable BlobProviders { get; } + + protected IBlobContainerConfigurationProvider ConfigurationProvider { get; } protected ICurrentTenant CurrentTenant { get; } protected ICancellationTokenProvider CancellationTokenProvider { get; } public BlobContainerFactory( - IOptions options, IEnumerable blobProviders, + IBlobContainerConfigurationProvider configurationProvider, ICurrentTenant currentTenant, ICancellationTokenProvider cancellationTokenProvider) { - Options = options.Value; BlobProviders = blobProviders; + ConfigurationProvider = configurationProvider; CurrentTenant = currentTenant; CancellationTokenProvider = cancellationTokenProvider; } public virtual IBlobContainer Create(string name, CancellationToken cancellationToken = default) { - var configuration = Options.Containers.GetConfiguration(name); + var configuration = ConfigurationProvider.Get(name); return new BlobContainer( name, configuration, diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/DefaultBlobContainerConfigurationProvider.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/DefaultBlobContainerConfigurationProvider.cs new file mode 100644 index 0000000000..a30d584c9d --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/DefaultBlobContainerConfigurationProvider.cs @@ -0,0 +1,20 @@ +using Microsoft.Extensions.Options; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.BlobStoring +{ + public class DefaultBlobContainerConfigurationProvider : IBlobContainerConfigurationProvider, ITransientDependency + { + protected AbpBlobStoringOptions Options { get; } + + public DefaultBlobContainerConfigurationProvider(IOptions options) + { + Options = options.Value; + } + + public virtual BlobContainerConfiguration Get(string name) + { + return Options.Containers.GetConfiguration(name); + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobContainerConfigurationProvider.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobContainerConfigurationProvider.cs new file mode 100644 index 0000000000..f984a903a2 --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobContainerConfigurationProvider.cs @@ -0,0 +1,7 @@ +namespace Volo.Abp.BlobStoring +{ + public interface IBlobContainerConfigurationProvider + { + BlobContainerConfiguration Get(string name); + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringOptions_Tests.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringOptions_Tests.cs index 84193664fd..53c7c2079d 100644 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringOptions_Tests.cs +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringOptions_Tests.cs @@ -9,24 +9,22 @@ namespace Volo.Abp.BlobStoring { public class AbpBlobStoringOptions_Tests : AbpBlobStoringTestBase { - private readonly AbpBlobStoringOptions _options; + private readonly IBlobContainerConfigurationProvider _configurationProvider; public AbpBlobStoringOptions_Tests() { - _options = GetRequiredService>().Value; + _configurationProvider = GetRequiredService(); } [Fact] public void Should_Property_Set_And_Get_Options_For_Different_Containers() { - var testContainer1Config = _options.Containers - .GetConfiguration(BlobContainerNameAttribute.GetContainerName()); + var testContainer1Config = _configurationProvider.Get(); testContainer1Config.ProviderType.ShouldBe(typeof(FakeBlobProvider1)); testContainer1Config.GetConfigurationOrDefault("TestConfig1").ShouldBe("TestValue1"); testContainer1Config.GetConfigurationOrDefault("TestConfigDefault").ShouldBe("TestValueDefault"); - var testContainer2Config = _options.Containers - .GetConfiguration(BlobContainerNameAttribute.GetContainerName()); + var testContainer2Config = _configurationProvider.Get(); testContainer2Config.ProviderType.ShouldBe(typeof(FakeBlobProvider2)); testContainer2Config.GetConfigurationOrNull("TestConfig2").ShouldBe("TestValue2"); testContainer2Config.GetConfigurationOrNull("TestConfigDefault").ShouldBe("TestValueDefault"); @@ -35,8 +33,7 @@ namespace Volo.Abp.BlobStoring [Fact] public void Should_Fallback_To_Default_Configuration_If_Not_Specialized() { - var config = _options.Containers - .GetConfiguration(BlobContainerNameAttribute.GetContainerName()); + var config = _configurationProvider.Get(); config.ProviderType.ShouldBe(typeof(FakeBlobProvider1)); config.GetConfigurationOrNull("TestConfigDefault").ShouldBe("TestValueDefault"); } From 56542c4a30f8b16dcc2a5ba2e5cbc43a7f80ae77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 26 May 2020 11:26:09 +0300 Subject: [PATCH 21/27] Rename BlobContainerConfigurationDictionary to BlobContainerConfigurations --- .../Abp/BlobStoring/AbpBlobStoringOptions.cs | 4 ++-- ...ionary.cs => BlobContainerConfigurations.cs} | 17 +++++++---------- 2 files changed, 9 insertions(+), 12 deletions(-) rename framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/{BlobContainerConfigurationDictionary.cs => BlobContainerConfigurations.cs} (73%) diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringOptions.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringOptions.cs index 09f7ae34f0..4ed0ce69a0 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringOptions.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/AbpBlobStoringOptions.cs @@ -2,11 +2,11 @@ { public class AbpBlobStoringOptions { - public BlobContainerConfigurationDictionary Containers { get; } + public BlobContainerConfigurations Containers { get; } public AbpBlobStoringOptions() { - Containers = new BlobContainerConfigurationDictionary(); + Containers = new BlobContainerConfigurations(); } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurationDictionary.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurations.cs similarity index 73% rename from framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurationDictionary.cs rename to framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurations.cs index 9475e6c355..5e17793f21 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurationDictionary.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfigurations.cs @@ -4,19 +4,19 @@ using JetBrains.Annotations; namespace Volo.Abp.BlobStoring { - public class BlobContainerConfigurationDictionary + public class BlobContainerConfigurations { public BlobContainerConfiguration Default { get; } private readonly Dictionary _containers; - public BlobContainerConfigurationDictionary() + public BlobContainerConfigurations() { Default = new BlobContainerConfiguration(); _containers = new Dictionary(); } - public BlobContainerConfigurationDictionary Configure( + public BlobContainerConfigurations Configure( Action configureAction) { return Configure( @@ -25,7 +25,7 @@ namespace Volo.Abp.BlobStoring ); } - public BlobContainerConfigurationDictionary Configure( + public BlobContainerConfigurations Configure( [NotNull] string name, [NotNull] Action configureAction) { @@ -37,19 +37,16 @@ namespace Volo.Abp.BlobStoring return this; } - public BlobContainerConfigurationDictionary ConfigureDefault(Action configureAction) + public BlobContainerConfigurations ConfigureDefault(Action configureAction) { configureAction(Default); return this; } [NotNull] - public BlobContainerConfiguration GetConfiguration([NotNull] string name) + public BlobContainerConfiguration GetConfiguration() { - Check.NotNullOrWhiteSpace(name, nameof(name)); - - return _containers.GetOrDefault(name) ?? - Default; + return GetConfiguration(BlobContainerNameAttribute.GetContainerName()); } [NotNull] From e42a0b49fb6f91fd8ee5104822be96ca6ea38fe4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 26 May 2020 11:52:06 +0300 Subject: [PATCH 22/27] Added AppendContainerNameToBasePath option to the file system blob provider. --- .../BlobStoring/FileSystem/FileSystemBlobProvider.cs | 10 ++++++++-- .../FileSystem/FileSystemBlobProviderConfiguration.cs | 9 +++++++++ .../FileSystemBlobProviderConfigurationNames.cs | 4 ++-- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobProvider.cs index 23b8ea45d6..4de039982f 100644 --- a/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobProvider.cs +++ b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobProvider.cs @@ -61,7 +61,8 @@ namespace Volo.Abp.BlobStoring.FileSystem protected virtual string CalculateBlobFilePath(BlobProviderArgs args) { - var blobPath = args.Configuration.GetFileSystemConfiguration().BasePath; + var fileSystemConfiguration = args.Configuration.GetFileSystemConfiguration(); + var blobPath = fileSystemConfiguration.BasePath; if (args.TenantId == null) { @@ -72,7 +73,12 @@ namespace Volo.Abp.BlobStoring.FileSystem blobPath = Path.Combine(blobPath, "tenants", args.TenantId.Value.ToString("D")); } - blobPath = Path.Combine(blobPath, args.ContainerName, args.BlobName); + if (fileSystemConfiguration.AppendContainerNameToBasePath) + { + blobPath = Path.Combine(blobPath, args.ContainerName); + } + + blobPath = Path.Combine(blobPath, args.BlobName); return blobPath; } diff --git a/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobProviderConfiguration.cs b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobProviderConfiguration.cs index f6a700d09a..442744c4f3 100644 --- a/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobProviderConfiguration.cs +++ b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobProviderConfiguration.cs @@ -9,6 +9,15 @@ set => _containerConfiguration.SetConfiguration(FileSystemBlobProviderConfigurationNames.BasePath, Check.NotNullOrWhiteSpace(value, nameof(value))); } + /// + /// Default value: true. + /// + public bool AppendContainerNameToBasePath + { + get => _containerConfiguration.GetConfigurationOrDefault(FileSystemBlobProviderConfigurationNames.AppendContainerNameToBasePath, true); + set => _containerConfiguration.SetConfiguration(FileSystemBlobProviderConfigurationNames.BasePath, value); + } + private readonly BlobContainerConfiguration _containerConfiguration; public FileSystemBlobProviderConfiguration(BlobContainerConfiguration containerConfiguration) diff --git a/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobProviderConfigurationNames.cs b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobProviderConfigurationNames.cs index 6670f6f76e..56991fa0ea 100644 --- a/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobProviderConfigurationNames.cs +++ b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobProviderConfigurationNames.cs @@ -2,7 +2,7 @@ { public static class FileSystemBlobProviderConfigurationNames { - public const string BasePath = "BasePath"; - + public const string BasePath = "FileSystem.BasePath"; + public const string AppendContainerNameToBasePath = "FileSystem.AppendContainerNameToBasePath"; } } \ No newline at end of file From 67fb2ddda2e7d877c4e2339f5ce05ce09374f550 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 26 May 2020 11:52:27 +0300 Subject: [PATCH 23/27] Added initial test code to AbpBlobStoringFileSystemTestModule --- .../AbpBlobStoringFileSystemTestModule.cs | 16 +++++++++++++++- .../FileSystem/TestObjects/TestContainer.cs | 8 ++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo/Abp/BlobStoring/FileSystem/TestObjects/TestContainer.cs diff --git a/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo/Abp/BlobStoring/FileSystem/AbpBlobStoringFileSystemTestModule.cs b/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo/Abp/BlobStoring/FileSystem/AbpBlobStoringFileSystemTestModule.cs index 925f7b6783..35fc30b84d 100644 --- a/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo/Abp/BlobStoring/FileSystem/AbpBlobStoringFileSystemTestModule.cs +++ b/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo/Abp/BlobStoring/FileSystem/AbpBlobStoringFileSystemTestModule.cs @@ -1,4 +1,6 @@ using System; +using System.IO; +using Volo.Abp.BlobStoring.FileSystem.TestObjects; using Volo.Abp.Modularity; namespace Volo.Abp.BlobStoring.FileSystem @@ -8,6 +10,18 @@ namespace Volo.Abp.BlobStoring.FileSystem )] public class AbpBlobStoringFileSystemTestModule : AbpModule { - + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.Containers.ConfigureDefault(container => + { + container.UseFileSystem(fileSystem => + { + fileSystem.BasePath = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString("N")); + }); + }); + }); + } } } \ No newline at end of file diff --git a/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo/Abp/BlobStoring/FileSystem/TestObjects/TestContainer.cs b/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo/Abp/BlobStoring/FileSystem/TestObjects/TestContainer.cs new file mode 100644 index 0000000000..91ac79f6c3 --- /dev/null +++ b/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo/Abp/BlobStoring/FileSystem/TestObjects/TestContainer.cs @@ -0,0 +1,8 @@ +namespace Volo.Abp.BlobStoring.FileSystem.TestObjects +{ + [BlobContainerName("TestContainer")] + public class TestContainer + { + + } +} \ No newline at end of file From ae59120bed54c4b748d944d2268891440aa6bed7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 26 May 2020 12:00:52 +0300 Subject: [PATCH 24/27] Extract IBlobProviderSelector. --- .../Abp/BlobStoring/BlobContainerFactory.cs | 41 +++------------- .../BlobProviderSelectorExtensions.cs | 15 ++++++ .../DefaultBlobProviderSelector.cs | 49 +++++++++++++++++++ .../Abp/BlobStoring/IBlobProviderSelector.cs | 10 ++++ 4 files changed, 81 insertions(+), 34 deletions(-) create mode 100644 framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderSelectorExtensions.cs create mode 100644 framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/DefaultBlobProviderSelector.cs create mode 100644 framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobProviderSelector.cs 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 dd56035d09..62f6aa7a73 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs @@ -1,10 +1,5 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using JetBrains.Annotations; +using System.Threading; using Volo.Abp.DependencyInjection; -using Volo.Abp.DynamicProxy; using Volo.Abp.MultiTenancy; using Volo.Abp.Threading; @@ -12,7 +7,7 @@ namespace Volo.Abp.BlobStoring { public class BlobContainerFactory : IBlobContainerFactory, ITransientDependency { - protected IEnumerable BlobProviders { get; } + protected IBlobProviderSelector ProviderSelector { get; } protected IBlobContainerConfigurationProvider ConfigurationProvider { get; } @@ -21,50 +16,28 @@ namespace Volo.Abp.BlobStoring protected ICancellationTokenProvider CancellationTokenProvider { get; } public BlobContainerFactory( - IEnumerable blobProviders, IBlobContainerConfigurationProvider configurationProvider, ICurrentTenant currentTenant, - ICancellationTokenProvider cancellationTokenProvider) + ICancellationTokenProvider cancellationTokenProvider, + IBlobProviderSelector providerSelector) { - BlobProviders = blobProviders; ConfigurationProvider = configurationProvider; CurrentTenant = currentTenant; CancellationTokenProvider = cancellationTokenProvider; + ProviderSelector = providerSelector; } public virtual IBlobContainer Create(string name, CancellationToken cancellationToken = default) { var configuration = ConfigurationProvider.Get(name); + return new BlobContainer( name, configuration, - GetProvider(name, configuration), + ProviderSelector.Get(name), CurrentTenant, CancellationTokenProvider ); } - - [NotNull] - protected virtual IBlobProvider GetProvider( - string containerName, - BlobContainerConfiguration configuration) - { - if (!BlobProviders.Any()) - { - throw new AbpException("No BLOB Storage provider was registered! At least one provider must be registered to be able to use the Blog Storing System."); - } - - foreach (var provider in BlobProviders) - { - if (ProxyHelper.GetUnProxiedType(provider).IsAssignableTo(configuration.ProviderType)) - { - return provider; - } - } - - throw new AbpException( - $"Could not find the BLOB Storage provider with the type ({configuration.ProviderType.AssemblyQualifiedName}) configured for the container {containerName} and no default provider was set." - ); - } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderSelectorExtensions.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderSelectorExtensions.cs new file mode 100644 index 0000000000..5a760ed51c --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderSelectorExtensions.cs @@ -0,0 +1,15 @@ +using JetBrains.Annotations; + +namespace Volo.Abp.BlobStoring +{ + public static class BlobProviderSelectorExtensions + { + public static IBlobProvider Get( + [NotNull] IBlobProviderSelector selector) + { + Check.NotNull(selector, nameof(selector)); + + return selector.Get(BlobContainerNameAttribute.GetContainerName()); + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/DefaultBlobProviderSelector.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/DefaultBlobProviderSelector.cs new file mode 100644 index 0000000000..5f604155ca --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/DefaultBlobProviderSelector.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using JetBrains.Annotations; +using Volo.Abp.DependencyInjection; +using Volo.Abp.DynamicProxy; + +namespace Volo.Abp.BlobStoring +{ + public class DefaultBlobProviderSelector : IBlobProviderSelector, ITransientDependency + { + protected IEnumerable BlobProviders { get; } + + protected IBlobContainerConfigurationProvider ConfigurationProvider { get; } + + public DefaultBlobProviderSelector( + IBlobContainerConfigurationProvider configurationProvider, + IEnumerable blobProviders) + { + ConfigurationProvider = configurationProvider; + BlobProviders = blobProviders; + } + + [NotNull] + public virtual IBlobProvider Get([NotNull] string containerName) + { + Check.NotNull(containerName, nameof(containerName)); + + var configuration = ConfigurationProvider.Get(containerName); + + if (!BlobProviders.Any()) + { + throw new AbpException("No BLOB Storage provider was registered! At least one provider must be registered to be able to use the Blog Storing System."); + } + + foreach (var provider in BlobProviders) + { + if (ProxyHelper.GetUnProxiedType(provider).IsAssignableTo(configuration.ProviderType)) + { + return provider; + } + } + + throw new AbpException( + $"Could not find the BLOB Storage provider with the type ({configuration.ProviderType.AssemblyQualifiedName}) configured for the container {containerName} and no default provider was set." + ); + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobProviderSelector.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobProviderSelector.cs new file mode 100644 index 0000000000..defb8f0804 --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobProviderSelector.cs @@ -0,0 +1,10 @@ +using JetBrains.Annotations; + +namespace Volo.Abp.BlobStoring +{ + public interface IBlobProviderSelector + { + [NotNull] + IBlobProvider Get([NotNull] string containerName); + } +} \ No newline at end of file From a8bd4c2ca256e8c4eaed53184a5bcd9b83a4f24c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 26 May 2020 12:13:52 +0300 Subject: [PATCH 25/27] Added BlobProviderSelector_Tests. --- .../BlobProviderSelectorExtensions.cs | 2 +- .../BlobStoring/BlobProviderSelector_Tests.cs | 31 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobProviderSelector_Tests.cs diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderSelectorExtensions.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderSelectorExtensions.cs index 5a760ed51c..1d484ebd2e 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderSelectorExtensions.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobProviderSelectorExtensions.cs @@ -5,7 +5,7 @@ namespace Volo.Abp.BlobStoring public static class BlobProviderSelectorExtensions { public static IBlobProvider Get( - [NotNull] IBlobProviderSelector selector) + [NotNull] this IBlobProviderSelector selector) { Check.NotNull(selector, nameof(selector)); diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobProviderSelector_Tests.cs b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobProviderSelector_Tests.cs new file mode 100644 index 0000000000..f36129c19d --- /dev/null +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/BlobProviderSelector_Tests.cs @@ -0,0 +1,31 @@ +using Shouldly; +using Volo.Abp.BlobStoring.Fakes; +using Volo.Abp.BlobStoring.TestObjects; +using Volo.Abp.DynamicProxy; +using Xunit; + +namespace Volo.Abp.BlobStoring +{ + public class BlobProviderSelector_Tests : AbpBlobStoringTestBase + { + private readonly IBlobProviderSelector _selector; + + public BlobProviderSelector_Tests() + { + _selector = GetRequiredService(); + } + + [Fact] + public void Should_Select_Default_Provider_If_Not_Configured() + { + _selector.Get().ShouldBeAssignableTo(); + } + + [Fact] + public void Should_Select_Configured_Provider() + { + _selector.Get().ShouldBeAssignableTo(); + _selector.Get().ShouldBeAssignableTo(); + } + } +} \ No newline at end of file From 3a7a3fea009141ad1314b6921acb738572da7bbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 26 May 2020 12:39:12 +0300 Subject: [PATCH 26/27] Added tests. --- .../DefaultBlogFilePathCalculator.cs | 32 ++++++++++ .../FileSystem/FileSystemBlobProvider.cs | 39 ++++-------- .../FileSystemBlobProviderConfiguration.cs | 2 +- .../FileSystem/IBlogFilePathCalculator.cs | 7 +++ .../BlogFilePathCalculator_Tests.cs | 60 +++++++++++++++++++ 5 files changed, 111 insertions(+), 29 deletions(-) create mode 100644 framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/DefaultBlogFilePathCalculator.cs create mode 100644 framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/IBlogFilePathCalculator.cs create mode 100644 framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo/Abp/BlobStoring/FileSystem/BlogFilePathCalculator_Tests.cs diff --git a/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/DefaultBlogFilePathCalculator.cs b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/DefaultBlogFilePathCalculator.cs new file mode 100644 index 0000000000..62c2585375 --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/DefaultBlogFilePathCalculator.cs @@ -0,0 +1,32 @@ +using System.IO; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.BlobStoring.FileSystem +{ + public class DefaultBlogFilePathCalculator : IBlogFilePathCalculator, ITransientDependency + { + public virtual string Calculate(BlobProviderArgs args) + { + var fileSystemConfiguration = args.Configuration.GetFileSystemConfiguration(); + var blobPath = fileSystemConfiguration.BasePath; + + if (args.TenantId == null) + { + blobPath = Path.Combine(blobPath, "host"); + } + else + { + blobPath = Path.Combine(blobPath, "tenants", args.TenantId.Value.ToString("D")); + } + + if (fileSystemConfiguration.AppendContainerNameToBasePath) + { + blobPath = Path.Combine(blobPath, args.ContainerName); + } + + blobPath = Path.Combine(blobPath, args.BlobName); + + return blobPath; + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobProvider.cs index 4de039982f..b927bdbf47 100644 --- a/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobProvider.cs +++ b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobProvider.cs @@ -9,9 +9,16 @@ namespace Volo.Abp.BlobStoring.FileSystem public class FileSystemBlobProvider : BlobProviderBase, ITransientDependency { + protected IBlogFilePathCalculator FilePathCalculator { get; } + + public FileSystemBlobProvider(IBlogFilePathCalculator filePathCalculator) + { + FilePathCalculator = filePathCalculator; + } + public override async Task SaveAsync(BlobProviderSaveArgs args) { - var filePath = CalculateBlobFilePath(args); + var filePath = FilePathCalculator.Calculate(args); DirectoryHelper.CreateIfNotExists(Path.GetDirectoryName(filePath)); @@ -35,21 +42,21 @@ namespace Volo.Abp.BlobStoring.FileSystem public override Task DeleteAsync(BlobProviderDeleteArgs args) { - var filePath = CalculateBlobFilePath(args); + var filePath = FilePathCalculator.Calculate(args); return Task.FromResult(FileHelper.DeleteIfExists(filePath)); } public override Task ExistsAsync(BlobProviderExistsArgs args) { - var filePath = CalculateBlobFilePath(args); + var filePath = FilePathCalculator.Calculate(args); return Task.FromResult(File.Exists(filePath)); } public override Task GetOrNullAsync(BlobProviderGetArgs args) { - var filePath = CalculateBlobFilePath(args); + var filePath = FilePathCalculator.Calculate(args); if (!File.Exists(filePath)) { @@ -58,29 +65,5 @@ namespace Volo.Abp.BlobStoring.FileSystem return Task.FromResult(File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)); } - - protected virtual string CalculateBlobFilePath(BlobProviderArgs args) - { - var fileSystemConfiguration = args.Configuration.GetFileSystemConfiguration(); - var blobPath = fileSystemConfiguration.BasePath; - - if (args.TenantId == null) - { - blobPath = Path.Combine(blobPath, "host"); - } - else - { - blobPath = Path.Combine(blobPath, "tenants", args.TenantId.Value.ToString("D")); - } - - if (fileSystemConfiguration.AppendContainerNameToBasePath) - { - blobPath = Path.Combine(blobPath, args.ContainerName); - } - - blobPath = Path.Combine(blobPath, args.BlobName); - - return blobPath; - } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobProviderConfiguration.cs b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobProviderConfiguration.cs index 442744c4f3..4d4a786d16 100644 --- a/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobProviderConfiguration.cs +++ b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobProviderConfiguration.cs @@ -15,7 +15,7 @@ public bool AppendContainerNameToBasePath { get => _containerConfiguration.GetConfigurationOrDefault(FileSystemBlobProviderConfigurationNames.AppendContainerNameToBasePath, true); - set => _containerConfiguration.SetConfiguration(FileSystemBlobProviderConfigurationNames.BasePath, value); + set => _containerConfiguration.SetConfiguration(FileSystemBlobProviderConfigurationNames.AppendContainerNameToBasePath, value); } private readonly BlobContainerConfiguration _containerConfiguration; diff --git a/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/IBlogFilePathCalculator.cs b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/IBlogFilePathCalculator.cs new file mode 100644 index 0000000000..9e4ec4713a --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/IBlogFilePathCalculator.cs @@ -0,0 +1,7 @@ +namespace Volo.Abp.BlobStoring.FileSystem +{ + public interface IBlogFilePathCalculator + { + string Calculate(BlobProviderArgs args); + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo/Abp/BlobStoring/FileSystem/BlogFilePathCalculator_Tests.cs b/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo/Abp/BlobStoring/FileSystem/BlogFilePathCalculator_Tests.cs new file mode 100644 index 0000000000..a8a02fb7af --- /dev/null +++ b/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo/Abp/BlobStoring/FileSystem/BlogFilePathCalculator_Tests.cs @@ -0,0 +1,60 @@ +using System; +using System.IO; +using Shouldly; +using Xunit; + +namespace Volo.Abp.BlobStoring.FileSystem +{ + public class BlogFilePathCalculator_Tests : AbpBlobStoringFileSystemTestBase + { + private readonly IBlogFilePathCalculator _calculator; + + public BlogFilePathCalculator_Tests() + { + _calculator = GetRequiredService(); + } + + [Fact] + public void Default_Settings() + { + var separator = Path.DirectorySeparatorChar; + + _calculator.Calculate( + GetArgs($"C:{separator}my-files","my-container","my-blob") + ).ShouldBe($"C:{separator}my-files{separator}host{separator}my-container{separator}my-blob"); + } + + [Fact] + public void AppendContainerNameToBasePath_Set_To_False() + { + var separator = Path.DirectorySeparatorChar; + + _calculator.Calculate( + GetArgs($"C:{separator}my-files","my-container","my-blob", appendContainerNameToBasePath: false) + ).ShouldBe($"C:{separator}my-files{separator}host{separator}my-blob"); + } + + private BlobProviderArgs GetArgs( + string basePath, + string containerName, + string blobName, + Guid? tenantId = null, + bool? appendContainerNameToBasePath = null) + { + return new BlobProviderGetArgs( + containerName, + new BlobContainerConfiguration() + .UseFileSystem(fs => + { + fs.BasePath = basePath; + if (appendContainerNameToBasePath.HasValue) + { + fs.AppendContainerNameToBasePath = appendContainerNameToBasePath.Value; + } + }), + blobName, + tenantId + ); + } + } +} \ No newline at end of file From c2fa54729d0eeb34831a9bfa48c733e4ac9727fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 26 May 2020 12:41:14 +0300 Subject: [PATCH 27/27] Added test: Default_Settings_With_TenantId --- .../BlogFilePathCalculator_Tests.cs | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo/Abp/BlobStoring/FileSystem/BlogFilePathCalculator_Tests.cs b/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo/Abp/BlobStoring/FileSystem/BlogFilePathCalculator_Tests.cs index a8a02fb7af..2493dab733 100644 --- a/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo/Abp/BlobStoring/FileSystem/BlogFilePathCalculator_Tests.cs +++ b/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo/Abp/BlobStoring/FileSystem/BlogFilePathCalculator_Tests.cs @@ -8,7 +8,7 @@ namespace Volo.Abp.BlobStoring.FileSystem public class BlogFilePathCalculator_Tests : AbpBlobStoringFileSystemTestBase { private readonly IBlogFilePathCalculator _calculator; - + public BlogFilePathCalculator_Tests() { _calculator = GetRequiredService(); @@ -18,26 +18,37 @@ namespace Volo.Abp.BlobStoring.FileSystem public void Default_Settings() { var separator = Path.DirectorySeparatorChar; - + _calculator.Calculate( - GetArgs($"C:{separator}my-files","my-container","my-blob") + GetArgs($"C:{separator}my-files", "my-container", "my-blob") ).ShouldBe($"C:{separator}my-files{separator}host{separator}my-container{separator}my-blob"); } - + + [Fact] + public void Default_Settings_With_TenantId() + { + var separator = Path.DirectorySeparatorChar; + var tenantId = Guid.NewGuid(); + + _calculator.Calculate( + GetArgs($"C:{separator}my-files", "my-container", "my-blob", tenantId: tenantId) + ).ShouldBe($"C:{separator}my-files{separator}tenants{separator}{tenantId:D}{separator}my-container{separator}my-blob"); + } + [Fact] public void AppendContainerNameToBasePath_Set_To_False() { var separator = Path.DirectorySeparatorChar; - + _calculator.Calculate( - GetArgs($"C:{separator}my-files","my-container","my-blob", appendContainerNameToBasePath: false) + GetArgs($"C:{separator}my-files", "my-container", "my-blob", appendContainerNameToBasePath: false) ).ShouldBe($"C:{separator}my-files{separator}host{separator}my-blob"); } private BlobProviderArgs GetArgs( string basePath, - string containerName, - string blobName, + string containerName, + string blobName, Guid? tenantId = null, bool? appendContainerNameToBasePath = null) {