Add a "NotifyFailFast" method to the event bus

This mode allows exceptions to be bubbled up when then caller cares,
which is the case in the "ProcessingEngine", as the transaction scope
may become invalid if a nhibernate exception is not bubbled up.

--HG--
branch : dev
This commit is contained in:
Renaud Paquay
2010-12-04 13:31:29 -08:00
parent 32adc23ee1
commit 74701225aa
3 changed files with 18 additions and 10 deletions

View File

@@ -75,7 +75,7 @@ namespace Orchard.Environment.State {
entry.MessageName, entry.MessageName,
entry.ProcessId, entry.ProcessId,
entry.ShellSettings.Name); entry.ShellSettings.Name);
eventBus.Notify(entry.MessageName, entry.EventData); eventBus.NotifyFailFast(entry.MessageName, entry.EventData);
} }
} }
} }

View File

@@ -22,13 +22,18 @@ namespace Orchard.Events {
public IEnumerable Notify(string messageName, IDictionary<string, object> eventData) { public IEnumerable Notify(string messageName, IDictionary<string, object> eventData) {
// call ToArray to ensure evaluation has taken place // call ToArray to ensure evaluation has taken place
return NotifyHandlers(messageName, eventData).ToArray(); return NotifyHandlers(messageName, eventData, false/*failFast*/).ToArray();
} }
private IEnumerable<object> NotifyHandlers(string messageName, IDictionary<string, object> eventData) { public IEnumerable NotifyFailFast(string messageName, IDictionary<string, object> eventData) {
// call ToArray to ensure evaluation has taken place
return NotifyHandlers(messageName, eventData, true/*failFast*/).ToArray();
}
private IEnumerable<object> NotifyHandlers(string messageName, IDictionary<string, object> eventData, bool failFast) {
string[] parameters = messageName.Split('.'); string[] parameters = messageName.Split('.');
if (parameters.Length != 2) { 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 interfaceName = parameters[0];
string methodName = parameters[1]; string methodName = parameters[1];
@@ -36,7 +41,7 @@ namespace Orchard.Events {
var eventHandlers = _eventHandlers(); var eventHandlers = _eventHandlers();
foreach (var eventHandler in eventHandlers) { foreach (var eventHandler in eventHandlers) {
IEnumerable returnValue; IEnumerable returnValue;
if (TryNotifyHandler(eventHandler, messageName, interfaceName, methodName, eventData, out returnValue)) { if (TryNotifyHandler(eventHandler, messageName, interfaceName, methodName, eventData, failFast, out returnValue)) {
if (returnValue != null) { if (returnValue != null) {
foreach (var value in returnValue) { foreach (var value in returnValue) {
yield return value; yield return value;
@@ -46,7 +51,7 @@ namespace Orchard.Events {
} }
} }
private bool TryNotifyHandler(IEventHandler eventHandler, string messageName, string interfaceName, string methodName, IDictionary<string, object> eventData, out IEnumerable returnValue) { private bool TryNotifyHandler(IEventHandler eventHandler, string messageName, string interfaceName, string methodName, IDictionary<string, object> eventData, bool failFast, out IEnumerable returnValue) {
try { try {
return TryInvoke(eventHandler, interfaceName, methodName, eventData, out returnValue); return TryInvoke(eventHandler, interfaceName, methodName, eventData, out returnValue);
} }
@@ -56,6 +61,9 @@ namespace Orchard.Events {
eventHandler.GetType().FullName, eventHandler.GetType().FullName,
ex.GetType().Name); ex.GetType().Name);
if (failFast)
throw;
returnValue = null; returnValue = null;
return false; return false;
} }
@@ -75,7 +83,7 @@ namespace Orchard.Events {
private static bool TryInvokeMethod(IEventHandler eventHandler, Type interfaceType, string methodName, IDictionary<string, object> arguments, out IEnumerable returnValue) { private static bool TryInvokeMethod(IEventHandler eventHandler, Type interfaceType, string methodName, IDictionary<string, object> arguments, out IEnumerable returnValue) {
MethodInfo method = GetMatchingMethod(eventHandler, interfaceType, methodName, arguments); MethodInfo method = GetMatchingMethod(eventHandler, interfaceType, methodName, arguments);
if (method != null) { if (method != null) {
List<object> parameters = new List<object>(); var parameters = new List<object>();
foreach (var methodParameter in method.GetParameters()) { foreach (var methodParameter in method.GetParameters()) {
parameters.Add(arguments[methodParameter.Name]); parameters.Add(arguments[methodParameter.Name]);
} }
@@ -90,8 +98,8 @@ namespace Orchard.Events {
} }
private static MethodInfo GetMatchingMethod(IEventHandler eventHandler, Type interfaceType, string methodName, IDictionary<string, object> arguments) { private static MethodInfo GetMatchingMethod(IEventHandler eventHandler, Type interfaceType, string methodName, IDictionary<string, object> arguments) {
List<MethodInfo> allMethods = new List<MethodInfo>(interfaceType.GetMethods()); var allMethods = new List<MethodInfo>(interfaceType.GetMethods());
List<MethodInfo> candidates = new List<MethodInfo>(allMethods); var candidates = new List<MethodInfo>(allMethods);
foreach (var method in allMethods) { foreach (var method in allMethods) {
if (String.Equals(method.Name, methodName, StringComparison.OrdinalIgnoreCase)) { if (String.Equals(method.Name, methodName, StringComparison.OrdinalIgnoreCase)) {
@@ -114,6 +122,5 @@ namespace Orchard.Events {
return null; return null;
} }
} }
} }

View File

@@ -4,5 +4,6 @@ using System.Collections.Generic;
namespace Orchard.Events { namespace Orchard.Events {
public interface IEventBus : IDependency { public interface IEventBus : IDependency {
IEnumerable Notify(string messageName, IDictionary<string, object> eventData); IEnumerable Notify(string messageName, IDictionary<string, object> eventData);
IEnumerable NotifyFailFast(string messageName, IDictionary<string, object> eventData);
} }
} }