From 9fe480f73524d6cd0024af679efff4adf8ae4080 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 19 Apr 2017 16:09:03 -0700 Subject: [PATCH] Add LazyReferenceMetadataFeature --- .../MvcRazorMvcCoreBuilderExtensions.cs | 9 ++---- .../Internal/LazyMetadataReferenceFeature.cs | 28 +++++++++++++++++++ .../Internal/RazorReferenceManager.cs | 9 +++--- 3 files changed, 36 insertions(+), 10 deletions(-) create mode 100644 src/Microsoft.AspNetCore.Mvc.Razor/Internal/LazyMetadataReferenceFeature.cs diff --git a/src/Microsoft.AspNetCore.Mvc.Razor/DependencyInjection/MvcRazorMvcCoreBuilderExtensions.cs b/src/Microsoft.AspNetCore.Mvc.Razor/DependencyInjection/MvcRazorMvcCoreBuilderExtensions.cs index c7875c3b22..27a255d387 100644 --- a/src/Microsoft.AspNetCore.Mvc.Razor/DependencyInjection/MvcRazorMvcCoreBuilderExtensions.cs +++ b/src/Microsoft.AspNetCore.Mvc.Razor/DependencyInjection/MvcRazorMvcCoreBuilderExtensions.cs @@ -155,13 +155,13 @@ namespace Microsoft.Extensions.DependencyInjection // creating the singleton RazorViewEngine instance. services.TryAddTransient(); - // // Razor compilation infrastructure // services.TryAddSingleton(); services.TryAddSingleton(); services.TryAddSingleton(); + services.TryAddSingleton(); services.TryAddSingleton(s => { @@ -171,11 +171,8 @@ namespace Microsoft.Extensions.DependencyInjection b.Features.Add(new Microsoft.CodeAnalysis.Razor.DefaultTagHelperFeature()); - var referenceManager = s.GetRequiredService(); - b.Features.Add(new Microsoft.CodeAnalysis.Razor.DefaultMetadataReferenceFeature() - { - References = referenceManager.CompilationReferences.ToArray(), - }); + var metadataReferenceFeature = s.GetRequiredService(); + b.Features.Add(metadataReferenceFeature); }); }); diff --git a/src/Microsoft.AspNetCore.Mvc.Razor/Internal/LazyMetadataReferenceFeature.cs b/src/Microsoft.AspNetCore.Mvc.Razor/Internal/LazyMetadataReferenceFeature.cs new file mode 100644 index 0000000000..c9c040a812 --- /dev/null +++ b/src/Microsoft.AspNetCore.Mvc.Razor/Internal/LazyMetadataReferenceFeature.cs @@ -0,0 +1,28 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using Microsoft.AspNetCore.Razor.Language; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.Razor; + +namespace Microsoft.AspNetCore.Mvc.Razor.Internal +{ + public class LazyMetadataReferenceFeature : IMetadataReferenceFeature + { + private readonly RazorReferenceManager _referenceManager; + + public LazyMetadataReferenceFeature(RazorReferenceManager referenceManager) + { + _referenceManager = referenceManager; + } + + /// + /// Invoking ensures that compilation + /// references are lazily evaluated. + /// + public IReadOnlyList References => _referenceManager.CompilationReferences; + + public RazorEngine Engine { get; set; } + } +} diff --git a/src/Microsoft.AspNetCore.Mvc.Razor/Internal/RazorReferenceManager.cs b/src/Microsoft.AspNetCore.Mvc.Razor/Internal/RazorReferenceManager.cs index 2e21de7705..4d5338ae5e 100644 --- a/src/Microsoft.AspNetCore.Mvc.Razor/Internal/RazorReferenceManager.cs +++ b/src/Microsoft.AspNetCore.Mvc.Razor/Internal/RazorReferenceManager.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; +using System.Linq; using System.Threading; using Microsoft.AspNetCore.Mvc.ApplicationParts; using Microsoft.AspNetCore.Mvc.Razor.Compilation; @@ -16,7 +17,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal private readonly IList _additionalMetadataReferences; private object _compilationReferencesLock = new object(); private bool _compilationReferencesInitialized; - private IList _compilationReferences; + private IReadOnlyList _compilationReferences; public RazorReferenceManager( ApplicationPartManager partManager, @@ -26,7 +27,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal _additionalMetadataReferences = optionsAccessor.Value.AdditionalCompilationReferences; } - public IList CompilationReferences + public IReadOnlyList CompilationReferences { get { @@ -38,7 +39,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal } } - private IList GetCompilationReferences() + private IReadOnlyList GetCompilationReferences() { var feature = new MetadataReferenceFeature(); _partManager.PopulateFeature(feature); @@ -46,7 +47,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal if (_additionalMetadataReferences.Count == 0) { - return applicationReferences; + return applicationReferences.ToArray(); } var compilationReferences = new List(applicationReferences.Count + _additionalMetadataReferences.Count);