- EventBus.Notify is dispatching events to handlers.

- Tests...

--HG--
branch : dev
This commit is contained in:
Suha Can
2010-05-11 12:20:22 -07:00
parent 13657ebb1a
commit 2c99c817e4
2 changed files with 60 additions and 0 deletions

View File

@@ -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>()));
}
}
}

View File

@@ -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