diff --git a/src/Umbraco.Core/Composing/TypeCollectionBuilderBase.cs b/src/Umbraco.Core/Composing/TypeCollectionBuilderBase.cs index 35f85c9c2f..b4dcd39da2 100644 --- a/src/Umbraco.Core/Composing/TypeCollectionBuilderBase.cs +++ b/src/Umbraco.Core/Composing/TypeCollectionBuilderBase.cs @@ -6,30 +6,50 @@ namespace Umbraco.Core.Composing /// /// Provides a base class for collections of types. /// - public abstract class TypeCollectionBuilderBase : ICollectionBuilder + public abstract class TypeCollectionBuilderBase : ICollectionBuilder + where TBuilder : TypeCollectionBuilderBase where TCollection : class, IBuilderCollection { private readonly HashSet _types = new HashSet(); - private Type Validate(Type type, string action) + protected abstract TBuilder This { get; } + + private static Type Validate(Type type, string action) { if (!typeof(TConstraint).IsAssignableFrom(type)) throw new InvalidOperationException($"Cannot {action} type {type.FullName} as it does not inherit from/implement {typeof(TConstraint).FullName}."); return type; } - public void Add(Type type) => _types.Add(Validate(type, "add")); - - public void Add() => Add(typeof(T)); - - public void Add(IEnumerable types) + public TBuilder Add(Type type) { - foreach (var type in types) Add(type); + _types.Add(Validate(type, "add")); + return This; } - public void Remove(Type type) => _types.Remove(Validate(type, "remove")); + public TBuilder Add() + { + Add(typeof(T)); + return This; + } - public void Remove() => Remove(typeof(T)); + public TBuilder Add(IEnumerable types) + { + foreach (var type in types) Add(type); + return This; + } + + public TBuilder Remove(Type type) + { + _types.Remove(Validate(type, "remove")); + return This; + } + + public TBuilder Remove() + { + Remove(typeof(T)); + return This; + } public TCollection CreateCollection(IFactory factory) { diff --git a/src/Umbraco.Web/Mvc/SurfaceControllerTypeCollectionBuilder.cs b/src/Umbraco.Web/Mvc/SurfaceControllerTypeCollectionBuilder.cs index 7ea7472a87..03de95c798 100644 --- a/src/Umbraco.Web/Mvc/SurfaceControllerTypeCollectionBuilder.cs +++ b/src/Umbraco.Web/Mvc/SurfaceControllerTypeCollectionBuilder.cs @@ -3,6 +3,8 @@ using Umbraco.Web.WebApi; namespace Umbraco.Web.Mvc { - public class SurfaceControllerTypeCollectionBuilder : TypeCollectionBuilderBase - { } -} \ No newline at end of file + public class SurfaceControllerTypeCollectionBuilder : TypeCollectionBuilderBase + { + protected override SurfaceControllerTypeCollectionBuilder This => this; + } +} diff --git a/src/Umbraco.Web/WebApi/UmbracoApiControllerTypeCollectionBuilder.cs b/src/Umbraco.Web/WebApi/UmbracoApiControllerTypeCollectionBuilder.cs index 190fcdb00e..a9cf7b4619 100644 --- a/src/Umbraco.Web/WebApi/UmbracoApiControllerTypeCollectionBuilder.cs +++ b/src/Umbraco.Web/WebApi/UmbracoApiControllerTypeCollectionBuilder.cs @@ -2,6 +2,8 @@ namespace Umbraco.Web.WebApi { - public class UmbracoApiControllerTypeCollectionBuilder : TypeCollectionBuilderBase - { } -} \ No newline at end of file + public class UmbracoApiControllerTypeCollectionBuilder : TypeCollectionBuilderBase + { + protected override UmbracoApiControllerTypeCollectionBuilder This => this; + } +}