resolution and created a ResolverCollection to track all resolvers created so it's super easy to reset all of them at once (which is what happens on ApplicationContext.Dispose. ApplicationContext.Dispose is also implicitly implemented as to not show in intellisense that the Dispose method exists... must be cast to IDisposable to work.
69 lines
2.3 KiB
C#
69 lines
2.3 KiB
C#
using System;
|
|
using System.Collections.Concurrent;
|
|
using System.Linq;
|
|
|
|
namespace Umbraco.Core.ObjectResolution
|
|
{
|
|
/// <summary>
|
|
/// Simply used to track all ManyObjectsResolverBase instances so that we can
|
|
/// reset them all at once really easily.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// Normally we'd use TypeFinding for this but because many of the resolvers are internal this won't work.
|
|
/// We'd rather not keep a static list of them so we'll dynamically add to this list based on the base
|
|
/// class of the ManyObjectsResolverBase.
|
|
/// </remarks>
|
|
internal static class ResolverCollection
|
|
{
|
|
private static readonly ConcurrentDictionary<ResolverBase, Action> Resolvers = new ConcurrentDictionary<ResolverBase, Action>();
|
|
|
|
/// <summary>
|
|
/// Returns the number of resolvers created
|
|
/// </summary>
|
|
internal static int Count
|
|
{
|
|
get { return Resolvers.Count; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Resets all resolvers
|
|
/// </summary>
|
|
internal static void ResetAll()
|
|
{
|
|
//take out each item from the bag and reset it
|
|
var keys = Resolvers.Keys.ToArray();
|
|
foreach (var k in keys)
|
|
{
|
|
Action resetAction;
|
|
while (Resolvers.TryRemove(k, out resetAction))
|
|
{
|
|
//call the reset action for the resolver
|
|
resetAction();
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// This is called when the static Reset method or a ResolverBase{T} is called.
|
|
/// </summary>
|
|
internal static void Remove(ResolverBase resolver)
|
|
{
|
|
if (resolver == null) return;
|
|
Action action;
|
|
Resolvers.TryRemove(resolver, out action);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Adds a resolver to the collection
|
|
/// </summary>
|
|
/// <param name="resolver"></param>
|
|
/// <param name="resetAction"></param>
|
|
/// <remarks>
|
|
/// This is called when the creation of a ResolverBase occurs
|
|
/// </remarks>
|
|
internal static void Add(ResolverBase resolver, Action resetAction)
|
|
{
|
|
Resolvers.TryAdd(resolver, resetAction);
|
|
}
|
|
}
|
|
} |