Files
Umbraco-CMS/src/Umbraco.Web.Common/ModelsBuilder/InMemoryAuto/RuntimeCompilationCacheBuster.cs
Mole 94774113f6 V11: Fix InMemoryAuto modelsbuilder mode (#13107)
* 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>
2022-10-07 10:42:32 +02:00

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);
}
}