mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2026-02-09 09:16:41 +08:00
Merge
--HG-- branch : 1.x
This commit is contained in:
@@ -1,4 +1,6 @@
|
||||
using System.Web.Mvc;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Web.Mvc;
|
||||
using Autofac;
|
||||
using NUnit.Framework;
|
||||
using Orchard.Environment;
|
||||
@@ -11,5 +13,34 @@ namespace Orchard.Tests.Environment {
|
||||
var host = OrchardStarter.CreateHost(b => b.RegisterInstance(new ControllerBuilder()));
|
||||
Assert.That(host, Is.TypeOf<DefaultOrchardHost>());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ContainerResolvesServicesInSameOrderTheyAreRegistered() {
|
||||
var container = OrchardStarter.CreateHostContainer(builder => {
|
||||
builder.RegisterType<Component1>().As<IServiceA>();
|
||||
builder.RegisterType<Component2>().As<IServiceA>();
|
||||
});
|
||||
var services = container.Resolve<IEnumerable<IServiceA>>();
|
||||
Assert.That(services.Count(), Is.EqualTo(2));
|
||||
Assert.That(services.First(), Is.TypeOf<Component1>());
|
||||
Assert.That(services.Last(), Is.TypeOf<Component2>());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void MostRecentlyRegisteredServiceReturnsFromSingularResolve() {
|
||||
var container = OrchardStarter.CreateHostContainer(builder => {
|
||||
builder.RegisterType<Component1>().As<IServiceA>();
|
||||
builder.RegisterType<Component2>().As<IServiceA>();
|
||||
});
|
||||
var service = container.Resolve<IServiceA>();
|
||||
Assert.That(service, Is.Not.Null);
|
||||
Assert.That(service, Is.TypeOf<Component2>());
|
||||
}
|
||||
|
||||
public interface IServiceA {}
|
||||
|
||||
public class Component1 : IServiceA {}
|
||||
|
||||
public class Component2 : IServiceA {}
|
||||
}
|
||||
}
|
||||
}
|
||||
23
src/Orchard/Environment/CollectionOrderModule.cs
Normal file
23
src/Orchard/Environment/CollectionOrderModule.cs
Normal file
@@ -0,0 +1,23 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using Autofac.Core;
|
||||
|
||||
namespace Orchard.Environment {
|
||||
internal class CollectionOrderModule : IModule {
|
||||
public void Configure(IComponentRegistry componentRegistry) {
|
||||
componentRegistry.Registered += (sender, registered) => {
|
||||
// only bother watching enumerable resolves
|
||||
var limitType = registered.ComponentRegistration.Activator.LimitType;
|
||||
if (typeof(IEnumerable).IsAssignableFrom(limitType)) {
|
||||
registered.ComponentRegistration.Activated += (sender2, activated) => {
|
||||
// Autofac's IEnumerable feature returns an Array
|
||||
if (activated.Instance is Array) {
|
||||
// Orchard needs FIFO, not FILO, component order
|
||||
Array.Reverse((Array)activated.Instance);
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -31,6 +31,7 @@ namespace Orchard.Environment {
|
||||
public static class OrchardStarter {
|
||||
public static IContainer CreateHostContainer(Action<ContainerBuilder> registrations) {
|
||||
var builder = new ContainerBuilder();
|
||||
builder.RegisterModule(new CollectionOrderModule());
|
||||
builder.RegisterModule(new LoggingModule());
|
||||
builder.RegisterModule(new EventsModule());
|
||||
builder.RegisterModule(new CacheModule());
|
||||
|
||||
@@ -174,6 +174,7 @@
|
||||
<Compile Include="DisplayManagement\Implementation\IShapeFactoryEvents.cs" />
|
||||
<Compile Include="DisplayManagement\Shapes\ShapeDebugView.cs" />
|
||||
<Compile Include="DisplayManagement\Shapes\ITagBuilderFactory.cs" />
|
||||
<Compile Include="Environment\CollectionOrderModule.cs" />
|
||||
<Compile Include="Environment\Extensions\OrchardSuppressDependencyAttribute.cs" />
|
||||
<Compile Include="Environment\Features\IFeatureManager.cs" />
|
||||
<Compile Include="Environment\IAssemblyNameResolver.cs" />
|
||||
|
||||
Reference in New Issue
Block a user