From 8082abc27a98c58bfd9724fa2658f692a3a40808 Mon Sep 17 00:00:00 2001 From: "shannon@ShandemVaio" Date: Fri, 27 Jul 2012 05:52:01 +0600 Subject: [PATCH] Added MultipleResolverBase --- .../Resolving/MultipleResolverBase.cs | 74 +++++++++++++++++++ .../Resolving/SingleResolverBase.cs | 12 +++ src/Umbraco.Core/Umbraco.Core.csproj | 1 + .../EnumerableExtensionsTests.cs | 24 +++++- 4 files changed, 109 insertions(+), 2 deletions(-) create mode 100644 src/Umbraco.Core/Resolving/MultipleResolverBase.cs diff --git a/src/Umbraco.Core/Resolving/MultipleResolverBase.cs b/src/Umbraco.Core/Resolving/MultipleResolverBase.cs new file mode 100644 index 0000000000..a6e0a86ab8 --- /dev/null +++ b/src/Umbraco.Core/Resolving/MultipleResolverBase.cs @@ -0,0 +1,74 @@ +using System.Collections.Generic; +using System.Threading; + +namespace Umbraco.Core.Resolving +{ + /// + /// A Resolver to return and set a Multiply registered object. + /// + /// + /// + /// + /// Used to resolve multiple types from a collection. The collection can also be modified at runtime/application startup. + /// An example of this is MVCs ViewEngines collection + /// + internal abstract class MultipleResolverBase : ResolverBase + where TResolver : class + where TResolved : class + { + readonly List _resolved; + protected readonly ReaderWriterLockSlim Lock = new ReaderWriterLockSlim(); + + protected MultipleResolverBase() + { + _resolved = new List(); + } + + protected MultipleResolverBase(IEnumerable value) + { + _resolved = new List(value); + } + + protected IEnumerable Values + { + get { return _resolved; } + } + + public void Remove(TResolved item) + { + Resolution.EnsureNotFrozen(); + using (new WriteLock(Lock)) + { + _resolved.Remove(item); + } + } + + public void Add(TResolved item) + { + Resolution.EnsureNotFrozen(); + using (new WriteLock(Lock)) + { + _resolved.Add(item); + } + } + + public void Clear() + { + Resolution.EnsureNotFrozen(); + using (new WriteLock(Lock)) + { + _resolved.Clear(); + } + } + + public void Insert(int index, TResolved item) + { + Resolution.EnsureNotFrozen(); + using (new WriteLock(Lock)) + { + _resolved.Insert(index, item); + } + } + + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Resolving/SingleResolverBase.cs b/src/Umbraco.Core/Resolving/SingleResolverBase.cs index b57fc681d8..fb5475dd3c 100644 --- a/src/Umbraco.Core/Resolving/SingleResolverBase.cs +++ b/src/Umbraco.Core/Resolving/SingleResolverBase.cs @@ -2,6 +2,15 @@ namespace Umbraco.Core.Resolving { + /// + /// A Resolver to return and set a Single registered object. + /// + /// + /// + /// + /// Used for 'singly' registered objects. An example is like the MVC Controller Factory, only one exists application wide and it can + /// be get/set. + /// internal abstract class SingleResolverBase : ResolverBase where TResolver : class where TResolved : class @@ -30,6 +39,9 @@ namespace Umbraco.Core.Resolving _canBeNull = canBeNull; } + /// + /// Gets/sets the value of the object + /// protected TResolved Value { get diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 78c4b0dd3f..acedefaa9b 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -50,6 +50,7 @@ + diff --git a/src/Umbraco.Tests/EnumerableExtensionsTests.cs b/src/Umbraco.Tests/EnumerableExtensionsTests.cs index 5884268cf0..e8a567c97c 100644 --- a/src/Umbraco.Tests/EnumerableExtensionsTests.cs +++ b/src/Umbraco.Tests/EnumerableExtensionsTests.cs @@ -4,13 +4,33 @@ using NUnit.Framework; using Umbraco.Core; using Umbraco.Tests; using umbraco.BusinessLogic; +using Umbraco.Core.Resolving; namespace Umbraco.Tests { + [TestFixture] + public class MultipleResolverBaseTests + { - #region Used for benchmark test: Benchmark_Finding_First_Type_In_Assemblies + internal class MyItemsResolver : MultipleResolverBase + { + public MyItemsResolver(IEnumerable initItems) + { + foreach(var i in initItems) + { + Add(i); + } + } + + public IEnumerable MyItems + { + get { return Values; } + } + } + + + } - #endregion [TestFixture] public class EnumerableExtensionsTests