Fixes up dictionary and language repositories to have underlying simple get repositories since they support getting by id, unique id and string variations but we want to have native repository enabled caching for these items so these get methods now use private repositories based on these keys. Adds more tests, removes N+1 queries for languages and dictionary items. Removes RuntimeCacheProvider, we only want one type of cache, this simplifies things a lot.

This commit is contained in:
Shannon
2015-01-13 13:25:36 +11:00
parent ef2c46b6ab
commit e3acdbe85b
76 changed files with 1264 additions and 778 deletions

View File

@@ -5,6 +5,7 @@ using Umbraco.Core.IO;
using Umbraco.Core.Logging;
using Umbraco.Core.Persistence.Caching;
using Umbraco.Core.Persistence.Repositories;
using Umbraco.Core.Persistence.SqlSyntax;
using Umbraco.Core.Persistence.UnitOfWork;
namespace Umbraco.Core.Persistence
@@ -14,62 +15,50 @@ namespace Umbraco.Core.Persistence
/// </summary>
public class RepositoryFactory
{
private readonly bool _disableAllCache;
private readonly ILogger _logger;
private readonly ISqlSyntaxProvider _sqlSyntax;
private readonly CacheHelper _cacheHelper;
private readonly IUmbracoSettingsSection _settings;
#region Ctors
public RepositoryFactory(CacheHelper cacheHelper, ILogger logger, IUmbracoSettingsSection settings)
public RepositoryFactory(CacheHelper cacheHelper, ILogger logger, ISqlSyntaxProvider sqlSyntax, IUmbracoSettingsSection settings)
{
if (cacheHelper == null) throw new ArgumentNullException("cacheHelper");
if (logger == null) throw new ArgumentNullException("logger");
if (sqlSyntax == null) throw new ArgumentNullException("sqlSyntax");
if (settings == null) throw new ArgumentNullException("settings");
_disableAllCache = false;
_cacheHelper = cacheHelper;
_logger = logger;
_sqlSyntax = sqlSyntax;
_settings = settings;
}
public RepositoryFactory(bool disableAllCache, ILogger logger, IUmbracoSettingsSection settings)
{
if (logger == null) throw new ArgumentNullException("logger");
if (settings == null) throw new ArgumentNullException("settings");
_disableAllCache = disableAllCache;
_logger = logger;
_settings = settings;
_cacheHelper = _disableAllCache ? CacheHelper.CreateDisabledCacheHelper() : ApplicationContext.Current.ApplicationCache;
}
[Obsolete("Use the ctor specifying all dependencies instead")]
public RepositoryFactory()
: this(false, LoggerResolver.Current.Logger, UmbracoConfig.For.UmbracoSettings())
: this(ApplicationContext.Current.ApplicationCache, LoggerResolver.Current.Logger, SqlSyntaxContext.SqlSyntaxProvider, UmbracoConfig.For.UmbracoSettings())
{
}
[Obsolete("Use the ctor specifying an ILogger instead")]
[Obsolete("Use the ctor specifying all dependencies instead")]
public RepositoryFactory(CacheHelper cacheHelper)
: this(false, LoggerResolver.Current.Logger, UmbracoConfig.For.UmbracoSettings())
: this(cacheHelper, LoggerResolver.Current.Logger, SqlSyntaxContext.SqlSyntaxProvider, UmbracoConfig.For.UmbracoSettings())
{
if (cacheHelper == null) throw new ArgumentNullException("cacheHelper");
_disableAllCache = false;
_cacheHelper = cacheHelper;
}
[Obsolete("Use the ctor specifying an ILogger instead")]
[Obsolete("Use the ctor specifying all dependencies instead, NOTE: disableAllCache has zero effect")]
public RepositoryFactory(bool disableAllCache, CacheHelper cacheHelper)
: this(disableAllCache, LoggerResolver.Current.Logger, UmbracoConfig.For.UmbracoSettings())
: this(cacheHelper, LoggerResolver.Current.Logger, SqlSyntaxContext.SqlSyntaxProvider, UmbracoConfig.For.UmbracoSettings())
{
if (cacheHelper == null) throw new ArgumentNullException("cacheHelper");
_cacheHelper = cacheHelper;
}
[Obsolete("Use the ctor specifying an ILogger instead")]
[Obsolete("Use the ctor specifying all dependencies instead")]
public RepositoryFactory(bool disableAllCache)
: this(disableAllCache, LoggerResolver.Current.Logger, UmbracoConfig.For.UmbracoSettings())
: this(disableAllCache ? CacheHelper.CreateDisabledCacheHelper() : ApplicationContext.Current.ApplicationCache, LoggerResolver.Current.Logger, SqlSyntaxContext.SqlSyntaxProvider, UmbracoConfig.For.UmbracoSettings())
{
}
@@ -79,14 +68,14 @@ namespace Umbraco.Core.Persistence
{
return new TagRepository(
uow,
_disableAllCache ? (IRepositoryCacheProvider)NullCacheProvider.Current : RuntimeCacheProvider.Current, _logger);
_cacheHelper, _logger);
}
public virtual IContentRepository CreateContentRepository(IDatabaseUnitOfWork uow)
{
return new ContentRepository(
uow,
_disableAllCache ? (IRepositoryCacheProvider)NullCacheProvider.Current : RuntimeCacheProvider.Current,
uow,
_cacheHelper,
_logger,
CreateContentTypeRepository(uow),
CreateTemplateRepository(uow),
@@ -98,7 +87,7 @@ namespace Umbraco.Core.Persistence
{
return new ContentTypeRepository(
uow,
_disableAllCache ? (IRepositoryCacheProvider)NullCacheProvider.Current : RuntimeCacheProvider.Current,
_cacheHelper,
_logger,
CreateTemplateRepository(uow));
}
@@ -107,7 +96,7 @@ namespace Umbraco.Core.Persistence
{
return new DataTypeDefinitionRepository(
uow,
_disableAllCache ? (IRepositoryCacheProvider)NullCacheProvider.Current : RuntimeCacheProvider.Current,
_cacheHelper,
_cacheHelper,
_logger,
CreateContentTypeRepository(uow));
@@ -117,8 +106,9 @@ namespace Umbraco.Core.Persistence
{
return new DictionaryRepository(
uow,
_disableAllCache ? (IRepositoryCacheProvider)NullCacheProvider.Current : RuntimeCacheProvider.Current,
_cacheHelper,
_logger,
_sqlSyntax,
CreateLanguageRepository(uow));
}
@@ -126,7 +116,7 @@ namespace Umbraco.Core.Persistence
{
return new LanguageRepository(
uow,
_disableAllCache ? (IRepositoryCacheProvider)NullCacheProvider.Current : RuntimeCacheProvider.Current,
_cacheHelper,
_logger);
}
@@ -134,7 +124,7 @@ namespace Umbraco.Core.Persistence
{
return new MediaRepository(
uow,
_disableAllCache ? (IRepositoryCacheProvider)NullCacheProvider.Current : RuntimeCacheProvider.Current,
_cacheHelper,
_logger,
CreateMediaTypeRepository(uow),
CreateTagRepository(uow)) { EnsureUniqueNaming = _settings.Content.EnsureUniqueNaming };
@@ -144,7 +134,7 @@ namespace Umbraco.Core.Persistence
{
return new MediaTypeRepository(
uow,
_disableAllCache ? (IRepositoryCacheProvider)NullCacheProvider.Current : RuntimeCacheProvider.Current,
_cacheHelper,
_logger);
}
@@ -152,7 +142,7 @@ namespace Umbraco.Core.Persistence
{
return new RelationRepository(
uow,
NullCacheProvider.Current,
CacheHelper.CreateDisabledCacheHelper(), //never cache
_logger,
CreateRelationTypeRepository(uow));
}
@@ -161,7 +151,7 @@ namespace Umbraco.Core.Persistence
{
return new RelationTypeRepository(
uow,
NullCacheProvider.Current,
CacheHelper.CreateDisabledCacheHelper(), //never cache
_logger);
}
@@ -188,7 +178,7 @@ namespace Umbraco.Core.Persistence
public virtual ITemplateRepository CreateTemplateRepository(IDatabaseUnitOfWork uow)
{
return new TemplateRepository(uow,
_disableAllCache ? (IRepositoryCacheProvider)NullCacheProvider.Current : RuntimeCacheProvider.Current,
_cacheHelper,
_logger,
new PhysicalFileSystem(SystemDirectories.Masterpages),
new PhysicalFileSystem(SystemDirectories.MvcViews),
@@ -199,7 +189,7 @@ namespace Umbraco.Core.Persistence
{
return new ServerRegistrationRepository(
uow,
NullCacheProvider.Current,
CacheHelper.CreateDisabledCacheHelper(), //never cache
_logger);
}
@@ -208,7 +198,7 @@ namespace Umbraco.Core.Persistence
return new UserTypeRepository(
uow,
//There's not many user types but we query on users all the time so the result needs to be cached
_disableAllCache ? (IRepositoryCacheProvider)NullCacheProvider.Current : RuntimeCacheProvider.Current,
_cacheHelper,
_logger);
}
@@ -217,7 +207,7 @@ namespace Umbraco.Core.Persistence
return new UserRepository(
uow,
//Need to cache users - we look up user information more than anything in the back office!
_disableAllCache ? (IRepositoryCacheProvider)NullCacheProvider.Current : RuntimeCacheProvider.Current,
_cacheHelper,
_logger,
CreateUserTypeRepository(uow),
_cacheHelper);
@@ -225,8 +215,8 @@ namespace Umbraco.Core.Persistence
internal virtual IMacroRepository CreateMacroRepository(IDatabaseUnitOfWork uow)
{
return new MacroRepository(uow,
_disableAllCache ? (IRepositoryCacheProvider)NullCacheProvider.Current : RuntimeCacheProvider.Current,
return new MacroRepository(uow,
_cacheHelper,
_logger);
}
@@ -234,7 +224,7 @@ namespace Umbraco.Core.Persistence
{
return new MemberRepository(
uow,
_disableAllCache ? (IRepositoryCacheProvider)NullCacheProvider.Current : RuntimeCacheProvider.Current,
_cacheHelper,
_logger,
CreateMemberTypeRepository(uow),
CreateMemberGroupRepository(uow),
@@ -243,15 +233,15 @@ namespace Umbraco.Core.Persistence
public virtual IMemberTypeRepository CreateMemberTypeRepository(IDatabaseUnitOfWork uow)
{
return new MemberTypeRepository(uow,
_disableAllCache ? (IRepositoryCacheProvider)NullCacheProvider.Current : RuntimeCacheProvider.Current,
return new MemberTypeRepository(uow,
_cacheHelper,
_logger);
}
public virtual IMemberGroupRepository CreateMemberGroupRepository(IDatabaseUnitOfWork uow)
{
return new MemberGroupRepository(uow,
_disableAllCache ? (IRepositoryCacheProvider)NullCacheProvider.Current : RuntimeCacheProvider.Current,
return new MemberGroupRepository(uow,
_cacheHelper,
_logger,
_cacheHelper);
}