mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-14 19:04:51 +08:00
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:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user