diff --git a/WebFx.sln b/WebFx.sln index 62d11a2cc1..763d8c69c4 100644 --- a/WebFx.sln +++ b/WebFx.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 -VisualStudioVersion = 12.0.21005.1 +VisualStudioVersion = 12.0.30110.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{DAAE4C74-D06F-4874-A166-33305D2643CE}" EndProject @@ -23,6 +23,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MvcSample.net45", "samples\ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MvcSample.k10", "samples\MvcSample\MvcSample.k10.csproj", "{A7D7CD66-A407-4144-8AB7-07F895F87137}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Mvc.Razor.Host.net45", "src\Microsoft.AspNet.Mvc.Razor.Host\Microsoft.AspNet.Mvc.Razor.Host.net45.csproj", "{A25566C9-97C7-4770-BBC1-9B815D3B1380}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Mvc.Razor.Host.k10", "src\Microsoft.AspNet.Mvc.Razor.Host\Microsoft.AspNet.Mvc.Razor.Host.k10.csproj", "{613579ED-7B96-4F5C-8DBF-D2C580257BE2}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -61,18 +65,28 @@ Global {A7D7CD66-A407-4144-8AB7-07F895F87137}.Debug|Any CPU.Build.0 = Debug|Any CPU {A7D7CD66-A407-4144-8AB7-07F895F87137}.Release|Any CPU.ActiveCfg = Release|Any CPU {A7D7CD66-A407-4144-8AB7-07F895F87137}.Release|Any CPU.Build.0 = Release|Any CPU + {A25566C9-97C7-4770-BBC1-9B815D3B1380}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A25566C9-97C7-4770-BBC1-9B815D3B1380}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A25566C9-97C7-4770-BBC1-9B815D3B1380}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A25566C9-97C7-4770-BBC1-9B815D3B1380}.Release|Any CPU.Build.0 = Release|Any CPU + {613579ED-7B96-4F5C-8DBF-D2C580257BE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {613579ED-7B96-4F5C-8DBF-D2C580257BE2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {613579ED-7B96-4F5C-8DBF-D2C580257BE2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {613579ED-7B96-4F5C-8DBF-D2C580257BE2}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution + {501817DD-8143-4A50-888D-99896A82CD12} = {DAAE4C74-D06F-4874-A166-33305D2643CE} + {A7D7CD66-A407-4144-8AB7-07F895F87137} = {DAAE4C74-D06F-4874-A166-33305D2643CE} {64BD92BA-F313-496C-ACE6-B9C4C10C420E} = {32285FA4-6B46-4D6B-A840-2B13E4C8B58E} {BA88E212-5889-48DC-823F-A3A67DDEF123} = {32285FA4-6B46-4D6B-A840-2B13E4C8B58E} {28AA31B2-6504-432D-8599-1501FE0B100A} = {32285FA4-6B46-4D6B-A840-2B13E4C8B58E} {24947215-86AB-4DD0-B94E-88B1EC4DC877} = {32285FA4-6B46-4D6B-A840-2B13E4C8B58E} {365CA5C6-037D-4E6E-AF05-F5FA42E024EB} = {32285FA4-6B46-4D6B-A840-2B13E4C8B58E} {0D2C8C3D-AFC3-4E1F-A6D8-9F690EE5E063} = {32285FA4-6B46-4D6B-A840-2B13E4C8B58E} - {501817DD-8143-4A50-888D-99896A82CD12} = {DAAE4C74-D06F-4874-A166-33305D2643CE} - {A7D7CD66-A407-4144-8AB7-07F895F87137} = {DAAE4C74-D06F-4874-A166-33305D2643CE} + {A25566C9-97C7-4770-BBC1-9B815D3B1380} = {32285FA4-6B46-4D6B-A840-2B13E4C8B58E} + {613579ED-7B96-4F5C-8DBF-D2C580257BE2} = {32285FA4-6B46-4D6B-A840-2B13E4C8B58E} EndGlobalSection EndGlobal diff --git a/samples/MvcSample/Startup.cs b/samples/MvcSample/Startup.cs index 0180efbb3f..3d3c67d167 100644 --- a/samples/MvcSample/Startup.cs +++ b/samples/MvcSample/Startup.cs @@ -22,9 +22,11 @@ namespace MvcSample string appRoot = AppDomain.CurrentDomain.SetupInformation.ApplicationBase; - var fileSystem = new PhysicalFileSystem(appRoot); - serviceProvider.AddInstance(new VirtualFileSystem(fileSystem)); - serviceProvider.AddInstance(new RazorCompilationService(new CscBasedCompilationService())); + serviceProvider.AddInstance(new PhysicalFileSystem(appRoot)); + serviceProvider.Add(); + serviceProvider.Add(); + serviceProvider.Add(); + serviceProvider.Add(); serviceProvider.Add(); serviceProvider.Add(); diff --git a/samples/MvcSample/project.json b/samples/MvcSample/project.json index 1e2a0fef96..fb7b9d8012 100644 --- a/samples/MvcSample/project.json +++ b/samples/MvcSample/project.json @@ -4,8 +4,10 @@ "Microsoft.AspNet.FileSystems": "0.1-alpha-*", "Microsoft.AspNet.Abstractions": "0.1-alpha-*", "Microsoft.AspNet.DependencyInjection" : "0.1-alpha-*", + "Microsoft.AspNet.Razor" : "0.1-alpha-*", "Microsoft.AspNet.Mvc" : "", - "Microsoft.AspNet.Mvc.Razor" : "" + "Microsoft.AspNet.Mvc.Razor" : "", + "Microsoft.AspNet.Mvc.Razor.Host" : "" }, "configurations": { "net45": { diff --git a/src/Microsoft.AspNet.Mvc.Razor.Host/IMvcRazorHost.cs b/src/Microsoft.AspNet.Mvc.Razor.Host/IMvcRazorHost.cs new file mode 100644 index 0000000000..cec090fdc0 --- /dev/null +++ b/src/Microsoft.AspNet.Mvc.Razor.Host/IMvcRazorHost.cs @@ -0,0 +1,10 @@ +using System.IO; +using Microsoft.AspNet.Razor; + +namespace Microsoft.AspNet.Mvc.Razor +{ + public interface IMvcRazorHost + { + GeneratorResults GenerateCode(string rootRelativePath, Stream inputStream); + } +} diff --git a/src/Microsoft.AspNet.Mvc.Razor.Host/MvcRazorHost.cs b/src/Microsoft.AspNet.Mvc.Razor.Host/MvcRazorHost.cs new file mode 100644 index 0000000000..e450cb64cf --- /dev/null +++ b/src/Microsoft.AspNet.Mvc.Razor.Host/MvcRazorHost.cs @@ -0,0 +1,87 @@ +using System; +using System.IO; +using System.Text; +using Microsoft.AspNet.Razor; +using Microsoft.AspNet.Razor.Generator; + +namespace Microsoft.AspNet.Mvc.Razor +{ + public class MvcRazorHost : RazorEngineHost, IMvcRazorHost + { + private static readonly string[] _defaultNamespaces = new[] + { + "System", + "System.Linq", + "System.Collections.Generic", + "Microsoft.AspNet.Mvc", + "Microsoft.AspNet.Mvc.Razor" + }; + + public MvcRazorHost(Type baseType) + : this(baseType.FullName) + { + + } + + public MvcRazorHost(string baseType) + : base(new CSharpRazorCodeLanguage()) + { + DefaultBaseClass = baseType; + GeneratedClassContext = new GeneratedClassContext( + executeMethodName: "Execute", + writeMethodName: "Write", + writeLiteralMethodName: "WriteLiteral", + writeToMethodName: "WriteTo", + writeLiteralToMethodName: "WriteLiteralTo", + templateTypeName: "Template", + defineSectionMethodName: "DefineSection") + { + ResolveUrlMethodName = "Href" + }; + + foreach (var ns in _defaultNamespaces) + { + NamespaceImports.Add(ns); + } + } + + public GeneratorResults GenerateCode(string rootRelativePath, Stream inputStream) + { + string className = Path.GetFileNameWithoutExtension(rootRelativePath); + if (rootRelativePath.StartsWith("~/", StringComparison.Ordinal)) + { + rootRelativePath = rootRelativePath.Substring(2); + } + string classNamespace = GenerateNamespace(rootRelativePath); + + using (var reader = new StreamReader(inputStream)) + { + var engine = new RazorTemplateEngine(this); + return engine.GenerateCode(reader, className, classNamespace, rootRelativePath); + } + } + + private static string GenerateNamespace(string rootRelativePath) + { + var namespaceBuilder = new StringBuilder(rootRelativePath.Length); + rootRelativePath = Path.GetDirectoryName(rootRelativePath); + for (int i = 0; i < rootRelativePath.Length; i++) + { + char c = rootRelativePath[i]; + if (c == Path.DirectorySeparatorChar) + { + namespaceBuilder.Append('.'); + } + else if (!Char.IsLetterOrDigit(c)) + { + namespaceBuilder.Append('_'); + } + else + { + namespaceBuilder.Append(c); + } + } + return namespaceBuilder.ToString(); + } + } +} diff --git a/src/Microsoft.AspNet.Mvc.Razor.Host/project.json b/src/Microsoft.AspNet.Mvc.Razor.Host/project.json new file mode 100644 index 0000000000..73add5adf0 --- /dev/null +++ b/src/Microsoft.AspNet.Mvc.Razor.Host/project.json @@ -0,0 +1,10 @@ +{ + "version" : "0.1-alpha-*", + "dependencies": { + "Microsoft.AspNet.Razor": "0.1-alpha-*" + }, + "configurations": { + "net45": {}, + "k10" : {} + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Mvc.Razor/Razor/MvcRazorHost.cs b/src/Microsoft.AspNet.Mvc.Razor/Razor/MvcRazorHost.cs deleted file mode 100644 index a35a85a689..0000000000 --- a/src/Microsoft.AspNet.Mvc.Razor/Razor/MvcRazorHost.cs +++ /dev/null @@ -1,40 +0,0 @@ -using Microsoft.AspNet.Razor; -using Microsoft.AspNet.Razor.Generator; -using Microsoft.AspNet.Razor.Parser; - -namespace Microsoft.AspNet.Mvc.Razor -{ - public class MvcRazorHost : RazorEngineHost - { - private static readonly string[] _namespaces = new[] - { - "System", - "System.Linq", - "System.Collections.Generic", - "Microsoft.AspNet.Mvc", - "Microsoft.AspNet.Mvc.Razor" - }; - - public MvcRazorHost() - : base(new CSharpRazorCodeLanguage()) - { - DefaultBaseClass = typeof(RazorView).FullName; - GeneratedClassContext = new GeneratedClassContext( - executeMethodName: "Execute", - writeMethodName: "Write", - writeLiteralMethodName: "WriteLiteral", - writeToMethodName: "WriteTo", - writeLiteralToMethodName: "WriteLiteralTo", - templateTypeName: "Template", - defineSectionMethodName: "DefineSection") - { - ResolveUrlMethodName = "Href" - }; - - foreach (var ns in _namespaces) - { - NamespaceImports.Add(ns); - } - } - } -} diff --git a/src/Microsoft.AspNet.Mvc.Razor/Razor/RazorCompilationService.cs b/src/Microsoft.AspNet.Mvc.Razor/Razor/RazorCompilationService.cs index 19bc590047..932e20933e 100644 --- a/src/Microsoft.AspNet.Mvc.Razor/Razor/RazorCompilationService.cs +++ b/src/Microsoft.AspNet.Mvc.Razor/Razor/RazorCompilationService.cs @@ -12,10 +12,12 @@ namespace Microsoft.AspNet.Mvc.Razor { private static readonly CompilerCache _cache = new CompilerCache(); private readonly ICompilationService _baseCompilationService; + private readonly IMvcRazorHost _razorHost; - public RazorCompilationService(ICompilationService compilationService) + public RazorCompilationService(ICompilationService compilationService, IMvcRazorHost razorHost) { _baseCompilationService = compilationService; + _razorHost = razorHost; } public Task Compile(IFileInfo file) @@ -25,15 +27,10 @@ namespace Microsoft.AspNet.Mvc.Razor private async Task CompileCore(IFileInfo file) { - var host = new MvcRazorHost(); - var engine = new RazorTemplateEngine(host); - - var namespaceBuilder = GenerateNamespace(file); - GeneratorResults results; - using (TextReader rdr = new StreamReader(file.CreateReadStream())) + using (Stream inputStream = file.CreateReadStream()) { - results = engine.GenerateCode(rdr, '_' + file.Name, namespaceBuilder.ToString(), file.PhysicalPath ?? file.Name); + results = _razorHost.GenerateCode(file.PhysicalPath, inputStream); } if (!results.Success) diff --git a/src/Microsoft.AspNet.Mvc.Razor/project.json b/src/Microsoft.AspNet.Mvc.Razor/project.json index ee58029dbd..ab7dd92e67 100644 --- a/src/Microsoft.AspNet.Mvc.Razor/project.json +++ b/src/Microsoft.AspNet.Mvc.Razor/project.json @@ -6,10 +6,11 @@ "Microsoft.AspNet.DependencyInjection": "0.1-alpha-*", "Microsoft.AspNet.Razor": "0.1-alpha-*", "Microsoft.AspNet.Mvc" : "", - "Microsoft.AspNet.Mvc.Forms" : "" + "Microsoft.AspNet.Mvc.Forms" : "", + "Microsoft.AspNet.Mvc.Razor.Host" : "" }, "configurations": { "net45": {}, - "k10" : { } + "k10" : {} } } \ No newline at end of file