diff --git a/src/Umbraco.Core/Cache/CacheHelper.cs b/src/Umbraco.Core/Cache/CacheHelper.cs index a85285e427..5480e199f5 100644 --- a/src/Umbraco.Core/Cache/CacheHelper.cs +++ b/src/Umbraco.Core/Cache/CacheHelper.cs @@ -7,7 +7,7 @@ using System.Web.Caching; namespace Umbraco.Core.Cache { /// - /// Class that is exposed by the ApplicationContext for application wide caching purposes + /// Represents the application-wide caches. /// public class CacheHelper { @@ -25,7 +25,7 @@ namespace Umbraco.Core.Cache // do *not* return NoCache // NoCache is a special instance that is detected by RepositoryBase and disables all cache policies // CreateDisabledCacheHelper is used in tests to use no cache, *but* keep all cache policies - return new CacheHelper(NullCacheProvider.Instance, NullCacheProvider.Instance, NullCacheProvider.Instance, new IsolatedRuntimeCache(_ => NullCacheProvider.Instance)); + return new DisabledCacheHelper(); } /// @@ -43,7 +43,6 @@ namespace Umbraco.Core.Cache /// /// Initializes a new instance for use in the web /// - /// public CacheHelper(System.Web.Caching.Cache cache) : this( new HttpRuntimeCacheProvider(cache), @@ -53,37 +52,19 @@ namespace Umbraco.Core.Cache { } - [Obsolete("Use the constructor the specifies all dependencies")] - [EditorBrowsable(EditorBrowsableState.Never)] - public CacheHelper( - IRuntimeCacheProvider httpCacheProvider, - ICacheProvider staticCacheProvider, - ICacheProvider requestCacheProvider) - : this(httpCacheProvider, staticCacheProvider, requestCacheProvider, new IsolatedRuntimeCache(t => new ObjectCacheRuntimeCacheProvider())) - { - } - /// /// Initializes a new instance based on the provided providers /// - /// - /// - /// - /// public CacheHelper( IRuntimeCacheProvider httpCacheProvider, ICacheProvider staticCacheProvider, ICacheProvider requestCacheProvider, IsolatedRuntimeCache isolatedCacheManager) { - if (httpCacheProvider == null) throw new ArgumentNullException("httpCacheProvider"); - if (staticCacheProvider == null) throw new ArgumentNullException("staticCacheProvider"); - if (requestCacheProvider == null) throw new ArgumentNullException("requestCacheProvider"); - if (isolatedCacheManager == null) throw new ArgumentNullException("isolatedCacheManager"); - RuntimeCache = httpCacheProvider; - StaticCache = staticCacheProvider; - RequestCache = requestCacheProvider; - IsolatedRuntimeCache = isolatedCacheManager; + RuntimeCache = httpCacheProvider ?? throw new ArgumentNullException(nameof(httpCacheProvider)); + StaticCache = staticCacheProvider ?? throw new ArgumentNullException(nameof(staticCacheProvider)); + RequestCache = requestCacheProvider ?? throw new ArgumentNullException(nameof(requestCacheProvider)); + IsolatedRuntimeCache = isolatedCacheManager ?? throw new ArgumentNullException(nameof(isolatedCacheManager)); } /// diff --git a/src/Umbraco.Core/Cache/DisabledCacheHelper.cs b/src/Umbraco.Core/Cache/DisabledCacheHelper.cs new file mode 100644 index 0000000000..104c6b8bc0 --- /dev/null +++ b/src/Umbraco.Core/Cache/DisabledCacheHelper.cs @@ -0,0 +1,15 @@ +namespace Umbraco.Core.Cache +{ + /// + /// Represent disabled application-wide caches. + /// + public class DisabledCacheHelper : CacheHelper + { + /// + /// Initializes a new instance of the . + /// + public DisabledCacheHelper() + : base(NullCacheProvider.Instance, NullCacheProvider.Instance, NullCacheProvider.Instance, new IsolatedRuntimeCache(_ => NullCacheProvider.Instance)) + { } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Composing/CompositionRoots/RepositoryCompositionRoot.cs b/src/Umbraco.Core/Composing/CompositionRoots/RepositoryCompositionRoot.cs index 42693f119d..fb90707fee 100644 --- a/src/Umbraco.Core/Composing/CompositionRoots/RepositoryCompositionRoot.cs +++ b/src/Umbraco.Core/Composing/CompositionRoots/RepositoryCompositionRoot.cs @@ -21,9 +21,8 @@ namespace Umbraco.Core.Composing.CompositionRoots { // register cache helpers // the main cache helper is registered by CoreBootManager and is used by most repositories - // the disabled one is used by those repositories that have an annotated ctor parameter - // fixme refactor: use a DisabledCacheHelper class (or interface?) so that injection does not depend on name and we can have simple ctor injection - container.RegisterSingleton(factory => CacheHelper.CreateDisabledCacheHelper(), DisabledCache); + // the disabled one is used by those repositories that require it + container.RegisterSingleton(); // resolve ctor dependency from GetInstance() runtimeArguments, if possible - 'factory' is // the container, 'info' describes the ctor argument, and 'args' contains the args that @@ -41,7 +40,7 @@ namespace Umbraco.Core.Composing.CompositionRoots // some repositories have an annotated ctor parameter to pick the right cache helper // repositories - container.RegisterSingleton(f => new AuditRepository(f.GetInstance(), f.GetInstance(DisabledCache), f.GetInstance())); + container.RegisterSingleton(); container.RegisterSingleton(); container.RegisterSingleton(); container.RegisterSingleton(); @@ -64,13 +63,13 @@ namespace Umbraco.Core.Composing.CompositionRoots container.RegisterSingleton(); container.RegisterSingleton(); container.RegisterSingleton(); - container.RegisterSingleton(f => new RelationRepository(f.GetInstance(), f.GetInstance(DisabledCache), f.GetInstance(), f.GetInstance())); + container.RegisterSingleton(); container.RegisterSingleton(); container.RegisterSingleton(); container.RegisterSingleton(); - container.RegisterSingleton(f => new TaskRepository(f.GetInstance(), f.GetInstance(DisabledCache), f.GetInstance())); - container.RegisterSingleton(f => new TaskTypeRepository(f.GetInstance(), f.GetInstance(DisabledCache), f.GetInstance())); - container.RegisterSingleton(f => new TemplateRepository( + container.RegisterSingleton(); + container.RegisterSingleton(); + container.RegisterSingleton(f => new TemplateRepository( // fixme type the FS too! or? f.GetInstance(), f.GetInstance(), f.GetInstance(), diff --git a/src/Umbraco.Core/Composing/LightInject/ContainerAdapter.cs b/src/Umbraco.Core/Composing/LightInject/LightInjectContainer.cs similarity index 81% rename from src/Umbraco.Core/Composing/LightInject/ContainerAdapter.cs rename to src/Umbraco.Core/Composing/LightInject/LightInjectContainer.cs index 99ffb11ace..8eff2be60b 100644 --- a/src/Umbraco.Core/Composing/LightInject/ContainerAdapter.cs +++ b/src/Umbraco.Core/Composing/LightInject/LightInjectContainer.cs @@ -4,21 +4,21 @@ using LightInject; namespace Umbraco.Core.Composing.LightInject { /// - /// Implements for LightInject. + /// Implements with LightInject. /// - public class ContainerAdapter : IContainer // fixme rename LightInjectContainer? + public class LightInjectContainer : IContainer { private readonly IServiceContainer _container; /// - /// Initializes a new instance of the with a LightInject container. + /// Initializes a new instance of the with a LightInject container. /// - public ContainerAdapter(IServiceContainer container) + public LightInjectContainer(IServiceContainer container) { _container = container; } - // fixme + /// public object ConcreteContainer => _container; /// diff --git a/src/Umbraco.Core/Composing/LightInjectExtensions.cs b/src/Umbraco.Core/Composing/LightInjectExtensions.cs index 914af001a8..a64d3aff30 100644 --- a/src/Umbraco.Core/Composing/LightInjectExtensions.cs +++ b/src/Umbraco.Core/Composing/LightInjectExtensions.cs @@ -48,7 +48,7 @@ namespace Umbraco.Core.Composing container.Register(_ => container); // configure the current container - Current.Container = new LightInject.ContainerAdapter(container); + Current.Container = new LightInject.LightInjectContainer(container); } private class AssemblyScanner : IAssemblyScanner diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/AuditRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/AuditRepository.cs index d643e1f5a5..fe2a915c9f 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/AuditRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/AuditRepository.cs @@ -14,7 +14,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement { internal class AuditRepository : NPocoRepositoryBase, IAuditRepository { - public AuditRepository(IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger) + public AuditRepository(IScopeAccessor scopeAccessor, DisabledCacheHelper cache, ILogger logger) : base(scopeAccessor, cache, logger) { } diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/RelationRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/RelationRepository.cs index bb153beda9..732d01a868 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/RelationRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/RelationRepository.cs @@ -20,7 +20,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement { private readonly IRelationTypeRepository _relationTypeRepository; - public RelationRepository(IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger, IRelationTypeRepository relationTypeRepository) + public RelationRepository(IScopeAccessor scopeAccessor, DisabledCacheHelper cache, ILogger logger, IRelationTypeRepository relationTypeRepository) : base(scopeAccessor, cache, logger) { _relationTypeRepository = relationTypeRepository; diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/TaskRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/TaskRepository.cs index b70523d5e1..972b528d76 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/TaskRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/TaskRepository.cs @@ -15,7 +15,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement { internal class TaskRepository : NPocoRepositoryBase, ITaskRepository { - public TaskRepository(IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger) + public TaskRepository(IScopeAccessor scopeAccessor, DisabledCacheHelper cache, ILogger logger) : base(scopeAccessor, cache, logger) { } @@ -27,7 +27,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement var taskDto = Database.Fetch(SqlContext.SqlSyntax.SelectTop(sql, 1)).FirstOrDefault(); if (taskDto == null) return null; - + var entity = TaskFactory.BuildEntity(taskDto); return entity; } @@ -40,7 +40,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement { sql.Where("cmsTask.id IN (@ids)", new { ids = ids }); } - + var dtos = Database.Fetch(sql); return dtos.Select(TaskFactory.BuildEntity); } @@ -102,7 +102,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement { entity.TaskType.Id = taskType.Id; } - + var dto = TaskFactory.BuildDto(entity); var id = Convert.ToInt32(Database.Insert(dto)); @@ -114,7 +114,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement protected override void PersistUpdatedItem(Task entity) { entity.UpdatingEntity(); - + var dto = TaskFactory.BuildDto(entity); Database.Update(dto); @@ -131,7 +131,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement } var dtos = Database.Fetch(sql); - + return dtos.Select(TaskFactory.BuildEntity); } diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/TaskTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/TaskTypeRepository.cs index 57ddc68568..55f6905dde 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/TaskTypeRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/TaskTypeRepository.cs @@ -14,7 +14,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement { internal class TaskTypeRepository : NPocoRepositoryBase, ITaskTypeRepository { - public TaskTypeRepository(IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger) + public TaskTypeRepository(IScopeAccessor scopeAccessor, DisabledCacheHelper cache, ILogger logger) : base(scopeAccessor, cache, logger) { } @@ -26,7 +26,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement var taskDto = Database.Fetch(SqlContext.SqlSyntax.SelectTop(sql, 1)).FirstOrDefault(); if (taskDto == null) return null; - + var entity = TaskTypeFactory.BuildEntity(taskDto); return entity; } @@ -39,7 +39,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement { sql.Where("cmsTaskType.id IN (@ids)", new { ids }); } - + var dtos = Database.Fetch(sql); return dtos.Select(TaskTypeFactory.BuildEntity); } @@ -49,7 +49,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement var sqlClause = GetBaseQuery(false); var translator = new SqlTranslator(sqlClause, query); var sql = translator.Translate(); - + var dtos = Database.Fetch(sql); return dtos.Select(TaskTypeFactory.BuildEntity); } @@ -88,7 +88,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement { throw new InvalidOperationException("A task type already exists with the given alias " + entity.Alias); } - + var dto = TaskTypeFactory.BuildDto(entity); var id = Convert.ToInt32(Database.Insert(dto)); @@ -100,7 +100,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement protected override void PersistUpdatedItem(TaskType entity) { entity.UpdatingEntity(); - + var dto = TaskTypeFactory.BuildDto(entity); Database.Update(dto); diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 7a22e21205..264fcc9420 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -106,6 +106,7 @@ + @@ -170,7 +171,7 @@ - + diff --git a/src/Umbraco.Tests/CoreThings/UdiTests.cs b/src/Umbraco.Tests/CoreThings/UdiTests.cs index 4300401e18..49c02d5688 100644 --- a/src/Umbraco.Tests/CoreThings/UdiTests.cs +++ b/src/Umbraco.Tests/CoreThings/UdiTests.cs @@ -27,7 +27,7 @@ namespace Umbraco.Tests.CoreThings var globalSettings = SettingsForTests.GenerateMockGlobalSettings(); container.Setup(x => x.GetInstance(typeof (TypeLoader))).Returns( new TypeLoader(NullCacheProvider.Instance, globalSettings, new ProfilingLogger(Mock.Of(), Mock.Of()))); - Current.Container = new Core.Composing.LightInject.ContainerAdapter(container.Object); + Current.Container = new Core.Composing.LightInject.LightInjectContainer(container.Object); Udi.ResetUdiTypes(); } diff --git a/src/Umbraco.Tests/Models/VariationTests.cs b/src/Umbraco.Tests/Models/VariationTests.cs index 0b0ad8c7ec..be7135715b 100644 --- a/src/Umbraco.Tests/Models/VariationTests.cs +++ b/src/Umbraco.Tests/Models/VariationTests.cs @@ -30,7 +30,7 @@ namespace Umbraco.Tests.Models Current.Reset(); var container = Mock.Of(); - Current.Container = new ContainerAdapter(container); + Current.Container = new LightInjectContainer(container); var dataEditors = new DataEditorCollection(new IDataEditor[] { diff --git a/src/Umbraco.Tests/Scoping/ScopeEventDispatcherTests.cs b/src/Umbraco.Tests/Scoping/ScopeEventDispatcherTests.cs index b295edfb8b..ecb8e42c90 100644 --- a/src/Umbraco.Tests/Scoping/ScopeEventDispatcherTests.cs +++ b/src/Umbraco.Tests/Scoping/ScopeEventDispatcherTests.cs @@ -33,7 +33,7 @@ namespace Umbraco.Tests.Scoping DoThing3 = null; var lightinjectContainer = new ServiceContainer(); - Current.Container = new ContainerAdapter(lightinjectContainer); + Current.Container = new LightInjectContainer(lightinjectContainer); _testObjects = new TestObjects(lightinjectContainer); diff --git a/src/Umbraco.Tests/Web/TemplateUtilitiesTests.cs b/src/Umbraco.Tests/Web/TemplateUtilitiesTests.cs index 867d4574f1..a7a8c35fd1 100644 --- a/src/Umbraco.Tests/Web/TemplateUtilitiesTests.cs +++ b/src/Umbraco.Tests/Web/TemplateUtilitiesTests.cs @@ -44,7 +44,7 @@ namespace Umbraco.Tests.Web container.Setup(x => x.GetInstance(typeof(TypeLoader))).Returns( new TypeLoader(NullCacheProvider.Instance, SettingsForTests.GenerateMockGlobalSettings(), new ProfilingLogger(Mock.Of(), Mock.Of()))); container.Setup(x => x.GetInstance(typeof (ServiceContext))).Returns(serviceContext); - Current.Container = new ContainerAdapter(container.Object); + Current.Container = new LightInjectContainer(container.Object); Umbraco.Web.Composing.Current.UmbracoContextAccessor = new TestUmbracoContextAccessor();