Refactor Razor compilation events customization

--HG--
branch : dev
This commit is contained in:
Renaud Paquay
2010-11-21 19:02:36 -08:00
parent fd09536584
commit ebc99010e4
4 changed files with 77 additions and 57 deletions

View File

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

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

View File

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

View File

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