--HG--
branch : 1.x
This commit is contained in:
Dave Reed
2011-05-25 12:13:53 -07:00
4 changed files with 58 additions and 2 deletions

View File

@@ -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 {}
}
}
}

View 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);
}
};
}
};
}
}
}

View File

@@ -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());

View File

@@ -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" />