Files
Umbraco-CMS/src/Umbraco.Core/ObjectResolution/ApplicationEventsResolver.cs

179 lines
5.7 KiB
C#
Raw Normal View History

2012-08-14 12:03:34 +06:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using Umbraco.Core.Logging;
2012-08-14 12:03:34 +06:00
using umbraco.interfaces;
namespace Umbraco.Core.ObjectResolution
2012-08-14 12:03:34 +06:00
{
/// <summary>
/// A resolver to return all IApplicationEvents objects
/// </summary>
/// <remarks>
/// This is disposable because after the app has started it should be disposed to release any memory being occupied by instances.
/// </remarks>
public sealed class ApplicationEventsResolver : ManyObjectsResolverBase<ApplicationEventsResolver, IApplicationEventHandler>, IDisposable
2012-08-14 12:03:34 +06:00
{
2013-02-14 23:05:58 +06:00
private readonly LegacyStartupHandlerResolver _legacyResolver;
/// <summary>
/// Constructor
/// </summary>
/// <param name="logger"></param>
/// <param name="applicationEventHandlers"></param>
/// <param name="serviceProvider"></param>
internal ApplicationEventsResolver(IServiceProvider serviceProvider, ILogger logger, IEnumerable<Type> applicationEventHandlers)
: base(serviceProvider, logger, applicationEventHandlers)
2012-08-14 12:03:34 +06:00
{
2013-02-14 23:05:58 +06:00
//create the legacy resolver and only include the legacy types
_legacyResolver = new LegacyStartupHandlerResolver(
serviceProvider, logger,
applicationEventHandlers.Where(x => TypeHelper.IsTypeAssignableFrom<IApplicationEventHandler>(x) == false));
2012-08-14 12:03:34 +06:00
}
2013-02-14 23:05:58 +06:00
/// <summary>
/// Override in order to only return types of IApplicationEventHandler and above,
/// do not include the legacy types of IApplicationStartupHandler
/// </summary>
protected override IEnumerable<Type> InstanceTypes
{
get { return base.InstanceTypes.Where(TypeHelper.IsTypeAssignableFrom<IApplicationEventHandler>); }
}
private List<IApplicationEventHandler> _orderedAndFiltered;
/// <summary>
/// Gets the <see cref="IApplicationEventHandler"/> implementations.
/// </summary>
public IEnumerable<IApplicationEventHandler> ApplicationEventHandlers
2012-08-14 12:03:34 +06:00
{
get
{
if (_orderedAndFiltered == null)
{
_orderedAndFiltered = GetSortedValues().ToList();
//raise event so the collection can be modified
OnCollectionResolved(new ApplicationEventsEventArgs(_orderedAndFiltered));
}
return _orderedAndFiltered;
}
2012-08-14 12:03:34 +06:00
}
public event EventHandler<ApplicationEventsEventArgs> CollectionResolved;
private void OnCollectionResolved(ApplicationEventsEventArgs e)
{
var handler = CollectionResolved;
if (handler != null) handler(this, e);
}
2013-02-14 23:05:58 +06:00
/// <summary>
/// Create instances of all of the legacy startup handlers
/// </summary>
2013-04-16 04:27:03 -02:00
public void InstantiateLegacyStartupHandlers()
2013-02-14 23:05:58 +06:00
{
//this will instantiate them all
var handlers = _legacyResolver.LegacyStartupHandlers;
}
protected override bool SupportsClear
2012-08-14 12:03:34 +06:00
{
get { return false; }
}
2012-08-14 12:03:34 +06:00
protected override bool SupportsInsert
2012-08-14 12:03:34 +06:00
{
get { return false; }
2012-08-14 12:03:34 +06:00
}
private class LegacyStartupHandlerResolver : ManyObjectsResolverBase<ApplicationEventsResolver, IApplicationStartupHandler>, IDisposable
2013-02-14 23:05:58 +06:00
{
internal LegacyStartupHandlerResolver(IServiceProvider serviceProvider, ILogger logger, IEnumerable<Type> legacyStartupHandlers)
: base(serviceProvider, logger, legacyStartupHandlers)
2013-02-14 23:05:58 +06:00
{
}
public IEnumerable<IApplicationStartupHandler> LegacyStartupHandlers
{
get { return Values; }
}
2013-02-14 23:14:43 +06:00
public void Dispose()
{
ResetCollections();
}
}
private bool _disposed;
private readonly ReaderWriterLockSlim _disposalLocker = new ReaderWriterLockSlim();
/// <summary>
/// Gets a value indicating whether this instance is disposed.
/// </summary>
/// <value>
/// <c>true</c> if this instance is disposed; otherwise, <c>false</c>.
/// </value>
public bool IsDisposed
{
get { return _disposed; }
}
/// <summary>
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
/// </summary>
/// <filterpriority>2</filterpriority>
public void Dispose()
{
Dispose(true);
// Use SupressFinalize in case a subclass of this type implements a finalizer.
GC.SuppressFinalize(this);
}
~ApplicationEventsResolver()
{
// Run dispose but let the class know it was due to the finalizer running.
Dispose(false);
}
private void Dispose(bool disposing)
{
// Only operate if we haven't already disposed
if (IsDisposed || disposing == false) return;
using (new WriteLock(_disposalLocker))
{
// Check again now we're inside the lock
if (IsDisposed) return;
// Call to actually release resources. This method is only
// kept separate so that the entire disposal logic can be used as a VS snippet
DisposeResources();
// Indicate that the instance has been disposed.
_disposed = true;
}
}
/// <summary>
/// Clear out all of the instances, we don't want them hanging around and cluttering up memory
/// </summary>
private void DisposeResources()
{
_legacyResolver.Dispose();
ResetCollections();
_orderedAndFiltered.Clear();
_orderedAndFiltered = null;
//Clear event handlers
CollectionResolved = null;
}
}
2012-08-14 12:03:34 +06:00
}