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>
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user