Skip to content

Commit b036eb3

Browse files
committed
Performance: Added request cache to media type retrieval in media picker validation (#20405)
* Added request cache to media type retrieval in media picker validation. * Applied suggestions from code review.
1 parent 629e905 commit b036eb3

File tree

3 files changed

+25
-7
lines changed

3 files changed

+25
-7
lines changed

src/Umbraco.Infrastructure/PropertyEditors/MediaPicker3PropertyEditor.cs

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,8 @@ public MediaPicker3PropertyValueEditor(
8282
IDataTypeConfigurationCache dataTypeReadCache,
8383
ILocalizedTextService localizedTextService,
8484
IMediaTypeService mediaTypeService,
85-
IMediaNavigationQueryService mediaNavigationQueryService)
85+
IMediaNavigationQueryService mediaNavigationQueryService,
86+
AppCaches appCaches)
8687
: base(shortStringHelper, jsonSerializer, ioHelper, attribute)
8788
{
8889
_jsonSerializer = jsonSerializer;
@@ -95,7 +96,7 @@ public MediaPicker3PropertyValueEditor(
9596
var validators = new TypedJsonValidatorRunner<List<MediaWithCropsDto>, MediaPicker3Configuration>(
9697
jsonSerializer,
9798
new MinMaxValidator(localizedTextService),
98-
new AllowedTypeValidator(localizedTextService, mediaTypeService, _mediaService),
99+
new AllowedTypeValidator(localizedTextService, mediaTypeService, _mediaService, appCaches),
99100
new StartNodeValidator(localizedTextService, mediaNavigationQueryService));
100101

101102
Validators.Add(validators);
@@ -401,18 +402,22 @@ public IEnumerable<ValidationResult> Validate(
401402
/// </summary>
402403
internal sealed class AllowedTypeValidator : ITypedJsonValidator<List<MediaWithCropsDto>, MediaPicker3Configuration>
403404
{
405+
private const string MediaTypeCacheKeyFormat = nameof(AllowedTypeValidator) + "_MediaTypeKey_{0}";
406+
404407
private readonly ILocalizedTextService _localizedTextService;
405408
private readonly IMediaTypeService _mediaTypeService;
406409
private readonly IMediaService _mediaService;
410+
private readonly AppCaches _appCaches;
407411

408412
/// <summary>
409413
/// Initializes a new instance of the <see cref="AllowedTypeValidator"/> class.
410414
/// </summary>
411-
public AllowedTypeValidator(ILocalizedTextService localizedTextService, IMediaTypeService mediaTypeService, IMediaService mediaService)
415+
public AllowedTypeValidator(ILocalizedTextService localizedTextService, IMediaTypeService mediaTypeService, IMediaService mediaService, AppCaches appCaches)
412416
{
413417
_localizedTextService = localizedTextService;
414418
_mediaTypeService = mediaTypeService;
415419
_mediaService = mediaService;
420+
_appCaches = appCaches;
416421
}
417422

418423
/// <inheritdoc/>
@@ -452,9 +457,20 @@ public IEnumerable<ValidationResult> Validate(
452457

453458
foreach (var typeAlias in distinctTypeAliases)
454459
{
455-
IMediaType? type = _mediaTypeService.Get(typeAlias);
460+
// Cache media type lookups since the same media type is likely to be used multiple times in validation,
461+
// particularly if we have multiple languages and blocks.
462+
var cacheKey = string.Format(MediaTypeCacheKeyFormat, typeAlias);
463+
string? typeKey = _appCaches.RequestCache.GetCacheItem<string?>(cacheKey);
464+
if (typeKey is null)
465+
{
466+
typeKey = _mediaTypeService.Get(typeAlias)?.Key.ToString();
467+
if (typeKey is not null)
468+
{
469+
_appCaches.RequestCache.Set(cacheKey, typeKey);
470+
}
471+
}
456472

457-
if (type is null || allowedTypes.Contains(type.Key.ToString()) is false)
473+
if (typeKey is null || allowedTypes.Contains(typeKey) is false)
458474
{
459475
return
460476
[

tests/Umbraco.Tests.UnitTests/Umbraco.Core/PropertyEditors/DataValueReferenceFactoryCollectionTests.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ public class DataValueReferenceFactoryCollectionTests
4141
Mock.Of<IDataTypeConfigurationCache>(),
4242
Mock.Of<ILocalizedTextService>(),
4343
Mock.Of<IMediaTypeService>(),
44-
Mock.Of<IMediaNavigationQueryService>()));
44+
Mock.Of<IMediaNavigationQueryService>(),
45+
AppCaches.Disabled));
4546

4647
private IIOHelper IOHelper { get; } = Mock.Of<IIOHelper>();
4748

tests/Umbraco.Tests.UnitTests/Umbraco.Core/PropertyEditors/MediaPicker3ValueEditorValidationTests.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,8 @@ private static (MediaPicker3PropertyEditor.MediaPicker3PropertyValueEditor Value
218218
Mock.Of<IDataTypeConfigurationCache>(),
219219
Mock.Of<ILocalizedTextService>(),
220220
mediaTypeServiceMock.Object,
221-
mediaNavigationQueryServiceMock.Object)
221+
mediaNavigationQueryServiceMock.Object,
222+
AppCaches.Disabled)
222223
{
223224
ConfigurationObject = new MediaPicker3Configuration()
224225
};

0 commit comments

Comments
 (0)