diff --git a/src/Umbraco.Abstractions/CompositionExtensions.cs b/src/Umbraco.Abstractions/CompositionExtensions.cs index 67f277734b..24db8653d1 100644 --- a/src/Umbraco.Abstractions/CompositionExtensions.cs +++ b/src/Umbraco.Abstractions/CompositionExtensions.cs @@ -1,4 +1,5 @@ using Umbraco.Core.Composing; +using Umbraco.Core.PropertyEditors; using Umbraco.Web.Dashboards; namespace Umbraco.Core @@ -22,6 +23,15 @@ namespace Umbraco.Core public static DashboardCollectionBuilder Dashboards(this Composition composition) => composition.WithCollectionBuilder(); + + /// + /// Gets the content finders collection builder. + /// + /// The composition. + /// + public static DataEditorWithMediaPathCollectionBuilder DataEditorsWithMediaPath(this Composition composition) + => composition.WithCollectionBuilder(); + #endregion } } diff --git a/src/Umbraco.Abstractions/Models/IDataEditorWithMediaPath.cs b/src/Umbraco.Abstractions/Models/IDataEditorWithMediaPath.cs index e8af1b0ac3..c0ad0fe199 100644 --- a/src/Umbraco.Abstractions/Models/IDataEditorWithMediaPath.cs +++ b/src/Umbraco.Abstractions/Models/IDataEditorWithMediaPath.cs @@ -9,6 +9,8 @@ /// public interface IDataEditorWithMediaPath { + string Alias { get; } + /// /// Returns the media path for the value stored for a property /// diff --git a/src/Umbraco.Abstractions/PropertyEditors/DataEditorWithMediaPathCollection.cs b/src/Umbraco.Abstractions/PropertyEditors/DataEditorWithMediaPathCollection.cs new file mode 100644 index 0000000000..de93237661 --- /dev/null +++ b/src/Umbraco.Abstractions/PropertyEditors/DataEditorWithMediaPathCollection.cs @@ -0,0 +1,21 @@ +using System.Collections.Generic; +using System.Linq; +using Umbraco.Core.Composing; + +namespace Umbraco.Core.PropertyEditors +{ + public class DataEditorWithMediaPathCollection : BuilderCollectionBase + { + public DataEditorWithMediaPathCollection(IEnumerable items) : base(items) + { + } + + public bool TryGet(string alias, out IDataEditorWithMediaPath editor) + { + editor = this.FirstOrDefault(x => x.Alias == alias); + return editor != null; + } + + + } +} diff --git a/src/Umbraco.Abstractions/PropertyEditors/DataEditorWithMediaPathCollectionBuilder.cs b/src/Umbraco.Abstractions/PropertyEditors/DataEditorWithMediaPathCollectionBuilder.cs new file mode 100644 index 0000000000..ddb656720d --- /dev/null +++ b/src/Umbraco.Abstractions/PropertyEditors/DataEditorWithMediaPathCollectionBuilder.cs @@ -0,0 +1,9 @@ +using Umbraco.Core.Composing; + +namespace Umbraco.Core.PropertyEditors +{ + public class DataEditorWithMediaPathCollectionBuilder : LazyCollectionBuilderBase + { + protected override DataEditorWithMediaPathCollectionBuilder This => this; + } +} diff --git a/src/Umbraco.Abstractions/Routing/DefaultMediaUrlProvider.cs b/src/Umbraco.Abstractions/Routing/DefaultMediaUrlProvider.cs index 08ffb7b1ff..72128c21f5 100644 --- a/src/Umbraco.Abstractions/Routing/DefaultMediaUrlProvider.cs +++ b/src/Umbraco.Abstractions/Routing/DefaultMediaUrlProvider.cs @@ -10,11 +10,11 @@ namespace Umbraco.Web.Routing public class DefaultMediaUrlProvider : IMediaUrlProvider { private readonly UriUtility _uriUtility; - private readonly Lazy _propertyEditors; + private readonly DataEditorWithMediaPathCollection _dataEditors; - public DefaultMediaUrlProvider(Lazy propertyEditors, UriUtility uriUtility) + public DefaultMediaUrlProvider(DataEditorWithMediaPathCollection dataEditors, UriUtility uriUtility) { - _propertyEditors = propertyEditors ?? throw new ArgumentNullException(nameof(propertyEditors)); + _dataEditors = dataEditors ?? throw new ArgumentNullException(nameof(dataEditors)); _uriUtility = uriUtility; } @@ -34,8 +34,7 @@ namespace Umbraco.Web.Routing var propType = prop.PropertyType; string path = null; - if (_propertyEditors.Value.TryGet(propType.EditorAlias, out var editor) - && editor is IDataEditorWithMediaPath dataEditor) + if (_dataEditors.TryGet(propType.EditorAlias, out var dataEditor)) { path = dataEditor.GetMediaPath(value); } diff --git a/src/Umbraco.Infrastructure/Runtime/CoreInitialComposer.cs b/src/Umbraco.Infrastructure/Runtime/CoreInitialComposer.cs index 57b067837f..a2d3bc4e45 100644 --- a/src/Umbraco.Infrastructure/Runtime/CoreInitialComposer.cs +++ b/src/Umbraco.Infrastructure/Runtime/CoreInitialComposer.cs @@ -24,6 +24,7 @@ using Umbraco.Core.Sync; using Umbraco.Web.Models.PublishedContent; using Umbraco.Web.PublishedCache; using Umbraco.Web; +using Umbraco.Web.PropertyEditors; using Umbraco.Web.Services; using IntegerValidator = Umbraco.Core.PropertyEditors.Validators.IntegerValidator; @@ -79,6 +80,11 @@ namespace Umbraco.Core.Runtime // properties and parameters derive from data editors composition.DataEditors() .Add(() => composition.TypeLoader.GetDataEditors()); + + composition.DataEditorsWithMediaPath() + .Add() + .Add(); + composition.RegisterUnique(); composition.RegisterUnique(); diff --git a/src/Umbraco.Tests/Routing/MediaUrlProviderTests.cs b/src/Umbraco.Tests/Routing/MediaUrlProviderTests.cs index 2798e50a26..519274b118 100644 --- a/src/Umbraco.Tests/Routing/MediaUrlProviderTests.cs +++ b/src/Umbraco.Tests/Routing/MediaUrlProviderTests.cs @@ -38,12 +38,12 @@ namespace Umbraco.Tests.Routing var dataTypeService = Mock.Of(); var umbracoSettingsSection = TestObjects.GetUmbracoSettings(); - var propertyEditors = new PropertyEditorCollection(new DataEditorCollection(new IDataEditor[] + var propertyEditors = new DataEditorWithMediaPathCollection(new IDataEditorWithMediaPath[] { new FileUploadPropertyEditor(logger, mediaFileSystemMock, contentSection, dataTypeService, LocalizationService, LocalizedTextService, ShortStringHelper, umbracoSettingsSection), new ImageCropperPropertyEditor(logger, mediaFileSystemMock, contentSection, dataTypeService, LocalizationService, IOHelper, ShortStringHelper, LocalizedTextService, umbracoSettingsSection), - })); - _mediaUrlProvider = new DefaultMediaUrlProvider(new Lazy(() => propertyEditors), UriUtility); + }); + _mediaUrlProvider = new DefaultMediaUrlProvider(propertyEditors, UriUtility); } public override void TearDown()