File: RuntimeViewCompilerProvider.cs
Web Access
Project: src\src\Mvc\Mvc.Razor.RuntimeCompilation\src\Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.csproj (Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Microsoft.AspNetCore.Mvc.ApplicationParts;
using Microsoft.AspNetCore.Mvc.Razor.Compilation;
using Microsoft.AspNetCore.Razor.Language;
using Microsoft.Extensions.Logging;
 
namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation;
 
internal sealed class RuntimeViewCompilerProvider : IViewCompilerProvider
{
    private readonly RazorProjectEngine _razorProjectEngine;
    private readonly ApplicationPartManager _applicationPartManager;
    private readonly CSharpCompiler _csharpCompiler;
    private readonly RuntimeCompilationFileProvider _fileProvider;
    private readonly ILogger<RuntimeViewCompiler> _logger;
    private readonly Func<IViewCompiler> _createCompiler;
 
    private object _initializeLock = new object();
    private bool _initialized;
    private IViewCompiler? _compiler;
 
    public RuntimeViewCompilerProvider(
        ApplicationPartManager applicationPartManager,
        RazorProjectEngine razorProjectEngine,
        RuntimeCompilationFileProvider fileProvider,
        CSharpCompiler csharpCompiler,
        ILoggerFactory loggerFactory)
    {
        _applicationPartManager = applicationPartManager;
        _razorProjectEngine = razorProjectEngine;
        _csharpCompiler = csharpCompiler;
        _fileProvider = fileProvider;
 
        _logger = loggerFactory.CreateLogger<RuntimeViewCompiler>();
        _createCompiler = CreateCompiler;
    }
 
    public IViewCompiler GetCompiler()
    {
        return LazyInitializer.EnsureInitialized(
            ref _compiler,
            ref _initialized,
            ref _initializeLock,
            _createCompiler)!;
    }
 
    private IViewCompiler CreateCompiler()
    {
        var feature = new ViewsFeature();
        _applicationPartManager.PopulateFeature(feature);
 
        return new RuntimeViewCompiler(
            _fileProvider.FileProvider,
            _razorProjectEngine,
            _csharpCompiler,
            feature.ViewDescriptors,
            _logger);
    }
}