Refactoring ShellTopology slightly

Merging IModule and IDependency information in ShellTopology
Avoids conceptual collision with Orchard Modules and Autofac IModule components

--HG--
branch : dev
This commit is contained in:
Louis DeJardin
2010-04-19 16:21:20 -07:00
parent 4ea2ff7327
commit 1800c632b6
5 changed files with 25 additions and 20 deletions

View File

@@ -139,8 +139,8 @@ namespace Orchard.Tests.Environment {
var compositionStrategy = _container.Resolve<ICompositionStrategy>();
var topology = compositionStrategy.Compose(descriptor);
var alpha = topology.Modules.Single(x => x.Type == typeof (AlphaModule));
var beta = topology.Modules.Single(x => x.Type == typeof (BetaModule));
var alpha = topology.Dependencies.Single(x => x.Type == typeof (AlphaModule));
var beta = topology.Dependencies.Single(x => x.Type == typeof(BetaModule));
Assert.That(alpha.Feature.Descriptor.Name, Is.EqualTo("Foo"));
Assert.That(beta.Feature.Descriptor.Name, Is.EqualTo("Bar"));

View File

@@ -34,15 +34,14 @@ namespace Orchard.Tests.Environment.ShellBuilders {
}
ShellTopology CreateTopology(params ShellTopologyItem[] items) {
return new ShellTopology {
Modules = items.OfType<ModuleTopology>(),
Dependencies = items.OfType<DependencyTopology>(),
Controllers = items.OfType<ControllerTopology>(),
Records = items.OfType<RecordTopology>(),
};
}
ModuleTopology WithModule<T>() {
return new ModuleTopology { Type = typeof(T) };
DependencyTopology WithModule<T>() {
return new DependencyTopology { Type = typeof(T), Parameters = Enumerable.Empty<ShellParameter>() };
}
ControllerTopology WithController<T>(string areaName, string controllerName) {

View File

@@ -11,7 +11,7 @@ using Orchard.Environment.Configuration;
using Orchard.Environment.Topology.Models;
namespace Orchard.Environment.ShellBuilders {
public interface IShellContainerFactory {
ILifetimeScope CreateContainer(ShellSettings settings, ShellTopology topology);
}
@@ -26,10 +26,16 @@ namespace Orchard.Environment.ShellBuilders {
public ILifetimeScope CreateContainer(ShellSettings settings, ShellTopology topology) {
var intermediateScope = _lifetimeScope.BeginLifetimeScope(
builder => {
foreach (var item in topology.Modules) {
RegisterType(builder, item)
foreach (var item in topology.Dependencies.Where(t => typeof(IModule).IsAssignableFrom(t.Type))) {
var registration = RegisterType(builder, item)
.Keyed<IModule>(item.Type)
.InstancePerDependency();
foreach (var parameter in item.Parameters) {
registration = registration
.WithParameter(parameter.Name, parameter.Value)
.WithProperty(parameter.Name, parameter.Value);
}
}
});
@@ -43,11 +49,11 @@ namespace Orchard.Environment.ShellBuilders {
builder.Register(ctx => topology);
var moduleIndex = intermediateScope.Resolve<IIndex<Type, IModule>>();
foreach (var item in topology.Modules) {
foreach (var item in topology.Dependencies.Where(t => typeof(IModule).IsAssignableFrom(t.Type))) {
builder.RegisterModule(moduleIndex[item.Type]);
}
foreach (var item in topology.Dependencies) {
foreach (var item in topology.Dependencies.Where(t => typeof(IDependency).IsAssignableFrom(t.Type))) {
var registration = RegisterType(builder, item)
.EnableDynamicProxy(dynamicProxyContext)
.InstancePerLifetimeScope();

View File

@@ -39,11 +39,15 @@ namespace Orchard.Environment.Topology {
if (descriptor.EnabledFeatures.Any(feature => feature.Name == "Orchard.Framework"))
features = features.Concat(BuiltinFeatures());
var modules = BuildTopology<DependencyTopology>(features, IsModule, BuildModule);
var dependencies = BuildTopology(features, IsDependency, (t, f) => BuildDependency(t, f, descriptor));
var controllers = BuildTopology<ControllerTopology>(features, IsController, BuildController);
var records = BuildTopology<RecordTopology>(features, IsRecord, BuildRecord);
return new ShellTopology {
Modules = BuildTopology<ModuleTopology>(features, IsModule, BuildModule),
Dependencies = BuildTopology(features, IsDependency, (t, f) => BuildDependency(t, f, descriptor)),
Controllers = BuildTopology<ControllerTopology>(features, IsController, BuildController),
Records = BuildTopology<RecordTopology>(features, IsRecord, BuildRecord),
Dependencies = dependencies.Concat(modules).ToArray(),
Controllers = controllers,
Records = records,
};
}
@@ -81,8 +85,8 @@ namespace Orchard.Environment.Topology {
return typeof(IModule).IsAssignableFrom(type);
}
private static ModuleTopology BuildModule(Type type, Feature feature) {
return new ModuleTopology { Type = type, Feature = feature };
private static DependencyTopology BuildModule(Type type, Feature feature) {
return new DependencyTopology { Type = type, Feature = feature, Parameters = Enumerable.Empty<ShellParameter>() };
}
private static bool IsDependency(Type type) {

View File

@@ -10,7 +10,6 @@ namespace Orchard.Environment.Topology.Models {
/// and is passed into the IShellContainerFactory.
/// </summary>
public class ShellTopology {
public IEnumerable<ModuleTopology> Modules { get; set; }
public IEnumerable<DependencyTopology> Dependencies { get; set; }
public IEnumerable<ControllerTopology> Controllers { get; set; }
public IEnumerable<RecordTopology> Records { get; set; }
@@ -21,9 +20,6 @@ namespace Orchard.Environment.Topology.Models {
public Feature Feature { get; set; }
}
public class ModuleTopology : ShellTopologyItem {
}
public class DependencyTopology : ShellTopologyItem {
public IEnumerable<ShellParameter> Parameters { get; set; }
}