mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2026-02-09 09:16:41 +08:00
When compiling Razor views for a module/theme, we add assemblies for all modules and themes. This is overkill.
Making razor views add only assemblies for the current module, and its references. --HG-- branch : dev
This commit is contained in:
@@ -1,10 +1,13 @@
|
|||||||
using System.Collections.Generic;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Web;
|
||||||
using System.Web.Razor.Generator;
|
using System.Web.Razor.Generator;
|
||||||
using System.Web.WebPages.Razor;
|
using System.Web.WebPages.Razor;
|
||||||
using Orchard.Environment;
|
using Orchard.Environment;
|
||||||
using Orchard.Environment.Extensions.Loaders;
|
using Orchard.Environment.Extensions.Loaders;
|
||||||
using Orchard.FileSystems.Dependencies;
|
using Orchard.FileSystems.Dependencies;
|
||||||
|
using Orchard.FileSystems.VirtualPath;
|
||||||
|
|
||||||
namespace Orchard.Mvc.ViewEngines.Razor {
|
namespace Orchard.Mvc.ViewEngines.Razor {
|
||||||
public interface IRazorCompilationEvents {
|
public interface IRazorCompilationEvents {
|
||||||
@@ -27,7 +30,12 @@ namespace Orchard.Mvc.ViewEngines.Razor {
|
|||||||
private readonly IEnumerable<IExtensionLoader> _loaders;
|
private readonly IEnumerable<IExtensionLoader> _loaders;
|
||||||
private readonly IAssemblyLoader _assemblyLoader;
|
private readonly IAssemblyLoader _assemblyLoader;
|
||||||
|
|
||||||
public DefaultRazorCompilationEvents(IDependenciesFolder dependenciesFolder, IBuildManager buildManager, IEnumerable<IExtensionLoader> loaders, IAssemblyLoader assemblyLoader) {
|
public DefaultRazorCompilationEvents(
|
||||||
|
IDependenciesFolder dependenciesFolder,
|
||||||
|
IBuildManager buildManager,
|
||||||
|
IEnumerable<IExtensionLoader> loaders,
|
||||||
|
IAssemblyLoader assemblyLoader) {
|
||||||
|
|
||||||
_dependenciesFolder = dependenciesFolder;
|
_dependenciesFolder = dependenciesFolder;
|
||||||
_buildManager = buildManager;
|
_buildManager = buildManager;
|
||||||
_loaders = loaders;
|
_loaders = loaders;
|
||||||
@@ -35,8 +43,25 @@ namespace Orchard.Mvc.ViewEngines.Razor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void CodeGenerationStarted(RazorBuildProvider provider) {
|
public void CodeGenerationStarted(RazorBuildProvider provider) {
|
||||||
var descriptors = _dependenciesFolder.LoadDescriptors();
|
DependencyDescriptor dependencyDescriptor = GetDependencyDescriptor(provider.VirtualPath);
|
||||||
var entries = descriptors
|
|
||||||
|
IEnumerable<DependencyDescriptor> dependencyDescriptors = _dependenciesFolder.LoadDescriptors();
|
||||||
|
List<DependencyDescriptor> filteredDependencyDescriptors = new List<DependencyDescriptor>();
|
||||||
|
if (dependencyDescriptor != null) {
|
||||||
|
// Add module
|
||||||
|
filteredDependencyDescriptors.Add(dependencyDescriptor);
|
||||||
|
|
||||||
|
// Add module's references
|
||||||
|
filteredDependencyDescriptors.AddRange(dependencyDescriptor.References
|
||||||
|
.SelectMany(reference => dependencyDescriptors
|
||||||
|
.Where(dependency => dependency.Name == reference.Name)));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Fall back that shouldn't usually be called
|
||||||
|
filteredDependencyDescriptors = dependencyDescriptors.ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
var entries = filteredDependencyDescriptors
|
||||||
.SelectMany(descriptor => _loaders
|
.SelectMany(descriptor => _loaders
|
||||||
.Where(loader => descriptor.LoaderName == loader.Name)
|
.Where(loader => descriptor.LoaderName == loader.Name)
|
||||||
.Select(loader => new {
|
.Select(loader => new {
|
||||||
@@ -70,6 +95,33 @@ namespace Orchard.Mvc.ViewEngines.Razor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private DependencyDescriptor GetDependencyDescriptor(string virtualPath) {
|
||||||
|
var appRelativePath = VirtualPathUtility.ToAppRelative(virtualPath);
|
||||||
|
var prefix = PrefixMatch(appRelativePath, new [] { "~/Modules/", "~/Themes/", "~/Core/"});
|
||||||
|
if (prefix == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
var moduleName = ModuleMatch(appRelativePath, prefix);
|
||||||
|
if (moduleName == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return _dependenciesFolder.GetDescriptor(moduleName);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string ModuleMatch(string virtualPath, string prefix) {
|
||||||
|
var index = virtualPath.IndexOf('/', prefix.Length, virtualPath.Length - prefix.Length);
|
||||||
|
if (index < 0)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
var moduleName = virtualPath.Substring(prefix.Length, index - prefix.Length);
|
||||||
|
return (string.IsNullOrEmpty(moduleName) ? null : moduleName);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string PrefixMatch(string virtualPath, params string[] prefixes) {
|
||||||
|
return prefixes
|
||||||
|
.FirstOrDefault(p => virtualPath.StartsWith(p, StringComparison.OrdinalIgnoreCase));
|
||||||
|
}
|
||||||
|
|
||||||
public void CodeGenerationCompleted(RazorBuildProvider provider, CodeGenerationCompleteEventArgs e) {
|
public void CodeGenerationCompleted(RazorBuildProvider provider, CodeGenerationCompleteEventArgs e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user