mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-15 19:54:57 +08:00
Refactor Razor compilation events customization
--HG-- branch : dev
This commit is contained in:
@@ -22,6 +22,7 @@ using Orchard.FileSystems.VirtualPath;
|
||||
using Orchard.FileSystems.WebSite;
|
||||
using Orchard.Logging;
|
||||
using Orchard.Mvc;
|
||||
using Orchard.Mvc.ViewEngines.Razor;
|
||||
using Orchard.Mvc.ViewEngines.ThemeAwareness;
|
||||
using Orchard.Services;
|
||||
|
||||
@@ -43,6 +44,7 @@ namespace Orchard.Environment {
|
||||
builder.RegisterType<DynamicModuleVirtualPathProvider>().As<ICustomVirtualPathProvider>().SingleInstance();
|
||||
builder.RegisterType<AppDataFolderRoot>().As<IAppDataFolderRoot>().SingleInstance();
|
||||
builder.RegisterType<DefaultExtensionCompiler>().As<IExtensionCompiler>().SingleInstance();
|
||||
builder.RegisterType<DefaultRazorCompilationEvents>().As<IRazorCompilationEvents>().SingleInstance();
|
||||
builder.RegisterType<DefaultProjectFileParser>().As<IProjectFileParser>().SingleInstance();
|
||||
builder.RegisterType<DefaultAssemblyLoader>().As<IAssemblyLoader>().SingleInstance();
|
||||
builder.RegisterType<HttpContextAccessor>().As<IHttpContextAccessor>().SingleInstance();
|
||||
|
63
src/Orchard/Mvc/ViewEngines/Razor/IRazorCompilationEvents.cs
Normal file
63
src/Orchard/Mvc/ViewEngines/Razor/IRazorCompilationEvents.cs
Normal file
@@ -0,0 +1,63 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Web.Razor.Generator;
|
||||
using System.Web.WebPages.Razor;
|
||||
using Orchard.Environment;
|
||||
using Orchard.Environment.Extensions.Loaders;
|
||||
using Orchard.FileSystems.Dependencies;
|
||||
|
||||
namespace Orchard.Mvc.ViewEngines.Razor {
|
||||
public interface IRazorCompilationEvents {
|
||||
void CodeGenerationStarted(RazorBuildProvider provider);
|
||||
void CodeGenerationCompleted(RazorBuildProvider provider, CodeGenerationCompleteEventArgs e);
|
||||
}
|
||||
|
||||
public class DefaultRazorCompilationEvents : IRazorCompilationEvents {
|
||||
private readonly IDependenciesFolder _dependenciesFolder;
|
||||
private readonly IBuildManager _buildManager;
|
||||
private readonly IEnumerable<IExtensionLoader> _loaders;
|
||||
private readonly IAssemblyLoader _assemblyLoader;
|
||||
|
||||
public DefaultRazorCompilationEvents(IDependenciesFolder dependenciesFolder, IBuildManager buildManager, IEnumerable<IExtensionLoader> loaders, IAssemblyLoader assemblyLoader) {
|
||||
_dependenciesFolder = dependenciesFolder;
|
||||
_buildManager = buildManager;
|
||||
_loaders = loaders;
|
||||
_assemblyLoader = assemblyLoader;
|
||||
}
|
||||
|
||||
public void CodeGenerationStarted(RazorBuildProvider provider) {
|
||||
var descriptors = _dependenciesFolder.LoadDescriptors();
|
||||
var entries = descriptors
|
||||
.SelectMany(descriptor => _loaders
|
||||
.Where(loader => descriptor.LoaderName == loader.Name)
|
||||
.Select(loader => new {
|
||||
loader,
|
||||
descriptor,
|
||||
directive = loader.GetWebFormAssemblyDirective(descriptor),
|
||||
dependencies = loader.GetWebFormVirtualDependencies(descriptor)
|
||||
}));
|
||||
|
||||
foreach (var entry in entries) {
|
||||
if (entry.directive != null) {
|
||||
if (entry.directive.StartsWith("<%@ Assembly Name=\"")) {
|
||||
var assembly = _assemblyLoader.Load(entry.descriptor.Name);
|
||||
if (assembly != null)
|
||||
provider.AssemblyBuilder.AddAssemblyReference(assembly);
|
||||
}
|
||||
else if (entry.directive.StartsWith("<%@ Assembly Src=\"")) {
|
||||
// Returned assembly may be null if the .csproj file doesn't containt any .cs file, for example
|
||||
var assembly = _buildManager.GetCompiledAssembly(entry.descriptor.VirtualPath);
|
||||
if (assembly != null)
|
||||
provider.AssemblyBuilder.AddAssemblyReference(assembly);
|
||||
}
|
||||
}
|
||||
foreach (var virtualDependency in entry.dependencies) {
|
||||
provider.AddVirtualPathDependency(virtualDependency);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void CodeGenerationCompleted(RazorBuildProvider provider, CodeGenerationCompleteEventArgs e) {
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,81 +1,35 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Threading;
|
||||
using System.Web.Razor.Generator;
|
||||
using System.Web.WebPages.Razor;
|
||||
using Orchard.Environment;
|
||||
using Orchard.Environment.Extensions.Loaders;
|
||||
using Orchard.FileSystems.Dependencies;
|
||||
|
||||
namespace Orchard.Mvc.ViewEngines.Razor {
|
||||
public class RazorCompilationEventsShim : IShim {
|
||||
private static int _initialized;
|
||||
private IOrchardHostContainer _hostContainer;
|
||||
private static RazorCompilationEventsShim _instance;
|
||||
|
||||
private RazorCompilationEventsShim() {
|
||||
RazorBuildProvider.CodeGenerationStarted += new EventHandler(RazorBuildProvider_CodeGenerationStarted);
|
||||
OrchardHostContainerRegistry.RegisterShim(this);
|
||||
RazorBuildProvider.CodeGenerationStarted += RazorBuildProviderCodeGenerationStarted;
|
||||
RazorBuildProvider.CodeGenerationCompleted += RazorBuildProviderCodeGenerationCompleted;
|
||||
}
|
||||
|
||||
void RazorBuildProvider_CodeGenerationStarted(object sender, EventArgs e) {
|
||||
public IOrchardHostContainer HostContainer { get; set; }
|
||||
|
||||
private void RazorBuildProviderCodeGenerationStarted(object sender, EventArgs e) {
|
||||
var provider = (RazorBuildProvider)sender;
|
||||
|
||||
var descriptors = DependenciesFolder.LoadDescriptors();
|
||||
var entries = descriptors
|
||||
.SelectMany(descriptor => Loaders
|
||||
.Where(loader => descriptor.LoaderName == loader.Name)
|
||||
.Select(loader => new {
|
||||
loader,
|
||||
descriptor,
|
||||
directive = loader.GetWebFormAssemblyDirective(descriptor),
|
||||
dependencies = loader.GetWebFormVirtualDependencies(descriptor)
|
||||
}));
|
||||
|
||||
foreach (var entry in entries) {
|
||||
if (entry.directive != null) {
|
||||
if (entry.directive.StartsWith("<%@ Assembly Name=\"")) {
|
||||
var assembly = AssemblyLoader.Load(entry.descriptor.Name);
|
||||
if (assembly != null)
|
||||
provider.AssemblyBuilder.AddAssemblyReference(assembly);
|
||||
}
|
||||
else if (entry.directive.StartsWith("<%@ Assembly Src=\"")) {
|
||||
// Returned assembly may be null if the .csproj file doesn't containt any .cs file, for example
|
||||
var assembly = BuildManager.GetCompiledAssembly(entry.descriptor.VirtualPath);
|
||||
if (assembly != null)
|
||||
provider.AssemblyBuilder.AddAssemblyReference(assembly);
|
||||
}
|
||||
}
|
||||
foreach (var virtualDependency in entry.dependencies) {
|
||||
provider.AddVirtualPathDependency(virtualDependency);
|
||||
}
|
||||
}
|
||||
HostContainer.Resolve<IRazorCompilationEvents>().CodeGenerationStarted(provider);
|
||||
}
|
||||
|
||||
|
||||
public IOrchardHostContainer HostContainer {
|
||||
get { return _hostContainer; }
|
||||
set {
|
||||
_hostContainer = value;
|
||||
BuildManager = _hostContainer.Resolve<IBuildManager>();
|
||||
AssemblyLoader = _hostContainer.Resolve<IAssemblyLoader>();
|
||||
DependenciesFolder = _hostContainer.Resolve<IDependenciesFolder>();
|
||||
Loaders = _hostContainer.Resolve<IEnumerable<IExtensionLoader>>();
|
||||
}
|
||||
private void RazorBuildProviderCodeGenerationCompleted(object sender, CodeGenerationCompleteEventArgs e) {
|
||||
var provider = (RazorBuildProvider)sender;
|
||||
HostContainer.Resolve<IRazorCompilationEvents>().CodeGenerationCompleted(provider, e);
|
||||
}
|
||||
|
||||
public IBuildManager BuildManager { get; set; }
|
||||
public IAssemblyLoader AssemblyLoader { get; set; }
|
||||
public IDependenciesFolder DependenciesFolder { get; set; }
|
||||
public IEnumerable<IExtensionLoader> Loaders { get; set; }
|
||||
|
||||
|
||||
|
||||
public static void EnsureInitialized() {
|
||||
var uninitialized = Interlocked.CompareExchange(ref _initialized, 1, 0) == 0;
|
||||
if (uninitialized)
|
||||
_instance = new RazorCompilationEventsShim();
|
||||
new RazorCompilationEventsShim();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -163,6 +163,7 @@
|
||||
<Compile Include="Messaging\Services\DefaultMessageManager.cs" />
|
||||
<Compile Include="Mvc\IOrchardViewPage.cs" />
|
||||
<Compile Include="Mvc\Spooling\HtmlStringWriter.cs" />
|
||||
<Compile Include="Mvc\ViewEngines\Razor\IRazorCompilationEvents.cs" />
|
||||
<Compile Include="Security\CurrentUserWorkContext.cs" />
|
||||
<Compile Include="Settings\CurrentSiteWorkContext.cs" />
|
||||
<Compile Include="Settings\ResourceDebugMode.cs" />
|
||||
|
Reference in New Issue
Block a user