mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-15 19:54:57 +08:00
- EventBus.Notify is dispatching events to handlers.
- Tests... --HG-- branch : dev
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
using Autofac;
|
||||
using NUnit.Framework;
|
||||
using Orchard.Events;
|
||||
using System;
|
||||
|
||||
namespace Orchard.Tests.Events {
|
||||
[TestFixture]
|
||||
@@ -9,12 +10,15 @@ namespace Orchard.Tests.Events {
|
||||
private IContainer _container;
|
||||
private IEventBus _eventBus;
|
||||
private StubEventBusHandler _eventBusHandler;
|
||||
private StubEventHandler _eventHandler;
|
||||
|
||||
[SetUp]
|
||||
public void Init() {
|
||||
var builder = new ContainerBuilder();
|
||||
_eventBusHandler = new StubEventBusHandler();
|
||||
_eventHandler = new StubEventHandler();
|
||||
builder.RegisterInstance(_eventBusHandler).As<IEventBusHandler>();
|
||||
builder.RegisterInstance(_eventHandler).As<IEventHandler>();
|
||||
builder.RegisterType<DefaultOrchardEventBus>().As<IEventBus>();
|
||||
_container = builder.Build();
|
||||
_eventBus = _container.Resolve<IEventBus>();
|
||||
@@ -38,5 +42,29 @@ namespace Orchard.Tests.Events {
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void EventsAreCorrectlyDispatchedToEventHandlers() {
|
||||
Assert.That(_eventHandler.Count, Is.EqualTo(0));
|
||||
_eventBus.Notify("ITestEventHandler.Increment", new Dictionary<string, object>());
|
||||
Assert.That(_eventHandler.Count, Is.EqualTo(1));
|
||||
}
|
||||
|
||||
public interface ITestEventHandler : IEventHandler {
|
||||
void Increment();
|
||||
}
|
||||
|
||||
public class StubEventHandler : ITestEventHandler {
|
||||
public int Count { get; set; }
|
||||
|
||||
public void Increment() {
|
||||
Count++;
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void EventBusThrowsIfMessageNameIsNotCorrectlyFormatted() {
|
||||
Assert.Throws<ArgumentException>(() => _eventBus.Notify("StubEventHandlerIncrement", new Dictionary<string, object>()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Orchard.Localization;
|
||||
using Orchard.Logging;
|
||||
|
||||
namespace Orchard.Events {
|
||||
@@ -11,9 +12,11 @@ namespace Orchard.Events {
|
||||
_handlers = handlers;
|
||||
_eventHandlers = eventHandlers;
|
||||
Logger = NullLogger.Instance;
|
||||
T = NullLocalizer.Instance;
|
||||
}
|
||||
|
||||
public ILogger Logger { get; set; }
|
||||
public Localizer T { get; set; }
|
||||
|
||||
#region Implementation of IEventBus
|
||||
|
||||
@@ -22,6 +25,35 @@ namespace Orchard.Events {
|
||||
}
|
||||
|
||||
public void Notify(string messageName, Dictionary<string, object> eventData) {
|
||||
string[] parameters = messageName.Split('.');
|
||||
if (parameters.Length != 2) {
|
||||
throw new ArgumentException(messageName + T(" is not formatted correctly"));
|
||||
}
|
||||
string interfaceName = parameters[0];
|
||||
string methodName = parameters[1];
|
||||
|
||||
foreach (var eventHandler in _eventHandlers) {
|
||||
TryInvoke(eventHandler, interfaceName, methodName, eventData);
|
||||
}
|
||||
}
|
||||
|
||||
private static void TryInvoke(IEventHandler eventHandler, string interfaceName, string methodName, Dictionary<string, object> arguments) {
|
||||
Type type = eventHandler.GetType();
|
||||
foreach (var interfaceType in type.GetInterfaces()) {
|
||||
if (String.Equals(interfaceType.Name, interfaceName, StringComparison.OrdinalIgnoreCase)) {
|
||||
TryInvokeMethod(eventHandler, methodName, arguments);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void TryInvokeMethod(IEventHandler eventHandler, string methodName, Dictionary<string, object> arguments) {
|
||||
foreach (var method in eventHandler.GetType().GetMethods()) {
|
||||
if (String.Equals(method.Name, methodName)) {
|
||||
method.Invoke(eventHandler, new object[] { });
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
Reference in New Issue
Block a user