* POC of a solution that works * Add razor reference manager * Ensure the compilation options are correct * Move InMemory classes to its own namespace These are all internal, so it should be fine. * Throw proper exceptions when compilation fails * Add CheckSumValidator * Clear the ViewCompiler cache when models changed This means we no longer need the RefreshingRazorViewEngine \o/ * Remove unused constructor injection * Make UmbracoAssemblyLoadContext non internal * Add WIP * Clear the RazorViewEngine cache when generating new models This uses reflection, which isn't super nice, however, the alternative is to clone'n'own the entire RazorViewEngine, which is arguably worse * Fix circular dependency * Remove ModelsChanged event This is no longer necessary * Fix precompiled views path We need to normalize these paths to ensure they matches with the keys in _precompiledViews * Clean * Fix content tests * Add logging * Update the comment in UmbracoBuilderDependencyInjectionExtensions to reflect changes * Remove RefreshingRazorViewEngine as its no longer needed * Remove unused ViewEngine hack from DI * Fix langversion This is required since dotnet 7 is still in preview * Add modelsbuilder tests * Add more tests * fixed comment Co-authored-by: Bjarke Berg <mail@bergmania.dk>
54 lines
1.6 KiB
C#
54 lines
1.6 KiB
C#
using Microsoft.AspNetCore.Mvc.Razor;
|
|
using Microsoft.AspNetCore.Mvc.Razor.Compilation;
|
|
using Umbraco.Cms.Core;
|
|
|
|
namespace Umbraco.Cms.Web.Common.ModelsBuilder.InMemoryAuto;
|
|
|
|
internal class RuntimeCompilationCacheBuster
|
|
{
|
|
private readonly IViewCompilerProvider _viewCompilerProvider;
|
|
private readonly IRazorViewEngine _razorViewEngine;
|
|
|
|
public RuntimeCompilationCacheBuster(
|
|
IViewCompilerProvider viewCompilerProvider,
|
|
IRazorViewEngine razorViewEngine)
|
|
{
|
|
_viewCompilerProvider = viewCompilerProvider;
|
|
_razorViewEngine = razorViewEngine;
|
|
}
|
|
|
|
private RazorViewEngine ViewEngine
|
|
{
|
|
get
|
|
{
|
|
if (_razorViewEngine is RazorViewEngine typedViewEngine)
|
|
{
|
|
return typedViewEngine;
|
|
}
|
|
|
|
throw new InvalidOperationException(
|
|
"Unable to resolve RazorViewEngine, this means we can't clear the cache and views won't render properly");
|
|
}
|
|
}
|
|
|
|
private CollectibleRuntimeViewCompiler ViewCompiler
|
|
{
|
|
get
|
|
{
|
|
if (_viewCompilerProvider.GetCompiler() is CollectibleRuntimeViewCompiler collectibleCompiler)
|
|
{
|
|
return collectibleCompiler;
|
|
}
|
|
|
|
throw new InvalidOperationException("Unable to resolve CollectibleRuntimeViewCompiler, and is unable to clear the cache");
|
|
}
|
|
}
|
|
|
|
public void BustCache()
|
|
{
|
|
ViewCompiler.ClearCache();
|
|
Action<RazorViewEngine>? clearCacheMethod = ReflectionUtilities.EmitMethod<Action<RazorViewEngine>>("ClearCache");
|
|
clearCacheMethod?.Invoke(ViewEngine);
|
|
}
|
|
}
|