From 65980e8c765da27acba8b3c3162a2bd0ae6bc37c Mon Sep 17 00:00:00 2001 From: Shannon Deminick Date: Tue, 29 Jan 2013 09:45:12 +0600 Subject: [PATCH] Fixes: #U4-1546 - Moves IApplicationEventHandler to Umbraco.Core and creates UmbracoApplicationBase object in the Core. Changes signatures of IApplicationEventHandler methods to accept an UmbracoApplicationBase object instead of UmbracoApplication. This allows us to execute all IApplicationEventHandler's outside of the web context. Added unit test to support booting the application outside of the web context. --- src/Umbraco.Core/CoreBootManager.cs | 54 +++++++- .../IApplicationEventHandler.cs | 15 ++- .../ApplicationEventsResolver.cs | 3 +- src/Umbraco.Core/PluginManager.cs | 9 ++ src/Umbraco.Core/Umbraco.Core.csproj | 3 + src/Umbraco.Core/UmbracoApplicationBase.cs | 119 ++++++++++++++++++ .../BootManagers/CoreBootManagerTests.cs | 93 ++++++++++++++ src/Umbraco.Tests/Umbraco.Tests.csproj | 1 + src/Umbraco.Web/CacheHelperExtensions.cs | 14 +-- src/Umbraco.Web/LegacyScheduledTasks.cs | 26 ++-- src/Umbraco.Web/Umbraco.Web.csproj | 2 - src/Umbraco.Web/UmbracoApplication.cs | 99 +-------------- src/Umbraco.Web/WebBootManager.cs | 61 +++------ .../umbraco/Search/ExamineEvents.cs | 8 +- .../PluginManagerExtensions.cs | 10 -- 15 files changed, 330 insertions(+), 187 deletions(-) rename src/{Umbraco.Web => Umbraco.Core}/IApplicationEventHandler.cs (60%) rename src/{Umbraco.Web => Umbraco.Core/ObjectResolution}/ApplicationEventsResolver.cs (90%) create mode 100644 src/Umbraco.Core/UmbracoApplicationBase.cs create mode 100644 src/Umbraco.Tests/BootManagers/CoreBootManagerTests.cs diff --git a/src/Umbraco.Core/CoreBootManager.cs b/src/Umbraco.Core/CoreBootManager.cs index eda2cf494c..9884fab1ce 100644 --- a/src/Umbraco.Core/CoreBootManager.cs +++ b/src/Umbraco.Core/CoreBootManager.cs @@ -30,10 +30,21 @@ namespace Umbraco.Core private bool _isInitialized = false; private bool _isStarted = false; private bool _isComplete = false; - + private readonly UmbracoApplicationBase _umbracoApplication; protected ApplicationContext ApplicationContext { get; private set; } - public virtual IBootManager Initialize() + protected UmbracoApplicationBase UmbracoApplication + { + get { return _umbracoApplication; } + } + + public CoreBootManager(UmbracoApplicationBase umbracoApplication) + { + if (umbracoApplication == null) throw new ArgumentNullException("umbracoApplication"); + _umbracoApplication = umbracoApplication; + } + + public virtual IBootManager Initialize() { if (_isInitialized) throw new InvalidOperationException("The boot manager has already been initialized"); @@ -56,15 +67,41 @@ namespace Umbraco.Core //initialize the DatabaseContext dbContext.Initialize(); + InitializeApplicationEventsResolver(); + InitializeResolvers(); + + //now we need to call the initialize methods + ApplicationEventsResolver.Current.ApplicationEventHandlers + .ForEach(x => x.OnApplicationInitialized(UmbracoApplication, ApplicationContext)); + _isInitialized = true; return this; } + /// + /// Special method to initialize the ApplicationEventsResolver and any modifications required for it such + /// as adding custom types to the resolver. + /// + protected virtual void InitializeApplicationEventsResolver() + { + //find and initialize the application startup handlers, we need to initialize this resolver here because + //it is a special resolver where they need to be instantiated first before any other resolvers in order to bind to + //events and to call their events during bootup. + //ApplicationStartupHandler.RegisterHandlers(); + //... and set the special flag to let us resolve before frozen resolution + ApplicationEventsResolver.Current = new ApplicationEventsResolver( + PluginManager.Current.ResolveApplicationStartupHandlers()) + { + CanResolveBeforeFrozen = true + }; + } + /// - /// Fires after initialization and calls the callback to allow for customizations to occur + /// Fires after initialization and calls the callback to allow for customizations to occur & + /// Ensure that the OnApplicationStarting methods of the IApplicationEvents are called /// /// /// @@ -78,6 +115,10 @@ namespace Umbraco.Core afterStartup(ApplicationContext.Current); } + //call OnApplicationStarting of each application events handler + ApplicationEventsResolver.Current.ApplicationEventHandlers + .ForEach(x => x.OnApplicationStarting(UmbracoApplication, ApplicationContext)); + _isStarted = true; return this; @@ -104,8 +145,15 @@ namespace Umbraco.Core afterComplete(ApplicationContext.Current); } + //call OnApplicationStarting of each application events handler + ApplicationEventsResolver.Current.ApplicationEventHandlers + .ForEach(x => x.OnApplicationStarted(UmbracoApplication, ApplicationContext)); + _isComplete = true; + // we're ready to serve content! + ApplicationContext.IsReady = true; + return this; } diff --git a/src/Umbraco.Web/IApplicationEventHandler.cs b/src/Umbraco.Core/IApplicationEventHandler.cs similarity index 60% rename from src/Umbraco.Web/IApplicationEventHandler.cs rename to src/Umbraco.Core/IApplicationEventHandler.cs index 63c34d1589..e382aa8568 100644 --- a/src/Umbraco.Web/IApplicationEventHandler.cs +++ b/src/Umbraco.Core/IApplicationEventHandler.cs @@ -1,7 +1,6 @@ -using Umbraco.Core; using umbraco.interfaces; -namespace Umbraco.Web +namespace Umbraco.Core { /// /// Custom IApplicationStartupHandler that auto subscribes to the applications events @@ -11,23 +10,23 @@ namespace Umbraco.Web /// /// ApplicationContext is created and other static objects that require initialization have been setup /// - /// + /// /// - void OnApplicationInitialized(UmbracoApplication httpApplication, ApplicationContext applicationContext); + void OnApplicationInitialized(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext); /// /// All resolvers have been initialized but resolution is not frozen so they can be modified in this method /// - /// + /// /// - void OnApplicationStarting(UmbracoApplication httpApplication, ApplicationContext applicationContext); + void OnApplicationStarting(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext); /// /// Bootup is completed, this allows you to perform any other bootup logic required for the application. /// Resolution is frozen so now they can be used to resolve instances. /// - /// + /// /// - void OnApplicationStarted(UmbracoApplication httpApplication, ApplicationContext applicationContext); + void OnApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext); } } \ No newline at end of file diff --git a/src/Umbraco.Web/ApplicationEventsResolver.cs b/src/Umbraco.Core/ObjectResolution/ApplicationEventsResolver.cs similarity index 90% rename from src/Umbraco.Web/ApplicationEventsResolver.cs rename to src/Umbraco.Core/ObjectResolution/ApplicationEventsResolver.cs index 93edaae441..7f5b6f6365 100644 --- a/src/Umbraco.Web/ApplicationEventsResolver.cs +++ b/src/Umbraco.Core/ObjectResolution/ApplicationEventsResolver.cs @@ -1,10 +1,9 @@ using System; using System.Collections.Generic; using System.Linq; -using Umbraco.Core.ObjectResolution; using umbraco.interfaces; -namespace Umbraco.Web +namespace Umbraco.Core.ObjectResolution { /// /// A resolver to return all IApplicationEvents objects diff --git a/src/Umbraco.Core/PluginManager.cs b/src/Umbraco.Core/PluginManager.cs index 4f1f18c2ab..f0514af628 100644 --- a/src/Umbraco.Core/PluginManager.cs +++ b/src/Umbraco.Core/PluginManager.cs @@ -396,6 +396,15 @@ namespace Umbraco.Core private readonly HashSet _types = new HashSet(); private IEnumerable _assemblies; + /// + /// Returns all available IApplicationStartupHandler objects + /// + /// + internal IEnumerable ResolveApplicationStartupHandlers() + { + return ResolveTypes(); + } + /// /// Returns all classes attributed with XsltExtensionAttribute attribute /// diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 96e43ad6a7..2d8ea1de40 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -137,6 +137,7 @@ + @@ -195,6 +196,7 @@ + @@ -650,6 +652,7 @@ + diff --git a/src/Umbraco.Core/UmbracoApplicationBase.cs b/src/Umbraco.Core/UmbracoApplicationBase.cs new file mode 100644 index 0000000000..df241c2bd3 --- /dev/null +++ b/src/Umbraco.Core/UmbracoApplicationBase.cs @@ -0,0 +1,119 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Web; +using System.Web.Hosting; +using Umbraco.Core.Logging; + +namespace Umbraco.Core +{ + + /// + /// The abstract class for the Umbraco HttpApplication + /// + /// + /// This is exposed in the core so that we can have the IApplicationEventHandler in the core project so that + /// IApplicationEventHandler's can fire/execute outside of the web contenxt (i.e. in console applications) + /// + public abstract class UmbracoApplicationBase : System.Web.HttpApplication + { + + public static event EventHandler ApplicationStarting; + public static event EventHandler ApplicationStarted; + + /// + /// Boots up the Umbraco application + /// + internal void StartApplication(object sender, EventArgs e) + { + //boot up the application + GetBootManager() + .Initialize() + .Startup(appContext => OnApplicationStarting(sender, e)) + .Complete(appContext => OnApplicationStarted(sender, e)); + } + + /// + /// Initializes the Umbraco application + /// + /// + /// + protected void Application_Start(object sender, EventArgs e) + { + StartApplication(sender, e); + } + + /// + /// Developers can override this method to modify objects on startup + /// + /// + /// + protected virtual void OnApplicationStarting(object sender, EventArgs e) + { + if (ApplicationStarting != null) + ApplicationStarting(sender, e); + } + + /// + /// Developers can override this method to do anything they need to do once the application startup routine is completed. + /// + /// + /// + protected virtual void OnApplicationStarted(object sender, EventArgs e) + { + if (ApplicationStarted != null) + ApplicationStarted(sender, e); + } + + /// + /// A method that can be overridden to invoke code when the application has an error. + /// + /// + /// + protected virtual void OnApplicationError(object sender, EventArgs e) + { + + } + + protected void Application_Error(object sender, EventArgs e) + { + // Code that runs when an unhandled error occurs + + // Get the exception object. + var exc = Server.GetLastError(); + + // Ignore HTTP errors + if (exc.GetType() == typeof(HttpException)) + { + return; + } + + LogHelper.Error("An unhandled exception occurred", exc); + + OnApplicationError(sender, e); + } + + /// + /// A method that can be overridden to invoke code when the application shuts down. + /// + /// + /// + protected virtual void OnApplicationEnd(object sender, EventArgs e) + { + + } + + protected void Application_End(object sender, EventArgs e) + { + if (SystemUtilities.GetCurrentTrustLevel() == AspNetHostingPermissionLevel.Unrestricted) + { + LogHelper.Info("Application shutdown. Reason: " + HostingEnvironment.ShutdownReason); + } + OnApplicationEnd(sender, e); + } + + protected abstract IBootManager GetBootManager(); + + } +} diff --git a/src/Umbraco.Tests/BootManagers/CoreBootManagerTests.cs b/src/Umbraco.Tests/BootManagers/CoreBootManagerTests.cs new file mode 100644 index 0000000000..92212506ba --- /dev/null +++ b/src/Umbraco.Tests/BootManagers/CoreBootManagerTests.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Web; +using NUnit.Framework; +using Umbraco.Core; +using Umbraco.Core.ObjectResolution; + +namespace Umbraco.Tests.BootManagers +{ + [TestFixture] + public class CoreBootManagerTests + { + + private TestApp _testApp; + + [SetUp] + public void Setup() + { + _testApp = new TestApp(); + } + + /// + /// test application using a CoreBootManager instance to boot + /// + public class TestApp : UmbracoApplicationBase + { + protected override IBootManager GetBootManager() + { + return new TestBootManager(this); + } + } + + /// + /// Test boot manager to add a custom application event handler + /// + public class TestBootManager : CoreBootManager + { + public TestBootManager(UmbracoApplicationBase umbracoApplication) + : base(umbracoApplication) + { + } + + protected override void InitializeApplicationEventsResolver() + { + //create an empty resolver so we can add our own custom ones (don't type find) + ApplicationEventsResolver.Current = new ApplicationEventsResolver( + Enumerable.Empty()) + { + CanResolveBeforeFrozen = true + }; + ApplicationEventsResolver.Current.AddType(); + } + } + + /// + /// test event handler + /// + public class TestApplicationEventHandler : IApplicationEventHandler + { + public static bool Initialized = false; + public static bool Starting = false; + public static bool Started = false; + + public void OnApplicationInitialized(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) + { + Initialized = true; + } + + public void OnApplicationStarting(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) + { + Starting = true; + } + + public void OnApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) + { + Started = true; + } + } + + [Test] + public void Handle_IApplicationEventHandler_Objects_Outside_Web_Context() + { + _testApp.StartApplication(_testApp, new EventArgs()); + + Assert.IsTrue(TestApplicationEventHandler.Initialized); + Assert.IsTrue(TestApplicationEventHandler.Starting); + Assert.IsTrue(TestApplicationEventHandler.Started); + } + + } +} diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index a729aacabb..814bdb938e 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -123,6 +123,7 @@ + diff --git a/src/Umbraco.Web/CacheHelperExtensions.cs b/src/Umbraco.Web/CacheHelperExtensions.cs index 6e81bd844d..9ecc14e785 100644 --- a/src/Umbraco.Web/CacheHelperExtensions.cs +++ b/src/Umbraco.Web/CacheHelperExtensions.cs @@ -24,31 +24,31 @@ namespace Umbraco.Web /// public sealed class CacheHelperApplicationEventListener : IApplicationEventHandler { - public void OnApplicationInitialized(UmbracoApplication httpApplication, ApplicationContext applicationContext) + public void OnApplicationInitialized(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) { - if (ApplicationContext.Current != null) + if (applicationContext != null) { //bind to events to clear the cache, after publish, after media save and after member save Document.AfterPublish += (sender, args) => - ApplicationContext.Current.ApplicationCache.ClearPartialViewCache(); + applicationContext.ApplicationCache.ClearPartialViewCache(); global::umbraco.cms.businesslogic.media.Media.AfterSave += (sender, args) => - ApplicationContext.Current.ApplicationCache.ClearPartialViewCache(); + applicationContext.ApplicationCache.ClearPartialViewCache(); global::umbraco.cms.businesslogic.member.Member.AfterSave += (sender, args) => - ApplicationContext.Current.ApplicationCache.ClearPartialViewCache(); + applicationContext.ApplicationCache.ClearPartialViewCache(); } } - public void OnApplicationStarting(UmbracoApplication httpApplication, ApplicationContext applicationContext) + public void OnApplicationStarting(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) { } - public void OnApplicationStarted(UmbracoApplication httpApplication, ApplicationContext applicationContext) + public void OnApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) { } } diff --git a/src/Umbraco.Web/LegacyScheduledTasks.cs b/src/Umbraco.Web/LegacyScheduledTasks.cs index 1ebf9d7903..f79b383b06 100644 --- a/src/Umbraco.Web/LegacyScheduledTasks.cs +++ b/src/Umbraco.Web/LegacyScheduledTasks.cs @@ -5,6 +5,7 @@ using System.Text; using System.Threading; using System.Web; using System.Web.Caching; +using Umbraco.Core; using Umbraco.Core.Logging; using global::umbraco.BusinessLogic; @@ -17,17 +18,20 @@ namespace Umbraco.Web internal sealed class LegacyScheduledTasks : IApplicationEventHandler { - Timer pingTimer; - Timer publishingTimer; - CacheItemRemovedCallback OnCacheRemove; + Timer _pingTimer; + Timer _publishingTimer; + CacheItemRemovedCallback _onCacheRemove; - public void OnApplicationInitialized(UmbracoApplication httpApplication, Core.ApplicationContext applicationContext) + public void OnApplicationInitialized(UmbracoApplicationBase umbracoApplication, Core.ApplicationContext applicationContext) { // nothing yet } - public void OnApplicationStarting(UmbracoApplication httpApplication, Core.ApplicationContext applicationContext) - { + public void OnApplicationStarting(UmbracoApplicationBase umbracoApplication, Core.ApplicationContext applicationContext) + { + if (umbracoApplication.Context == null) + return; + // time to setup the tasks // these are the legacy tasks @@ -35,16 +39,16 @@ namespace Umbraco.Web // of course we should have a proper scheduler, see #U4-809 // ping/keepalive - pingTimer = new Timer(new TimerCallback(global::umbraco.presentation.keepAliveService.PingUmbraco), httpApplication.Context, 60000, 300000); + _pingTimer = new Timer(new TimerCallback(global::umbraco.presentation.keepAliveService.PingUmbraco), umbracoApplication.Context, 60000, 300000); // (un)publishing _and_ also run scheduled tasks (!) - publishingTimer = new Timer(new TimerCallback(global::umbraco.presentation.publishingService.CheckPublishing), httpApplication.Context, 30000, 60000); + _publishingTimer = new Timer(new TimerCallback(global::umbraco.presentation.publishingService.CheckPublishing), umbracoApplication.Context, 30000, 60000); // log scrubbing AddTask(LOG_SCRUBBER_TASK_NAME, GetLogScrubbingInterval()); } - public void OnApplicationStarted(UmbracoApplication httpApplication, Core.ApplicationContext applicationContext) + public void OnApplicationStarted(UmbracoApplicationBase httpApplication, Core.ApplicationContext applicationContext) { // nothing } @@ -88,10 +92,10 @@ namespace Umbraco.Web private void AddTask(string name, int seconds) { - OnCacheRemove = new CacheItemRemovedCallback(CacheItemRemoved); + _onCacheRemove = new CacheItemRemovedCallback(CacheItemRemoved); HttpRuntime.Cache.Insert(name, seconds, null, DateTime.Now.AddSeconds(seconds), System.Web.Caching.Cache.NoSlidingExpiration, - CacheItemPriority.NotRemovable, OnCacheRemove); + CacheItemPriority.NotRemovable, _onCacheRemove); } public void CacheItemRemoved(string k, object v, CacheItemRemovedReason r) diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 5ce59b214e..24cc484f92 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -245,7 +245,6 @@ Properties\SolutionInfo.cs - @@ -290,7 +289,6 @@ ASPXCodeBehind - diff --git a/src/Umbraco.Web/UmbracoApplication.cs b/src/Umbraco.Web/UmbracoApplication.cs index c3d32c2ce2..7a47847b5e 100644 --- a/src/Umbraco.Web/UmbracoApplication.cs +++ b/src/Umbraco.Web/UmbracoApplication.cs @@ -15,99 +15,12 @@ namespace Umbraco.Web /// /// The Umbraco global.asax class /// - public class UmbracoApplication : System.Web.HttpApplication + public class UmbracoApplication : UmbracoApplicationBase { - public UmbracoApplication() - { - _bootManager = new WebBootManager(this); - } - - private readonly IBootManager _bootManager; - - public static event EventHandler ApplicationStarting; - public static event EventHandler ApplicationStarted; - - /// - /// Initializes the Umbraco application - /// - /// - /// - protected void Application_Start(object sender, EventArgs e) - { - //boot up the application - _bootManager - .Initialize() - .Startup(appContext => OnApplicationStarting(sender, e)) - .Complete(appContext => OnApplicationStarted(sender, e)); - } - - /// - /// Developers can override this method to modify objects on startup - /// - /// - /// - protected virtual void OnApplicationStarting(object sender, EventArgs e) - { - if (ApplicationStarting != null) - ApplicationStarting(sender, e); - } - - /// - /// Developers can override this method to do anything they need to do once the application startup routine is completed. - /// - /// - /// - protected virtual void OnApplicationStarted(object sender, EventArgs e) - { - if (ApplicationStarted != null) - ApplicationStarted(sender, e); - } - - /// - /// A method that can be overridden to invoke code when the application has an error. - /// - /// - /// - protected virtual void OnApplicationError(object sender, EventArgs e) - { - - } - - protected void Application_Error(object sender, EventArgs e) - { - // Code that runs when an unhandled error occurs - - // Get the exception object. - var exc = Server.GetLastError(); - - // Ignore HTTP errors - if (exc.GetType() == typeof(HttpException)) - { - return; - } - - LogHelper.Error("An unhandled exception occurred", exc); - - OnApplicationError(sender, e); - } - - /// - /// A method that can be overridden to invoke code when the application shuts down. - /// - /// - /// - protected virtual void OnApplicationEnd(object sender, EventArgs e) - { - - } - - protected void Application_End(object sender, EventArgs e) - { - if (SystemUtilities.GetCurrentTrustLevel() == AspNetHostingPermissionLevel.Unrestricted) - { - LogHelper.Info("Application shutdown. Reason: " + HostingEnvironment.ShutdownReason); - } - OnApplicationEnd(sender, e); - } + + protected override IBootManager GetBootManager() + { + return new WebBootManager(this); + } } } diff --git a/src/Umbraco.Web/WebBootManager.cs b/src/Umbraco.Web/WebBootManager.cs index 58992253ff..2127f0f014 100644 --- a/src/Umbraco.Web/WebBootManager.cs +++ b/src/Umbraco.Web/WebBootManager.cs @@ -7,6 +7,7 @@ using Umbraco.Core; using Umbraco.Core.Configuration; using Umbraco.Core.Dictionary; using Umbraco.Core.Dynamics; +using Umbraco.Core.ObjectResolution; using Umbraco.Core.PropertyEditors; using Umbraco.Web.Dictionary; using Umbraco.Web.Media; @@ -27,9 +28,8 @@ namespace Umbraco.Web public class WebBootManager : CoreBootManager { private readonly bool _isForTesting; - private readonly UmbracoApplication _umbracoApplication; - public WebBootManager(UmbracoApplication umbracoApplication) + public WebBootManager(UmbracoApplicationBase umbracoApplication) : this(umbracoApplication, false) { @@ -40,11 +40,10 @@ namespace Umbraco.Web /// /// /// - internal WebBootManager(UmbracoApplication umbracoApplication, bool isForTesting) + internal WebBootManager(UmbracoApplicationBase umbracoApplication, bool isForTesting) + : base(umbracoApplication) { - _isForTesting = isForTesting; - _umbracoApplication = umbracoApplication; - if (umbracoApplication == null) throw new ArgumentNullException("umbracoApplication"); + _isForTesting = isForTesting; } /// @@ -71,43 +70,18 @@ namespace Umbraco.Web //set model binder ModelBinders.Binders.Add(new KeyValuePair(typeof(RenderModel), new RenderModelBinder())); - - //find and initialize the application startup handlers, we need to initialize this resolver here because - //it is a special resolver where they need to be instantiated first before any other resolvers in order to bind to - //events and to call their events during bootup. - //ApplicationStartupHandler.RegisterHandlers(); - //... and set the special flag to let us resolve before frozen resolution - ApplicationEventsResolver.Current = new ApplicationEventsResolver( - PluginManager.Current.ResolveApplicationStartupHandlers()) - { - CanResolveBeforeFrozen = true - }; - //add the internal types since we don't want to mark these public - ApplicationEventsResolver.Current.AddType(); - ApplicationEventsResolver.Current.AddType(); - - //now we need to call the initialize methods - ApplicationEventsResolver.Current.ApplicationEventHandlers - .ForEach(x => x.OnApplicationInitialized(_umbracoApplication, ApplicationContext)); - return this; } - /// - /// Ensure that the OnApplicationStarting methods of the IApplicationEvents are called - /// - /// - /// - public override IBootManager Startup(Action afterStartup) - { - base.Startup(afterStartup); - - //call OnApplicationStarting of each application events handler - ApplicationEventsResolver.Current.ApplicationEventHandlers - .ForEach(x => x.OnApplicationStarting(_umbracoApplication, ApplicationContext)); - - return this; - } + /// + /// Adds custom types to the ApplicationEventsResolver + /// + protected override void InitializeApplicationEventsResolver() + { + base.InitializeApplicationEventsResolver(); + ApplicationEventsResolver.Current.AddType(); + ApplicationEventsResolver.Current.AddType(); + } /// /// Ensure that the OnApplicationStarted methods of the IApplicationEvents are called @@ -121,13 +95,6 @@ namespace Umbraco.Web base.Complete(afterComplete); - //call OnApplicationStarting of each application events handler - ApplicationEventsResolver.Current.ApplicationEventHandlers - .ForEach(x => x.OnApplicationStarted(_umbracoApplication, ApplicationContext)); - - // we're ready to serve content! - ApplicationContext.IsReady = true; - return this; } diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/Search/ExamineEvents.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/Search/ExamineEvents.cs index f122e2013b..1f1471bc7e 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/Search/ExamineEvents.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/Search/ExamineEvents.cs @@ -15,20 +15,20 @@ namespace umbraco.presentation.umbraco.Search public class ExamineEvents : IApplicationEventHandler { - public void OnApplicationInitialized(UmbracoApplication httpApplication, ApplicationContext applicationContext) + public void OnApplicationInitialized(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) { } - public void OnApplicationStarting(UmbracoApplication httpApplication, ApplicationContext applicationContext) + public void OnApplicationStarting(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) { } /// /// Once the app has booted, then bind to the events /// - /// + /// /// - public void OnApplicationStarted(UmbracoApplication httpApplication, ApplicationContext applicationContext) + public void OnApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) { //do not continue if the app context or database is not ready if (!applicationContext.IsConfigured || !applicationContext.DatabaseContext.IsDatabaseConfigured) diff --git a/src/umbraco.businesslogic/PluginManagerExtensions.cs b/src/umbraco.businesslogic/PluginManagerExtensions.cs index da8fdea46b..7a61414315 100644 --- a/src/umbraco.businesslogic/PluginManagerExtensions.cs +++ b/src/umbraco.businesslogic/PluginManagerExtensions.cs @@ -10,16 +10,6 @@ namespace umbraco.businesslogic /// public static class PluginManagerExtensions { - /// - /// Returns all available IApplicationStartupHandler objects - /// - /// - /// - internal static IEnumerable ResolveApplicationStartupHandlers(this PluginManager resolver) - { - return resolver.ResolveTypes(); - } - /// /// Returns all available IApplication in application ///