mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-15 19:54:57 +08:00
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:
@@ -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"));
|
||||
|
@@ -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) {
|
||||
|
@@ -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();
|
||||
|
@@ -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) {
|
||||
|
@@ -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; }
|
||||
}
|
||||
|
Reference in New Issue
Block a user