Fixing unit tests and adjusting mechanics related to events for host layer components

DefaultOrchardHost may now implement eventhandler interfaces directly
DefaultOrchardHostEventSink assistant is obsolete for that reason
DefaultOrchardEventBus changed to use interface methodinfo rather than class methodinfo
OrchardStarter includes EventsModule with root container to allow components to receive event firing proxies
Special case added to CompositionStrategy to prevent DefaultOrchardHost from being re-registered when shell container is built
EventsModule is internal to prevent it from being re-registered in the same way

--HG--
branch : dev
This commit is contained in:
Louis DeJardin
2010-05-12 20:52:00 -07:00
parent 87e4874968
commit 3abc44e773
11 changed files with 35 additions and 64 deletions

View File

@@ -15,20 +15,19 @@ namespace Orchard.Tests.Modules.Settings.Topology {
public override void Register(ContainerBuilder builder) {
builder.RegisterType<ShellDescriptorManager>().As<IShellDescriptorManager>();
builder.RegisterType<StubEventBus>().As<IEventBus>().SingleInstance();
builder.RegisterSource(new EventsRegistrationSource());
}
public class StubEventBus : IEventBus {
public string LastMessageName { get; set; }
public IDictionary<string, string> LastEventData { get; set; }
public IDictionary<string, object> LastEventData { get; set; }
public void Notify_Obsolete(string messageName, IDictionary<string, string> eventData) {
LastMessageName = messageName;
LastEventData = eventData;
}
public void Notify(string messageName, Dictionary<string, object> eventData) {
throw new NotImplementedException();
public void Notify(string messageName, Dictionary<string, object> eventData) {
LastMessageName = messageName;
LastEventData = eventData;
}
}
@@ -141,7 +140,7 @@ namespace Orchard.Tests.Modules.Settings.Topology {
Enumerable.Empty<ShellFeature>(),
Enumerable.Empty<ShellParameter>());
Assert.That(eventBus.LastMessageName, Is.EqualTo("ShellDescriptor_Changed"));
Assert.That(eventBus.LastMessageName, Is.EqualTo("IShellDescriptorManagerEventHandler.Changed"));
}
}
}

View File

