diff --git a/src/Orchard/Environment/State/DefaultProcessingEngine.cs b/src/Orchard/Environment/State/DefaultProcessingEngine.cs index 9e6e82784..003718119 100644 --- a/src/Orchard/Environment/State/DefaultProcessingEngine.cs +++ b/src/Orchard/Environment/State/DefaultProcessingEngine.cs @@ -75,7 +75,7 @@ namespace Orchard.Environment.State { entry.MessageName, entry.ProcessId, entry.ShellSettings.Name); - eventBus.Notify(entry.MessageName, entry.EventData); + eventBus.NotifyFailFast(entry.MessageName, entry.EventData); } } } diff --git a/src/Orchard/Events/DefaultOrchardEventBus.cs b/src/Orchard/Events/DefaultOrchardEventBus.cs index 511f75c6c..87dc76cd1 100644 --- a/src/Orchard/Events/DefaultOrchardEventBus.cs +++ b/src/Orchard/Events/DefaultOrchardEventBus.cs @@ -22,13 +22,18 @@ namespace Orchard.Events { public IEnumerable Notify(string messageName, IDictionary eventData) { // call ToArray to ensure evaluation has taken place - return NotifyHandlers(messageName, eventData).ToArray(); + return NotifyHandlers(messageName, eventData, false/*failFast*/).ToArray(); } - private IEnumerable NotifyHandlers(string messageName, IDictionary eventData) { + public IEnumerable NotifyFailFast(string messageName, IDictionary eventData) { + // call ToArray to ensure evaluation has taken place + return NotifyHandlers(messageName, eventData, true/*failFast*/).ToArray(); + } + + private IEnumerable NotifyHandlers(string messageName, IDictionary eventData, bool failFast) { string[] parameters = messageName.Split('.'); if (parameters.Length != 2) { - throw new ArgumentException(messageName + T(" is not formatted correctly")); + throw new ArgumentException(T("{0} is not formatted correctly", messageName).Text); } string interfaceName = parameters[0]; string methodName = parameters[1]; @@ -36,7 +41,7 @@ namespace Orchard.Events { var eventHandlers = _eventHandlers(); foreach (var eventHandler in eventHandlers) { IEnumerable returnValue; - if (TryNotifyHandler(eventHandler, messageName, interfaceName, methodName, eventData, out returnValue)) { + if (TryNotifyHandler(eventHandler, messageName, interfaceName, methodName, eventData, failFast, out returnValue)) { if (returnValue != null) { foreach (var value in returnValue) { yield return value; @@ -46,7 +51,7 @@ namespace Orchard.Events { } } - private bool TryNotifyHandler(IEventHandler eventHandler, string messageName, string interfaceName, string methodName, IDictionary eventData, out IEnumerable returnValue) { + private bool TryNotifyHandler(IEventHandler eventHandler, string messageName, string interfaceName, string methodName, IDictionary eventData, bool failFast, out IEnumerable returnValue) { try { return TryInvoke(eventHandler, interfaceName, methodName, eventData, out returnValue); } @@ -56,6 +61,9 @@ namespace Orchard.Events { eventHandler.GetType().FullName, ex.GetType().Name); + if (failFast) + throw; + returnValue = null; return false; } @@ -75,7 +83,7 @@ namespace Orchard.Events { private static bool TryInvokeMethod(IEventHandler eventHandler, Type interfaceType, string methodName, IDictionary arguments, out IEnumerable returnValue) { MethodInfo method = GetMatchingMethod(eventHandler, interfaceType, methodName, arguments); if (method != null) { - List parameters = new List(); + var parameters = new List(); foreach (var methodParameter in method.GetParameters()) { parameters.Add(arguments[methodParameter.Name]); } @@ -90,8 +98,8 @@ namespace Orchard.Events { } private static MethodInfo GetMatchingMethod(IEventHandler eventHandler, Type interfaceType, string methodName, IDictionary arguments) { - List allMethods = new List(interfaceType.GetMethods()); - List candidates = new List(allMethods); + var allMethods = new List(interfaceType.GetMethods()); + var candidates = new List(allMethods); foreach (var method in allMethods) { if (String.Equals(method.Name, methodName, StringComparison.OrdinalIgnoreCase)) { @@ -114,6 +122,5 @@ namespace Orchard.Events { return null; } - } } diff --git a/src/Orchard/Events/IEventBus.cs b/src/Orchard/Events/IEventBus.cs index c55515810..3c2e7393f 100644 --- a/src/Orchard/Events/IEventBus.cs +++ b/src/Orchard/Events/IEventBus.cs @@ -4,5 +4,6 @@ using System.Collections.Generic; namespace Orchard.Events { public interface IEventBus : IDependency { IEnumerable Notify(string messageName, IDictionary eventData); + IEnumerable NotifyFailFast(string messageName, IDictionary eventData); } }