mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-12-03 03:58:13 +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) {
|
public override void Register(ContainerBuilder builder) {
|
||||||
builder.RegisterType<ShellDescriptorManager>().As<IShellDescriptorManager>();
|
builder.RegisterType<ShellDescriptorManager>().As<IShellDescriptorManager>();
|
||||||
builder.RegisterType<StubEventBus>().As<IEventBus>().SingleInstance();
|
builder.RegisterType<StubEventBus>().As<IEventBus>().SingleInstance();
|
||||||
|
builder.RegisterSource(new EventsRegistrationSource());
|
||||||
}
|
}
|
||||||
|
|
||||||
public class StubEventBus : IEventBus {
|
public class StubEventBus : IEventBus {
|
||||||
public string LastMessageName { get; set; }
|
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) {
|
public void Notify_Obsolete(string messageName, IDictionary<string, string> eventData) {
|
||||||
LastMessageName = messageName;
|
|
||||||
LastEventData = eventData;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Notify(string messageName, Dictionary<string, object> eventData) {
|
public void Notify(string messageName, Dictionary<string, object> eventData) {
|
||||||
throw new NotImplementedException();
|
LastMessageName = messageName;
|
||||||
|
LastEventData = eventData;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -141,7 +140,7 @@ namespace Orchard.Tests.Modules.Settings.Topology {
|
|||||||
Enumerable.Empty<ShellFeature>(),
|
Enumerable.Empty<ShellFeature>(),
|
||||||
Enumerable.Empty<ShellParameter>());
|
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 Moq;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using Orchard.Environment.Configuration;
|
using Orchard.Environment.Configuration;
|
||||||
using Orchard.Events;
|
|
||||||
|
|
||||||
namespace Orchard.Tests.Environment.Configuration {
|
namespace Orchard.Tests.Environment.Configuration {
|
||||||
[TestFixture]
|
[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");
|
_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();
|
var settings = loader.LoadSettings().Single();
|
||||||
Assert.That(settings, Is.Not.Null);
|
Assert.That(settings, Is.Not.Null);
|
||||||
Assert.That(settings.Name, Is.EqualTo("Default"));
|
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\\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");
|
_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();
|
var settings = loader.LoadSettings();
|
||||||
Assert.That(settings.Count(), Is.EqualTo(2));
|
Assert.That(settings.Count(), Is.EqualTo(2));
|
||||||
|
|
||||||
@@ -62,7 +61,7 @@ namespace Orchard.Tests.Environment.Configuration {
|
|||||||
public void NewSettingsCanBeStored() {
|
public void NewSettingsCanBeStored() {
|
||||||
_appData.CreateFile("Sites\\Default\\Settings.txt", "Name: Default\r\nDataProvider: SQLite\r\nDataConnectionString: something else");
|
_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"};
|
var foo = new ShellSettings {Name = "Foo", DataProvider = "Bar", DataConnectionString = "Quux"};
|
||||||
|
|
||||||
Assert.That(loader.LoadSettings().Count(), Is.EqualTo(1));
|
Assert.That(loader.LoadSettings().Count(), Is.EqualTo(1));
|
||||||
|
|||||||
@@ -12,10 +12,12 @@ namespace Orchard.Tests.Stubs {
|
|||||||
|
|
||||||
public StubHttpContext() {
|
public StubHttpContext() {
|
||||||
_appRelativeCurrentExecutionFilePath = "~/yadda";
|
_appRelativeCurrentExecutionFilePath = "~/yadda";
|
||||||
|
_hostHeader = "localhost";
|
||||||
}
|
}
|
||||||
|
|
||||||
public StubHttpContext(string appRelativeCurrentExecutionFilePath) {
|
public StubHttpContext(string appRelativeCurrentExecutionFilePath) {
|
||||||
_appRelativeCurrentExecutionFilePath = appRelativeCurrentExecutionFilePath;
|
_appRelativeCurrentExecutionFilePath = appRelativeCurrentExecutionFilePath;
|
||||||
|
_hostHeader = "localhost";
|
||||||
}
|
}
|
||||||
|
|
||||||
public StubHttpContext(string appRelativeCurrentExecutionFilePath, string hostHeader) {
|
public StubHttpContext(string appRelativeCurrentExecutionFilePath, string hostHeader) {
|
||||||
@@ -38,6 +40,7 @@ namespace Orchard.Tests.Stubs {
|
|||||||
class StubHttpRequest : HttpRequestBase {
|
class StubHttpRequest : HttpRequestBase {
|
||||||
private readonly StubHttpContext _httpContext;
|
private readonly StubHttpContext _httpContext;
|
||||||
private NameValueCollection _serverVariables;
|
private NameValueCollection _serverVariables;
|
||||||
|
private NameValueCollection _headers;
|
||||||
|
|
||||||
public StubHttpRequest(StubHttpContext httpContext) {
|
public StubHttpRequest(StubHttpContext httpContext) {
|
||||||
_httpContext = httpContext;
|
_httpContext = httpContext;
|
||||||
@@ -54,7 +57,12 @@ namespace Orchard.Tests.Stubs {
|
|||||||
public override string PathInfo {
|
public override string PathInfo {
|
||||||
get { return ""; }
|
get { return ""; }
|
||||||
}
|
}
|
||||||
|
public override NameValueCollection Headers {
|
||||||
|
get {
|
||||||
|
return _headers = _headers
|
||||||
|
?? new NameValueCollection { { "Host", _httpContext._hostHeader } };
|
||||||
|
}
|
||||||
|
}
|
||||||
public override NameValueCollection ServerVariables {
|
public override NameValueCollection ServerVariables {
|
||||||
get {
|
get {
|
||||||
return _serverVariables = _serverVariables
|
return _serverVariables = _serverVariables
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
using Orchard.Environment.Configuration;
|
using Orchard.Events;
|
||||||
|
|
||||||
namespace Orchard.Events {
|
namespace Orchard.Environment.Configuration {
|
||||||
public interface IShellSettingsEventHandler : IEventHandler {
|
public interface IShellSettingsManagerEventHandler : IEventHandler {
|
||||||
void Saved(ShellSettings settings);
|
void Saved(ShellSettings settings);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -6,11 +6,6 @@ using System.Yaml.Serialization;
|
|||||||
using Orchard.Localization;
|
using Orchard.Localization;
|
||||||
|
|
||||||
namespace Orchard.Environment.Configuration {
|
namespace Orchard.Environment.Configuration {
|
||||||
public interface IShellSettingsManager {
|
|
||||||
IEnumerable<ShellSettings> LoadSettings();
|
|
||||||
void SaveSettings(ShellSettings settings);
|
|
||||||
}
|
|
||||||
|
|
||||||
public class ShellSettingsManager : IShellSettingsManager {
|
public class ShellSettingsManager : IShellSettingsManager {
|
||||||
private readonly IAppDataFolder _appDataFolder;
|
private readonly IAppDataFolder _appDataFolder;
|
||||||
private readonly IShellSettingsManagerEventHandler _events;
|
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) {
|
public static IContainer CreateHostContainer(Action<ContainerBuilder> registrations) {
|
||||||
var builder = new ContainerBuilder();
|
var builder = new ContainerBuilder();
|
||||||
builder.RegisterModule(new LoggingModule());
|
builder.RegisterModule(new LoggingModule());
|
||||||
|
builder.RegisterModule(new EventsModule());
|
||||||
|
|
||||||
// a single default host implementation is needed for bootstrapping a web app domain
|
// a single default host implementation is needed for bootstrapping a web app domain
|
||||||
builder.RegisterType<DefaultOrchardEventBus>().As<IEventBus>().SingleInstance();
|
builder.RegisterType<DefaultOrchardEventBus>().As<IEventBus>().SingleInstance();
|
||||||
builder.RegisterType<AppDataFolder>().As<IAppDataFolder>().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();
|
builder.RegisterType<ShellSettingsManager>().As<IShellSettingsManager>().SingleInstance();
|
||||||
|
|
||||||
|
|||||||
@@ -67,6 +67,7 @@ namespace Orchard.Environment.Topology {
|
|||||||
ExportedTypes =
|
ExportedTypes =
|
||||||
typeof(OrchardStarter).Assembly.GetExportedTypes()
|
typeof(OrchardStarter).Assembly.GetExportedTypes()
|
||||||
.Where(t => t.IsClass && !t.IsAbstract)
|
.Where(t => t.IsClass && !t.IsAbstract)
|
||||||
|
.Except(new[] { typeof(DefaultOrchardHost) })
|
||||||
.ToArray()
|
.ToArray()
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,7 +34,8 @@ namespace Orchard.Events {
|
|||||||
string interfaceName = parameters[0];
|
string interfaceName = parameters[0];
|
||||||
string methodName = parameters[1];
|
string methodName = parameters[1];
|
||||||
|
|
||||||
foreach (var eventHandler in _eventHandlers()) {
|
var eventHandlers = _eventHandlers();
|
||||||
|
foreach (var eventHandler in eventHandlers) {
|
||||||
TryInvoke(eventHandler, interfaceName, methodName, eventData);
|
TryInvoke(eventHandler, interfaceName, methodName, eventData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -43,14 +44,14 @@ namespace Orchard.Events {
|
|||||||
Type type = eventHandler.GetType();
|
Type type = eventHandler.GetType();
|
||||||
foreach (var interfaceType in type.GetInterfaces()) {
|
foreach (var interfaceType in type.GetInterfaces()) {
|
||||||
if (String.Equals(interfaceType.Name, interfaceName, StringComparison.OrdinalIgnoreCase)) {
|
if (String.Equals(interfaceType.Name, interfaceName, StringComparison.OrdinalIgnoreCase)) {
|
||||||
TryInvokeMethod(eventHandler, methodName, arguments);
|
TryInvokeMethod(eventHandler, interfaceType, methodName, arguments);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void TryInvokeMethod(IEventHandler eventHandler, string methodName, IDictionary<string, object> arguments) {
|
private static void TryInvokeMethod(IEventHandler eventHandler, Type interfaceType, string methodName, IDictionary<string, object> arguments) {
|
||||||
MethodInfo method = GetMatchingMethod(eventHandler, methodName, arguments);
|
MethodInfo method = GetMatchingMethod(eventHandler, interfaceType, methodName, arguments);
|
||||||
if (method != null) {
|
if (method != null) {
|
||||||
List<object> parameters = new List<object>();
|
List<object> parameters = new List<object>();
|
||||||
foreach (var methodParameter in method.GetParameters()) {
|
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) {
|
private static MethodInfo GetMatchingMethod(IEventHandler eventHandler, Type interfaceType, string methodName, IDictionary<string, object> arguments) {
|
||||||
List<MethodInfo> allMethods = new List<MethodInfo>(eventHandler.GetType().GetMethods());
|
List<MethodInfo> allMethods = new List<MethodInfo>(interfaceType.GetMethods());
|
||||||
List<MethodInfo> candidates = new List<MethodInfo>(allMethods);
|
List<MethodInfo> candidates = new List<MethodInfo>(allMethods);
|
||||||
|
|
||||||
foreach (var method in allMethods) {
|
foreach (var method in allMethods) {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
using Autofac;
|
using Autofac;
|
||||||
|
|
||||||
namespace Orchard.Events {
|
namespace Orchard.Events {
|
||||||
public class EventsModule : Module {
|
internal class EventsModule : Module {
|
||||||
protected override void Load(ContainerBuilder builder) {
|
protected override void Load(ContainerBuilder builder) {
|
||||||
builder.RegisterSource(new EventsRegistrationSource());
|
builder.RegisterSource(new EventsRegistrationSource());
|
||||||
base.Load(builder);
|
base.Load(builder);
|
||||||
|
|||||||
@@ -162,8 +162,8 @@
|
|||||||
<Compile Include="Data\Conventions\StringLengthConvention.cs" />
|
<Compile Include="Data\Conventions\StringLengthConvention.cs" />
|
||||||
<Compile Include="Data\SessionFactoryHolder.cs" />
|
<Compile Include="Data\SessionFactoryHolder.cs" />
|
||||||
<Compile Include="Environment\AutofacUtil\LifetimeScopeContainer.cs" />
|
<Compile Include="Environment\AutofacUtil\LifetimeScopeContainer.cs" />
|
||||||
|
<Compile Include="Environment\Configuration\IShellSettingsManager.cs" />
|
||||||
<Compile Include="Environment\Configuration\TenantState.cs" />
|
<Compile Include="Environment\Configuration\TenantState.cs" />
|
||||||
<Compile Include="Environment\DefaultOrchardHostEventSink.cs" />
|
|
||||||
<Compile Include="Environment\RunningShellTable.cs" />
|
<Compile Include="Environment\RunningShellTable.cs" />
|
||||||
<Compile Include="Environment\AutofacUtil\DynamicProxy2\DynamicProxyContext.cs" />
|
<Compile Include="Environment\AutofacUtil\DynamicProxy2\DynamicProxyContext.cs" />
|
||||||
<Compile Include="Environment\AutofacUtil\DynamicProxy2\DynamicProxyExtensions.cs" />
|
<Compile Include="Environment\AutofacUtil\DynamicProxy2\DynamicProxyExtensions.cs" />
|
||||||
@@ -184,7 +184,7 @@
|
|||||||
<Compile Include="Events\EventsInterceptor.cs" />
|
<Compile Include="Events\EventsInterceptor.cs" />
|
||||||
<Compile Include="Events\EventsModule.cs" />
|
<Compile Include="Events\EventsModule.cs" />
|
||||||
<Compile Include="Events\EventsRegistrationSource.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\IEventBus.cs" />
|
||||||
<Compile Include="Events\IEventBusHandler.cs" />
|
<Compile Include="Events\IEventBusHandler.cs" />
|
||||||
<Compile Include="Environment\Extensions\Folders\AreaFolders.cs" />
|
<Compile Include="Environment\Extensions\Folders\AreaFolders.cs" />
|
||||||
|
|||||||
Reference in New Issue
Block a user