ModelsBuilder enabled flag not respected

When MB is disabled we were still rebuilding all of nucache models when schema changes are made which is a requirement of PureLive models but if MB is disabled then PureLive models don't matter. This was causing unnecessary performance and db overhead when modifying document types when mb is disabled.
This commit is contained in:
Shannon
2020-04-20 22:25:05 +10:00
parent 75655fd1ee
commit d9cb9f27f1
3 changed files with 30 additions and 9 deletions

View File

@@ -1,5 +1,16 @@
namespace Umbraco.Core.Models.PublishedContent
{
/// <summary>
/// Provides a live published model creation service.
/// </summary>
public interface ILivePublishedModelFactory2 : ILivePublishedModelFactory
{
/// <summary>
/// Tells the factory that it should build a new generation of models
/// </summary>
void Reset();
}
/// <summary>
/// Provides a live published model creation service.
/// </summary>

View File

@@ -50,14 +50,17 @@ namespace Umbraco.Core
{
lock (liveFactory.SyncRoot)
{
// TODO: Fix this in 8.3! - We need to change the ILivePublishedModelFactory interface to have a Reset method and then when we have an embedded MB
// version we will publicize the ResetModels (and change the name to Reset).
// For now, this will suffice and we'll use reflection, there should be no other implementation of ILivePublishedModelFactory.
// Calling ResetModels resets the MB flag so that the next time EnsureModels is called (which is called when nucache lazily calls CreateModel) it will
// trigger the recompiling of pure live models.
var resetMethod = liveFactory.GetType().GetMethod("ResetModels", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
if (resetMethod != null)
resetMethod.Invoke(liveFactory, null);
if (liveFactory is ILivePublishedModelFactory2 liveFactory2)
{
liveFactory2.Reset();
}
else
{
// This is purely here for backwards compat and to avoid breaking changes but this code will probably never get executed
var resetMethod = liveFactory.GetType().GetMethod("ResetModels", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
if (resetMethod != null)
resetMethod.Invoke(liveFactory, null);
}
action();
}

View File

@@ -21,7 +21,7 @@ using File = System.IO.File;
namespace Umbraco.ModelsBuilder.Embedded
{
internal class PureLiveModelFactory : ILivePublishedModelFactory, IRegisteredObject
internal class PureLiveModelFactory : ILivePublishedModelFactory2, IRegisteredObject
{
private Assembly _modelsAssembly;
private Infos _infos = new Infos { ModelInfos = null, ModelTypeMap = new Dictionary<string, Type>() };
@@ -134,6 +134,13 @@ namespace Umbraco.ModelsBuilder.Embedded
return ctor();
}
/// <inheritdoc />
public void Reset()
{
if (_config.Enable)
ResetModels();
}
#endregion
#region Compilation