mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-15 19:54:57 +08:00
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:
@@ -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"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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));
|
||||
|
@@ -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
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@@ -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;
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@@ -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();
|
||||
|
||||
|
@@ -67,6 +67,7 @@ namespace Orchard.Environment.Topology {
|
||||
ExportedTypes =
|
||||
typeof(OrchardStarter).Assembly.GetExportedTypes()
|
||||
.Where(t => t.IsClass && !t.IsAbstract)
|
||||
.Except(new[] { typeof(DefaultOrchardHost) })
|
||||
.ToArray()
|
||||
};
|
||||
}
|
||||
|
@@ -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) {
|
||||
|
@@ -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);
|
||||
|
@@ -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" />
|
||||
|
Reference in New Issue
Block a user