mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2026-02-09 09:16:41 +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 Autofac;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using Orchard.Events;
|
using Orchard.Events;
|
||||||
|
using System;
|
||||||
|
|
||||||
namespace Orchard.Tests.Events {
|
namespace Orchard.Tests.Events {
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
@@ -9,12 +10,15 @@ namespace Orchard.Tests.Events {
|
|||||||
private IContainer _container;
|
private IContainer _container;
|
||||||
private IEventBus _eventBus;
|
private IEventBus _eventBus;
|
||||||
private StubEventBusHandler _eventBusHandler;
|
private StubEventBusHandler _eventBusHandler;
|
||||||
|
private StubEventHandler _eventHandler;
|
||||||
|
|
||||||
[SetUp]
|
[SetUp]
|
||||||
public void Init() {
|
public void Init() {
|
||||||
var builder = new ContainerBuilder();
|
var builder = new ContainerBuilder();
|
||||||
_eventBusHandler = new StubEventBusHandler();
|
_eventBusHandler = new StubEventBusHandler();
|
||||||
|
_eventHandler = new StubEventHandler();
|
||||||
builder.RegisterInstance(_eventBusHandler).As<IEventBusHandler>();
|
builder.RegisterInstance(_eventBusHandler).As<IEventBusHandler>();
|
||||||
|
builder.RegisterInstance(_eventHandler).As<IEventHandler>();
|
||||||
builder.RegisterType<DefaultOrchardEventBus>().As<IEventBus>();
|
builder.RegisterType<DefaultOrchardEventBus>().As<IEventBus>();
|
||||||
_container = builder.Build();
|
_container = builder.Build();
|
||||||
_eventBus = _container.Resolve<IEventBus>();
|
_eventBus = _container.Resolve<IEventBus>();
|
||||||
@@ -38,5 +42,29 @@ namespace Orchard.Tests.Events {
|
|||||||
|
|
||||||
#endregion
|
#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;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using Orchard.Localization;
|
||||||
using Orchard.Logging;
|
using Orchard.Logging;
|
||||||
|
|
||||||
namespace Orchard.Events {
|
namespace Orchard.Events {
|
||||||
@@ -11,9 +12,11 @@ namespace Orchard.Events {
|
|||||||
_handlers = handlers;
|
_handlers = handlers;
|
||||||
_eventHandlers = eventHandlers;
|
_eventHandlers = eventHandlers;
|
||||||
Logger = NullLogger.Instance;
|
Logger = NullLogger.Instance;
|
||||||
|
T = NullLocalizer.Instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ILogger Logger { get; set; }
|
public ILogger Logger { get; set; }
|
||||||
|
public Localizer T { get; set; }
|
||||||
|
|
||||||
#region Implementation of IEventBus
|
#region Implementation of IEventBus
|
||||||
|
|
||||||
@@ -22,6 +25,35 @@ namespace Orchard.Events {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void Notify(string messageName, Dictionary<string, object> eventData) {
|
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
|
#endregion
|
||||||
|
|||||||
Reference in New Issue
Block a user