@@ -3,7 +3,6 @@ using System.Linq;
using Moq;
using NUnit.Framework;
using Orchard.Environment.Configuration;
using Orchard.Events;
namespace Orchard.Tests.Environment.Configuration {
[TestFixture]
@@ -28,7 +27,7 @@ namespace Orchard.Tests.Environment.Configuration {
_appData.CreateFile("Sites\\Default\\Settings.txt", "Name: Default\r\nDataProvider: SQLite\r\nDataConnectionString: something else");
IShellSettingsManager loader = new ShellSettingsManager(_appData, new Mock<IShellSettingsEventHandler>().Object);
IShellSettingsManager loader = new ShellSettingsManager(_appData, new Mock<IShellSettingsManagerEventHandler>().Object);
var settings = loader.LoadSettings().Single();
Assert.That(settings, Is.Not.Null);
Assert.That(settings.Name, Is.EqualTo("Default"));
@@ -43,7 +42,7 @@ namespace Orchard.Tests.Environment.Configuration {
_appData.CreateFile("Sites\\Default\\Settings.txt", "Name: Default\r\nDataProvider: SQLite\r\nDataConnectionString: something else");
_appData.CreateFile("Sites\\Another\\Settings.txt", "Name: Another\r\nDataProvider: SQLite2\r\nDataConnectionString: something else2");
IShellSettingsManager loader = new ShellSettingsManager(_appData, new Mock<IShellSettingsEventHandler>().Object);
IShellSettingsManager loader = new ShellSettingsManager(_appData, new Mock<IShellSettingsManagerEventHandler>().Object);
var settings = loader.LoadSettings();
Assert.That(settings.Count(), Is.EqualTo(2));
@@ -62,7 +61,7 @@ namespace Orchard.Tests.Environment.Configuration {
public void NewSettingsCanBeStored() {
_appData.CreateFile("Sites\\Default\\Settings.txt", "Name: Default\r\nDataProvider: SQLite\r\nDataConnectionString: something else");
IShellSettingsManager loader = new ShellSettingsManager(_appData, new Mock<IShellSettingsEventHandler>().Object);
IShellSettingsManager loader = new ShellSettingsManager(_appData, new Mock<IShellSettingsManagerEventHandler>().Object);
var foo = new ShellSettings {Name = "Foo", DataProvider = "Bar", DataConnectionString = "Quux"};
Assert.That(loader.LoadSettings().Count(), Is.EqualTo(1));

View File

@@ -12,10 +12,12 @@ namespace Orchard.Tests.Stubs {
public StubHttpContext() {
_appRelativeCurrentExecutionFilePath = "~/yadda";
_hostHeader = "localhost";
}
public StubHttpContext(string appRelativeCurrentExecutionFilePath) {
_appRelativeCurrentExecutionFilePath = appRelativeCurrentExecutionFilePath;
_hostHeader = "localhost";
}
public StubHttpContext(string appRelativeCurrentExecutionFilePath, string hostHeader) {
@@ -38,6 +40,7 @@ namespace Orchard.Tests.Stubs {
class StubHttpRequest : HttpRequestBase {
private readonly StubHttpContext _httpContext;
private NameValueCollection _serverVariables;
private NameValueCollection _headers;
public StubHttpRequest(StubHttpContext httpContext) {
_httpContext = httpContext;
@@ -54,7 +57,12 @@ namespace Orchard.Tests.Stubs {
public override string PathInfo {
get { return ""; }
}
public override NameValueCollection Headers {
get {
return _headers = _headers
?? new NameValueCollection { { "Host", _httpContext._hostHeader } };
}
}
public override NameValueCollection ServerVariables {
get {
return _serverVariables = _serverVariables

View File

@@ -1,7 +1,7 @@
using Orchard.Environment.Configuration;
using Orchard.Events;
namespace Orchard.Events {
public interface IShellSettingsEventHandler : IEventHandler {
namespace Orchard.Environment.Configuration {
public interface IShellSettingsManagerEventHandler : IEventHandler {
void Saved(ShellSettings settings);
}
}
}

View File

@@ -6,11 +6,6 @@ using System.Yaml.Serialization;
using Orchard.Localization;
namespace Orchard.Environment.Configuration {
public interface IShellSettingsManager {
IEnumerable<ShellSettings> LoadSettings();
void SaveSettings(ShellSettings settings);
}
public class ShellSettingsManager : IShellSettingsManager {
private readonly IAppDataFolder _appDataFolder;
private readonly IShellSettingsManagerEventHandler _events;

View File

@@ -1,33 +0,0 @@
using System;
using System.Collections.Generic;
using Orchard.Environment.Configuration;
using Orchard.Environment.Topology;
using Orchard.Environment.Topology.Models;
using Orchard.Events;
namespace Orchard.Environment {
/// <summary>
/// This handler forwards calls to the IOrchardHost when it is an instance of DefaultOrchardHost.
/// The reason for this is to avoid adding IEventBusHandler, because DefaultOrchardHost is a component
/// that should not be detected and registererd automatically as an IDependency.
/// </summary>
public class DefaultOrchardHostEventSink : IShellSettingsEventHandler, IShellDescriptorManagerEventHandler {
private readonly IShellSettingsEventHandler _shellSettingsEventHandler;
private readonly IShellDescriptorManagerEventHandler _shellDescriptorManagerEventHandler;
public DefaultOrchardHostEventSink(IOrchardHost host) {
_shellSettingsEventHandler = host as IShellSettingsEventHandler;
_shellDescriptorManagerEventHandler = host as IShellDescriptorManagerEventHandler;
}
void IShellSettingsEventHandler.Saved(ShellSettings settings) {
if (_shellSettingsEventHandler != null)
_shellSettingsEventHandler.Saved(settings);
}
void IShellDescriptorManagerEventHandler.Changed(ShellDescriptor descriptor) {
if (_shellDescriptorManagerEventHandler != null)
_shellDescriptorManagerEventHandler.Changed(descriptor);
}
}
}

View File

@@ -20,12 +20,13 @@ namespace Orchard.Environment {
public static IContainer CreateHostContainer(Action<ContainerBuilder> registrations) {
var builder = new ContainerBuilder();
builder.RegisterModule(new LoggingModule());
builder.RegisterModule(new EventsModule());
// a single default host implementation is needed for bootstrapping a web app domain
builder.RegisterType<DefaultOrchardEventBus>().As<IEventBus>().SingleInstance();
builder.RegisterType<AppDataFolder>().As<IAppDataFolder>().SingleInstance();
builder.RegisterType<DefaultOrchardHost>().As<IOrchardHost>().SingleInstance();
builder.RegisterType<DefaultOrchardHost>().As<IOrchardHost>().As<IEventHandler>().SingleInstance();
{
builder.RegisterType<ShellSettingsManager>().As<IShellSettingsManager>().SingleInstance();

View File

@@ -67,6 +67,7 @@ namespace Orchard.Environment.Topology {
ExportedTypes =
typeof(OrchardStarter).Assembly.GetExportedTypes()
.Where(t => t.IsClass && !t.IsAbstract)
.Except(new[] { typeof(DefaultOrchardHost) })
.ToArray()
};
}

View File

@@ -34,7 +34,8 @@ namespace Orchard.Events {
string interfaceName = parameters[0];
string methodName = parameters[1];
foreach (var eventHandler in _eventHandlers()) {
var eventHandlers = _eventHandlers();
foreach (var eventHandler in eventHandlers) {
TryInvoke(eventHandler, interfaceName, methodName, eventData);
}
}
@@ -43,14 +44,14 @@ namespace Orchard.Events {
Type type = eventHandler.GetType();
foreach (var interfaceType in type.GetInterfaces()) {
if (String.Equals(interfaceType.Name, interfaceName, StringComparison.OrdinalIgnoreCase)) {
TryInvokeMethod(eventHandler, methodName, arguments);
TryInvokeMethod(eventHandler, interfaceType, methodName, arguments);
break;
}
}
}
private static void TryInvokeMethod(IEventHandler eventHandler, string methodName, IDictionary<string, object> arguments) {
MethodInfo method = GetMatchingMethod(eventHandler, methodName, arguments);
private static void TryInvokeMethod(IEventHandler eventHandler, Type interfaceType, string methodName, IDictionary<string, object> arguments) {
MethodInfo method = GetMatchingMethod(eventHandler, interfaceType, methodName, arguments);
if (method != null) {
List<object> parameters = new List<object>();
foreach (var methodParameter in method.GetParameters()) {
@@ -60,8 +61,8 @@ namespace Orchard.Events {
}
}
private static MethodInfo GetMatchingMethod(IEventHandler eventHandler, string methodName, IDictionary<string, object> arguments) {
List<MethodInfo> allMethods = new List<MethodInfo>(eventHandler.GetType().GetMethods());
private static MethodInfo GetMatchingMethod(IEventHandler eventHandler, Type interfaceType, string methodName, IDictionary<string, object> arguments) {
List<MethodInfo> allMethods = new List<MethodInfo>(interfaceType.GetMethods());
List<MethodInfo> candidates = new List<MethodInfo>(allMethods);
foreach (var method in allMethods) {

View File

@@ -1,7 +1,7 @@
using Autofac;
namespace Orchard.Events {
public class EventsModule : Module {
internal class EventsModule : Module {
protected override void Load(ContainerBuilder builder) {
builder.RegisterSource(new EventsRegistrationSource());
base.Load(builder);

View File

@@ -162,8 +162,8 @@
<Compile Include="Data\Conventions\StringLengthConvention.cs" />
<Compile Include="Data\SessionFactoryHolder.cs" />
<Compile Include="Environment\AutofacUtil\LifetimeScopeContainer.cs" />
<Compile Include="Environment\Configuration\IShellSettingsManager.cs" />
<Compile Include="Environment\Configuration\TenantState.cs" />
<Compile Include="Environment\DefaultOrchardHostEventSink.cs" />
<Compile Include="Environment\RunningShellTable.cs" />
<Compile Include="Environment\AutofacUtil\DynamicProxy2\DynamicProxyContext.cs" />
<Compile Include="Environment\AutofacUtil\DynamicProxy2\DynamicProxyExtensions.cs" />
@@ -184,7 +184,7 @@
<Compile Include="Events\EventsInterceptor.cs" />
<Compile Include="Events\EventsModule.cs" />
<Compile Include="Events\EventsRegistrationSource.cs" />
<Compile Include="Events\IShellSettingsEventHandler.cs" />
<Compile Include="Environment\Configuration\IShellSettingsManagerEventHandler.cs" />
<Compile Include="Events\IEventBus.cs" />
<Compile Include="Events\IEventBusHandler.cs" />
<Compile Include="Environment\Extensions\Folders\AreaFolders.cs" />