Skip to content

Commit cbc1a75

Browse files
authored
Merge pull request #25619 from abpframework/auto-merge/rel-10-4/4647
Merge branch rel-10.5 with rel-10.4
2 parents 631e400 + eafbf8b commit cbc1a75

7 files changed

Lines changed: 131 additions & 15 deletions

File tree

framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfiguration.cs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,16 @@ namespace Volo.Abp.BlobStoring;
77

88
public class BlobContainerConfiguration
99
{
10+
private Type? _providerType;
11+
1012
/// <summary>
1113
/// The provider to be used to store BLOBs of this container.
1214
/// </summary>
13-
public Type? ProviderType { get; set; }
15+
public Type? ProviderType
16+
{
17+
get => _providerType ?? _fallbackConfiguration?.ProviderType;
18+
set => _providerType = value;
19+
}
1420

1521
/// <summary>
1622
/// Indicates whether this container is multi-tenant or not.
@@ -37,6 +43,20 @@ public BlobContainerConfiguration(BlobContainerConfiguration? fallbackConfigurat
3743
_properties = new Dictionary<string, object?>();
3844
}
3945

46+
/// <summary>
47+
/// Returns the naming normalizers in effect for this container, inheriting from the fallback
48+
/// configuration only when this container has none and does not override <see cref="ProviderType"/>.
49+
/// </summary>
50+
public IEnumerable<Type> GetEffectiveNamingNormalizers()
51+
{
52+
if (NamingNormalizers.Count == 0 && _providerType == null && _fallbackConfiguration != null)
53+
{
54+
return _fallbackConfiguration.GetEffectiveNamingNormalizers();
55+
}
56+
57+
return NamingNormalizers;
58+
}
59+
4060
public T? GetConfigurationOrDefault<T>(string name, T? defaultValue = default)
4161
{
4262
return (T?)GetConfigurationOrNull(name, defaultValue);

framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobNormalizeNamingService.cs

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,15 @@ public BlobNormalizeNaming NormalizeNaming(
1919
string? containerName,
2020
string? blobName)
2121
{
22-
23-
if (!configuration.NamingNormalizers.Any())
22+
var normalizerTypes = configuration.GetEffectiveNamingNormalizers();
23+
if (!normalizerTypes.Any())
2424
{
2525
return new BlobNormalizeNaming(containerName, blobName);
2626
}
2727

2828
using (var scope = ServiceProvider.CreateScope())
2929
{
30-
foreach (var normalizerType in configuration.NamingNormalizers)
30+
foreach (var normalizerType in normalizerTypes)
3131
{
3232
var normalizer = scope.ServiceProvider
3333
.GetRequiredService(normalizerType)
@@ -43,21 +43,11 @@ public BlobNormalizeNaming NormalizeNaming(
4343

4444
public string NormalizeContainerName(BlobContainerConfiguration configuration, string containerName)
4545
{
46-
if (!configuration.NamingNormalizers.Any())
47-
{
48-
return containerName;
49-
}
50-
5146
return NormalizeNaming(configuration, containerName, null).ContainerName!;
5247
}
5348

5449
public string NormalizeBlobName(BlobContainerConfiguration configuration, string blobName)
5550
{
56-
if (!configuration.NamingNormalizers.Any())
57-
{
58-
return blobName;
59-
}
60-
6151
return NormalizeNaming(configuration, null, blobName).BlobName!;
6252
}
6353
}

framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringOptions_Tests.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,22 @@ public void Should_Property_Set_And_Get_Options_For_Different_Containers()
2929
}
3030

3131
[Fact]
32-
public void Should_Fallback_To_Default_Configuration_If_Not_Specialized()
32+
public void Should_Fallback_To_Default_ProviderType_When_Not_Explicitly_Configured()
3333
{
3434
var config = _configurationProvider.Get<TestContainer3>();
3535
config.ProviderType.ShouldBe(typeof(FakeBlobProvider1));
36+
config.IsMultiTenant.ShouldBeFalse();
3637
config.GetConfigurationOrNull("TestConfigDefault").ShouldBe("TestValueDefault");
3738
}
39+
40+
[Fact]
41+
public void Should_Resolve_Fallback_Chain_Through_Configuration_Provider()
42+
{
43+
var testContainer1Config = _configurationProvider.Get<TestContainer1>();
44+
testContainer1Config.IsMultiTenant.ShouldBeTrue();
45+
46+
var testContainer3Config = _configurationProvider.Get<TestContainer3>();
47+
testContainer3Config.IsMultiTenant.ShouldBeFalse();
48+
testContainer3Config.ProviderType.ShouldBe(typeof(FakeBlobProvider1));
49+
}
3850
}

framework/test/Volo.Abp.BlobStoring.Tests/Volo/Abp/BlobStoring/AbpBlobStoringTestModule.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ public override void ConfigureServices(ServiceConfigurationContext context)
3636
{
3737
container.SetConfiguration("TestConfig2", "TestValue2");
3838
container.ProviderType = typeof(FakeBlobProvider2);
39+
})
40+
.Configure<TestContainer3>(container =>
41+
{
42+
container.IsMultiTenant = false;
3943
});
4044
});
4145
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
using System.Linq;
2+
using Shouldly;
3+
using Volo.Abp.BlobStoring.Fakes;
4+
using Xunit;
5+
6+
namespace Volo.Abp.BlobStoring;
7+
8+
public class BlobContainerConfiguration_Tests
9+
{
10+
[Fact]
11+
public void Should_Override_Default_Container_ProviderType_When_Named_Container_Has_Its_Own()
12+
{
13+
var defaultConfig = new BlobContainerConfiguration();
14+
defaultConfig.ProviderType = typeof(FakeBlobProvider1);
15+
16+
var namedConfig = new BlobContainerConfiguration(defaultConfig);
17+
namedConfig.ProviderType = typeof(FakeBlobProvider2);
18+
19+
namedConfig.ProviderType.ShouldBe(typeof(FakeBlobProvider2));
20+
defaultConfig.ProviderType.ShouldBe(typeof(FakeBlobProvider1));
21+
}
22+
23+
[Fact]
24+
public void Should_Inherit_Default_Container_NamingNormalizers_When_Provider_Also_Inherited()
25+
{
26+
var defaultConfig = new BlobContainerConfiguration();
27+
defaultConfig.ProviderType = typeof(FakeBlobProvider1);
28+
defaultConfig.NamingNormalizers.Add<FakeNamingNormalizer>();
29+
30+
var namedConfig = new BlobContainerConfiguration(defaultConfig);
31+
32+
namedConfig.GetEffectiveNamingNormalizers().ShouldContain(typeof(FakeNamingNormalizer));
33+
namedConfig.NamingNormalizers.ShouldBeEmpty();
34+
}
35+
36+
[Fact]
37+
public void Should_Not_Inherit_NamingNormalizers_When_Named_Container_Has_Its_Own_ProviderType()
38+
{
39+
var defaultConfig = new BlobContainerConfiguration();
40+
defaultConfig.ProviderType = typeof(FakeBlobProvider1);
41+
defaultConfig.NamingNormalizers.Add<FakeNamingNormalizer>();
42+
43+
var namedConfig = new BlobContainerConfiguration(defaultConfig);
44+
namedConfig.ProviderType = typeof(FakeBlobProvider2);
45+
46+
namedConfig.GetEffectiveNamingNormalizers().ShouldBeEmpty();
47+
}
48+
49+
[Fact]
50+
public void Should_Override_Default_Container_NamingNormalizers_When_Named_Container_Has_Its_Own()
51+
{
52+
var defaultConfig = new BlobContainerConfiguration();
53+
defaultConfig.NamingNormalizers.Add<FakeNamingNormalizer>();
54+
55+
var namedConfig = new BlobContainerConfiguration(defaultConfig);
56+
namedConfig.NamingNormalizers.Add<AnotherFakeNamingNormalizer>();
57+
58+
var effective = namedConfig.GetEffectiveNamingNormalizers().ToList();
59+
effective.ShouldContain(typeof(AnotherFakeNamingNormalizer));
60+
effective.ShouldNotContain(typeof(FakeNamingNormalizer));
61+
}
62+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
namespace Volo.Abp.BlobStoring.Fakes;
2+
3+
public class AnotherFakeNamingNormalizer : IBlobNamingNormalizer
4+
{
5+
public string NormalizeContainerName(string containerName)
6+
{
7+
return containerName;
8+
}
9+
10+
public string NormalizeBlobName(string blobName)
11+
{
12+
return blobName;
13+
}
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
namespace Volo.Abp.BlobStoring.Fakes;
2+
3+
public class FakeNamingNormalizer : IBlobNamingNormalizer
4+
{
5+
public string NormalizeContainerName(string containerName)
6+
{
7+
return containerName;
8+
}
9+
10+
public string NormalizeBlobName(string blobName)
11+
{
12+
return blobName;
13+
}
14+
}

0 commit comments

Comments
 (0)