From ebc99010e49db9620c644dfe645b58c1756faafb Mon Sep 17 00:00:00 2001 From: Renaud Paquay Date: Sun, 21 Nov 2010 19:02:36 -0800 Subject: [PATCH] Refactor Razor compilation events customization --HG-- branch : dev --- src/Orchard/Environment/OrchardStarter.cs | 2 + .../Razor/IRazorCompilationEvents.cs | 63 +++++++++++++++++ .../Razor/RazorCompilationEventsShim.cs | 68 +++---------------- src/Orchard/Orchard.Framework.csproj | 1 + 4 files changed, 77 insertions(+), 57 deletions(-) create mode 100644 src/Orchard/Mvc/ViewEngines/Razor/IRazorCompilationEvents.cs diff --git a/src/Orchard/Environment/OrchardStarter.cs b/src/Orchard/Environment/OrchardStarter.cs index ebb44bead..96c708ed2 100644 --- a/src/Orchard/Environment/OrchardStarter.cs +++ b/src/Orchard/Environment/OrchardStarter.cs @@ -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().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); + builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); diff --git a/src/Orchard/Mvc/ViewEngines/Razor/IRazorCompilationEvents.cs b/src/Orchard/Mvc/ViewEngines/Razor/IRazorCompilationEvents.cs new file mode 100644 index 000000000..e7371a813 --- /dev/null +++ b/src/Orchard/Mvc/ViewEngines/Razor/IRazorCompilationEvents.cs @@ -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 _loaders; + private readonly IAssemblyLoader _assemblyLoader; + + public DefaultRazorCompilationEvents(IDependenciesFolder dependenciesFolder, IBuildManager buildManager, IEnumerable 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) { + } + } +} \ No newline at end of file diff --git a/src/Orchard/Mvc/ViewEngines/Razor/RazorCompilationEventsShim.cs b/src/Orchard/Mvc/ViewEngines/Razor/RazorCompilationEventsShim.cs index a3dda9f36..048fd8701 100644 --- a/src/Orchard/Mvc/ViewEngines/Razor/RazorCompilationEventsShim.cs +++ b/src/Orchard/Mvc/ViewEngines/Razor/RazorCompilationEventsShim.cs @@ -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().CodeGenerationStarted(provider); } - - public IOrchardHostContainer HostContainer { - get { return _hostContainer; } - set { - _hostContainer = value; - BuildManager = _hostContainer.Resolve(); - AssemblyLoader = _hostContainer.Resolve(); - DependenciesFolder = _hostContainer.Resolve(); - Loaders = _hostContainer.Resolve>(); - } + private void RazorBuildProviderCodeGenerationCompleted(object sender, CodeGenerationCompleteEventArgs e) { + var provider = (RazorBuildProvider)sender; + HostContainer.Resolve().CodeGenerationCompleted(provider, e); } - public IBuildManager BuildManager { get; set; } - public IAssemblyLoader AssemblyLoader { get; set; } - public IDependenciesFolder DependenciesFolder { get; set; } - public IEnumerable Loaders { get; set; } - - - public static void EnsureInitialized() { var uninitialized = Interlocked.CompareExchange(ref _initialized, 1, 0) == 0; if (uninitialized) - _instance = new RazorCompilationEventsShim(); + new RazorCompilationEventsShim(); } } } diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj index e60532026..f5635612a 100644 --- a/src/Orchard/Orchard.Framework.csproj +++ b/src/Orchard/Orchard.Framework.csproj @@ -163,6 +163,7 @@ +