From 33b4af03401247f4d2b41fb424ce70bc81668491 Mon Sep 17 00:00:00 2001 From: Stephan Date: Thu, 14 Dec 2017 17:04:44 +0100 Subject: [PATCH] UnitOfWork RIP, IScopeAccessor --- .../RepositoryCompositionRoot.cs | 100 ++++++-------- src/Umbraco.Core/Constants-Composing.cs | 28 ++++ src/Umbraco.Core/CoreRuntime.cs | 4 +- src/Umbraco.Core/CoreRuntimeComponent.cs | 17 +-- src/Umbraco.Core/Events/EventExtensions.cs | 5 - src/Umbraco.Core/IO/FileSystems.cs | 1 - src/Umbraco.Core/IO/MediaFileSystem.cs | 6 - .../Repositories/IAuditRepository.cs | 3 +- .../Repositories/IMemberGroupRepository.cs | 3 +- .../Repositories/IMemberRepository.cs | 3 +- .../Repositories/IMemberTypeRepository.cs | 3 +- .../Repositories/IMigrationEntryRepository.cs | 3 +- .../IPartialViewMacroRepository.cs | 2 +- .../Repositories/IPartialViewRepository.cs | 2 +- .../Repositories/IPublicAccessRepository.cs | 3 +- .../Repositories/IRedirectUrlRepository.cs | 3 +- .../Repositories/IRelationRepository.cs | 3 +- .../Repositories/IRelationTypeRepository.cs | 3 +- .../IServerRegistrationRepository.cs | 3 +- .../Repositories/ITagRepository.cs | 3 +- .../Repositories/ITaskRepository.cs | 3 +- .../Repositories/ITaskTypeRepository.cs | 3 +- .../Repositories/IUserGroupRepository.cs | 3 +- .../Repositories/IUserRepository.cs | 3 +- .../Repositories/Implement/AuditRepository.cs | 4 +- .../Implement/ContentRepositoryBase.cs | 5 +- .../Implement/ContentTypeRepository.cs | 5 +- .../Implement/ContentTypeRepositoryBase.cs | 5 +- .../Implement/DataTypeContainerRepository.cs | 4 +- .../Implement/DataTypeDefinitionRepository.cs | 54 +------- .../Implement/DictionaryRepository.cs | 17 ++- .../Implement/DocumentBlueprintRepository.cs | 5 +- .../Implement/DocumentRepository.cs | 16 +-- .../DocumentTypeContainerRepository.cs | 4 +- .../Implement/DomainRepository.cs | 4 +- .../Implement/EntityContainerRepository.cs | 7 +- .../Implement/EntityRepository.cs | 12 +- .../Implement/ExternalLoginRepository.cs | 5 +- .../Repositories/Implement/FileRepository.cs | 24 +--- .../Implement/LanguageRepository.cs | 5 +- .../Repositories/Implement/MacroRepository.cs | 4 +- .../Repositories/Implement/MediaRepository.cs | 11 +- .../Implement/MediaTypeContainerRepository.cs | 4 +- .../Implement/MediaTypeRepository.cs | 5 +- .../Implement/MemberGroupRepository.cs | 4 +- .../Implement/MemberRepository.cs | 5 +- .../Implement/MemberTypeRepository.cs | 4 +- .../Implement/MigrationEntryRepository.cs | 4 +- .../Implement/NPocoRepositoryBase.cs | 5 +- .../Implement/NotificationsRepository.cs | 39 +++--- .../Implement/PartialViewMacroRepository.cs | 5 +- .../Implement/PartialViewRepository.cs | 4 +- .../Implement/PermissionRepository.cs | 5 +- .../Implement/PublicAccessRepository.cs | 4 +- .../Implement/RedirectUrlRepository.cs | 4 +- .../Implement/RelationRepository.cs | 5 +- .../Implement/RelationTypeRepository.cs | 4 +- .../Implement/RepositoryBaseOfTIdTEntity.cs | 8 +- .../Implement/ScriptRepository.cs | 8 +- .../Implement/ServerRegistrationRepository.cs | 4 +- .../Implement/SimpleGetRepository.cs | 4 +- .../Implement/StylesheetRepository.cs | 5 +- .../Repositories/Implement/TagRepository.cs | 7 +- .../Repositories/Implement/TaskRepository.cs | 4 +- .../Implement/TaskTypeRepository.cs | 4 +- .../Implement/TemplateRepository.cs | 7 +- .../Implement/UserGroupRepository.cs | 13 +- .../Repositories/Implement/UserRepository.cs | 50 ++++--- .../Implement/XsltFileRepository.cs | 9 +- .../Persistence/RepositoryFactory.cs | 36 ----- .../UnitOfWork/IScopeUnitOfWork.cs | 45 ------ .../UnitOfWork/IScopeUnitOfWorkProvider.cs | 34 ----- .../Persistence/UnitOfWork/IUnitOfWork.cs | 62 --------- .../UnitOfWork/IUnitOfWorkRepository.cs | 14 -- .../Persistence/UnitOfWork/ScopeUnitOfWork.cs | 125 ----------------- .../UnitOfWork/ScopeUnitOfWorkProvider.cs | 33 ----- .../Persistence/UnitOfWork/UnitOfWorkBase.cs | 128 ------------------ .../Persistence/UnitOfWorkExtensions.cs | 19 --- src/Umbraco.Core/Scoping/IScopeAccessor.cs | 14 ++ src/Umbraco.Core/Scoping/ScopeProvider.cs | 14 +- .../Services/ContentTypeService.cs | 3 +- .../ContentTypeServiceBaseOfTItemTService.cs | 1 - src/Umbraco.Core/Services/DataTypeService.cs | 32 ++++- src/Umbraco.Core/Services/EntityService.cs | 1 - src/Umbraco.Core/Services/FileService.cs | 2 +- .../Services/LocalizationService.cs | 1 - src/Umbraco.Core/Services/MacroService.cs | 1 - src/Umbraco.Core/Services/MediaTypeService.cs | 3 +- .../Services/MemberTypeService.cs | 4 +- .../Services/RedirectUrlService.cs | 8 +- .../Services/ServerRegistrationService.cs | 1 - src/Umbraco.Core/Umbraco.Core.csproj | 11 +- .../NuCache/DataSource/Database.cs | 1 - .../NuCache/NuCacheComponent.cs | 8 +- .../PublishedSnapshotService.cs | 19 ++- .../XmlPublishedCache/XmlCacheComponent.cs | 4 +- src/Umbraco.Web/Services/SectionService.cs | 1 - 97 files changed, 357 insertions(+), 893 deletions(-) create mode 100644 src/Umbraco.Core/Constants-Composing.cs delete mode 100644 src/Umbraco.Core/Persistence/RepositoryFactory.cs delete mode 100644 src/Umbraco.Core/Persistence/UnitOfWork/IScopeUnitOfWork.cs delete mode 100644 src/Umbraco.Core/Persistence/UnitOfWork/IScopeUnitOfWorkProvider.cs delete mode 100644 src/Umbraco.Core/Persistence/UnitOfWork/IUnitOfWork.cs delete mode 100644 src/Umbraco.Core/Persistence/UnitOfWork/IUnitOfWorkRepository.cs delete mode 100644 src/Umbraco.Core/Persistence/UnitOfWork/ScopeUnitOfWork.cs delete mode 100644 src/Umbraco.Core/Persistence/UnitOfWork/ScopeUnitOfWorkProvider.cs delete mode 100644 src/Umbraco.Core/Persistence/UnitOfWork/UnitOfWorkBase.cs delete mode 100644 src/Umbraco.Core/Persistence/UnitOfWorkExtensions.cs create mode 100644 src/Umbraco.Core/Scoping/IScopeAccessor.cs diff --git a/src/Umbraco.Core/Composing/CompositionRoots/RepositoryCompositionRoot.cs b/src/Umbraco.Core/Composing/CompositionRoots/RepositoryCompositionRoot.cs index 26f4d478e3..ffc013cb11 100644 --- a/src/Umbraco.Core/Composing/CompositionRoots/RepositoryCompositionRoot.cs +++ b/src/Umbraco.Core/Composing/CompositionRoots/RepositoryCompositionRoot.cs @@ -1,10 +1,8 @@ using System; using LightInject; using Umbraco.Core.Cache; -using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.Repositories; using Umbraco.Core.Persistence.Repositories.Implement; -using Umbraco.Core.Persistence.UnitOfWork; namespace Umbraco.Core.Composing.CompositionRoots { @@ -17,12 +15,6 @@ namespace Umbraco.Core.Composing.CompositionRoots public void Compose(IServiceRegistry container) { - // register the IUnitOfWork provider - container.RegisterSingleton(); - - // register repository factory - container.RegisterSingleton(); - // 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 @@ -32,62 +24,58 @@ namespace Umbraco.Core.Composing.CompositionRoots // the container, 'info' describes the ctor argument, and 'args' contains the args that // were passed to GetInstance() - use first arg if it is the right type, // - // for IScopeUnitOfWork - container.RegisterConstructorDependency((factory, info, args) => args.Length > 0 ? args[0] as IScopeUnitOfWork : null); - // for IUnitOfWork - //container.RegisterConstructorDependency((factory, info, args) => args.Length > 0 ? args[0] as IUnitOfWork : null); + // for ... + //container.RegisterConstructorDependency((factory, info, args) => + //{ + // if (info.Member.DeclaringType != typeof(EntityContainerRepository)) return default; + // return args.Length > 0 && args[0] is Guid guid ? guid : default; + //}); // register repositories - // repos depend on various things, and a IDatabaseUnitOfWork (registered above) + // repos depend on various things, // some repositories have an annotated ctor parameter to pick the right cache helper // repositories - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); + container.RegisterSingleton(); + container.RegisterSingleton(); + container.RegisterSingleton(); + container.RegisterSingleton(); + container.RegisterSingleton(); + container.RegisterSingleton(); + container.RegisterSingleton(); + container.RegisterSingleton(); + container.RegisterSingleton(); + container.RegisterSingleton(); + container.RegisterSingleton(); + container.RegisterSingleton(); + container.RegisterSingleton(); + container.RegisterSingleton(); + container.RegisterSingleton(); + container.RegisterSingleton(); + container.RegisterSingleton(); + container.RegisterSingleton(); + container.RegisterSingleton(); + container.RegisterSingleton(); + container.RegisterSingleton(); + container.RegisterSingleton(); + container.RegisterSingleton(); + container.RegisterSingleton(); + container.RegisterSingleton(); + container.RegisterSingleton(); + container.RegisterSingleton(); + container.RegisterSingleton(); + container.RegisterSingleton(); + container.RegisterSingleton(); + container.RegisterSingleton(); + container.RegisterSingleton(); // repositories that depend on a filesystem // these have an annotated ctor parameter to pick the right file system - container.Register(); - container.Register(); - container.Register(); - container.Register(); - - // collection builders require a full IServiceContainer because they need to - // be able to both register stuff, and get stuff - but ICompositionRoot gives - // us an IServiceRegistry - which *is* a full container - so, casting - bit - // awkward but it works - var serviceContainer = container as IServiceContainer; - if (serviceContainer == null) throw new Exception("Container is not IServiceContainer."); + container.RegisterSingleton(); + container.RegisterSingleton(); + container.RegisterSingleton(); + container.RegisterSingleton(); + container.RegisterSingleton(); } } } diff --git a/src/Umbraco.Core/Constants-Composing.cs b/src/Umbraco.Core/Constants-Composing.cs new file mode 100644 index 0000000000..34aebddd6a --- /dev/null +++ b/src/Umbraco.Core/Constants-Composing.cs @@ -0,0 +1,28 @@ +namespace Umbraco.Core +{ + /// + /// Defines constants. + /// + public static partial class Constants + { + /// + /// Defines constants for composition. + /// + public static class Composing + { + /// + /// Defines file system names. + /// + public static class FileSystems + { + public const string ScriptFileSystem = "ScriptFileSystem"; + public const string PartialViewFileSystem = "PartialViewFileSystem"; + public const string PartialViewMacroFileSystem = "PartialViewMacroFileSystem"; + public const string StylesheetFileSystem = "StylesheetFileSystem"; + public const string MasterpageFileSystem = "MasterpageFileSystem"; + public const string ViewFileSystem = "ViewFileSystem"; + public const string XsltFileSystem = "XsltFileSystem"; + } + } + } +} diff --git a/src/Umbraco.Core/CoreRuntime.cs b/src/Umbraco.Core/CoreRuntime.cs index 5e9827e856..57ec469757 100644 --- a/src/Umbraco.Core/CoreRuntime.cs +++ b/src/Umbraco.Core/CoreRuntime.cs @@ -220,7 +220,9 @@ namespace Umbraco.Core container.RegisterSingleton(f => f.GetInstance().SqlContext); // register the scope provider - container.RegisterSingleton(); + container.RegisterSingleton(); + container.RegisterSingleton(f => f.GetInstance()); + container.RegisterSingleton(f => f.GetInstance()); // register MainDom container.RegisterSingleton(); diff --git a/src/Umbraco.Core/CoreRuntimeComponent.cs b/src/Umbraco.Core/CoreRuntimeComponent.cs index a87873dd51..070b4abfc0 100644 --- a/src/Umbraco.Core/CoreRuntimeComponent.cs +++ b/src/Umbraco.Core/CoreRuntimeComponent.cs @@ -43,14 +43,15 @@ namespace Umbraco.Core composition.Container.Register(); // register filesystems - composition.Container.Register(); - composition.Container.Register(factory => factory.GetInstance().MediaFileSystem); - composition.Container.RegisterSingleton(factory => factory.GetInstance().ScriptsFileSystem, "ScriptFileSystem"); - composition.Container.RegisterSingleton(factory => factory.GetInstance().PartialViewsFileSystem, "PartialViewFileSystem"); - composition.Container.RegisterSingleton(factory => factory.GetInstance().MacroPartialsFileSystem, "PartialViewMacroFileSystem"); - composition.Container.RegisterSingleton(factory => factory.GetInstance().StylesheetsFileSystem, "StylesheetFileSystem"); - composition.Container.RegisterSingleton(factory => factory.GetInstance().MasterPagesFileSystem, "MasterpageFileSystem"); - composition.Container.RegisterSingleton(factory => factory.GetInstance().MvcViewsFileSystem, "ViewFileSystem"); + composition.Container.RegisterSingleton(); + composition.Container.RegisterSingleton(factory => factory.GetInstance().MediaFileSystem); + composition.Container.RegisterSingleton(factory => factory.GetInstance().ScriptsFileSystem, Constants.Composing.FileSystems.ScriptFileSystem); + composition.Container.RegisterSingleton(factory => factory.GetInstance().PartialViewsFileSystem, Constants.Composing.FileSystems.PartialViewFileSystem); + composition.Container.RegisterSingleton(factory => factory.GetInstance().MacroPartialsFileSystem, Constants.Composing.FileSystems.PartialViewMacroFileSystem); + composition.Container.RegisterSingleton(factory => factory.GetInstance().StylesheetsFileSystem, Constants.Composing.FileSystems.StylesheetFileSystem); + composition.Container.RegisterSingleton(factory => factory.GetInstance().MasterPagesFileSystem, Constants.Composing.FileSystems.MasterpageFileSystem); + composition.Container.RegisterSingleton(factory => factory.GetInstance().MvcViewsFileSystem, Constants.Composing.FileSystems.ViewFileSystem); + composition.Container.RegisterSingleton(factory => factory.GetInstance().XsltFileSystem, Constants.Composing.FileSystems.XsltFileSystem); // register manifest builder, will be injected in eg PropertyEditorCollectionBuilder composition.Container.RegisterSingleton(factory diff --git a/src/Umbraco.Core/Events/EventExtensions.cs b/src/Umbraco.Core/Events/EventExtensions.cs index ecd9bb0240..8843bcb1d6 100644 --- a/src/Umbraco.Core/Events/EventExtensions.cs +++ b/src/Umbraco.Core/Events/EventExtensions.cs @@ -1,9 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Runtime.CompilerServices; -using Umbraco.Core.Persistence.UnitOfWork; namespace Umbraco.Core.Events { diff --git a/src/Umbraco.Core/IO/FileSystems.cs b/src/Umbraco.Core/IO/FileSystems.cs index 7bdabb558c..ab1fbbcf45 100644 --- a/src/Umbraco.Core/IO/FileSystems.cs +++ b/src/Umbraco.Core/IO/FileSystems.cs @@ -8,7 +8,6 @@ using System.Threading; using Umbraco.Core.Configuration; using Umbraco.Core.Logging; using Umbraco.Core.Composing; -using Umbraco.Core.Scoping; namespace Umbraco.Core.IO { diff --git a/src/Umbraco.Core/IO/MediaFileSystem.cs b/src/Umbraco.Core/IO/MediaFileSystem.cs index 6e1d554c1f..b96b0d54bc 100644 --- a/src/Umbraco.Core/IO/MediaFileSystem.cs +++ b/src/Umbraco.Core/IO/MediaFileSystem.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; using System.Drawing; -using System.Drawing.Drawing2D; -using System.Drawing.Imaging; using System.Globalization; using System.IO; using System.Linq; @@ -17,7 +15,6 @@ using Umbraco.Core.Logging; using Umbraco.Core.Media; using Umbraco.Core.Media.Exif; using Umbraco.Core.Models; -using Umbraco.Core.Services; namespace Umbraco.Core.IO { @@ -54,9 +51,6 @@ namespace Umbraco.Core.IO [Inject] internal ILogger Logger { get; set; } - [Inject] - internal IDataTypeService DataTypeService { get; set; } - internal UploadAutoFillProperties UploadAutoFillProperties { get; } // note - this is currently experimental / being developed diff --git a/src/Umbraco.Core/Persistence/Repositories/IAuditRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IAuditRepository.cs index 851fd2fe56..f05dcfca91 100644 --- a/src/Umbraco.Core/Persistence/Repositories/IAuditRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/IAuditRepository.cs @@ -1,9 +1,8 @@ using Umbraco.Core.Models; -using Umbraco.Core.Persistence.UnitOfWork; namespace Umbraco.Core.Persistence.Repositories { - public interface IAuditRepository : IUnitOfWorkRepository, IReadRepository, IWriteRepository, IQueryRepository + public interface IAuditRepository : IReadRepository, IWriteRepository, IQueryRepository { void CleanLogs(int maximumAgeOfLogsInMinutes); } diff --git a/src/Umbraco.Core/Persistence/Repositories/IMemberGroupRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IMemberGroupRepository.cs index a82dbe76a9..7b3414e3ef 100644 --- a/src/Umbraco.Core/Persistence/Repositories/IMemberGroupRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/IMemberGroupRepository.cs @@ -1,10 +1,9 @@ using System.Collections.Generic; using Umbraco.Core.Models; -using Umbraco.Core.Persistence.UnitOfWork; namespace Umbraco.Core.Persistence.Repositories { - public interface IMemberGroupRepository : IUnitOfWorkRepository, IReadWriteQueryRepository + public interface IMemberGroupRepository : IReadWriteQueryRepository { /// /// Gets a member group by it's name diff --git a/src/Umbraco.Core/Persistence/Repositories/IMemberRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IMemberRepository.cs index 26583300ce..245c024356 100644 --- a/src/Umbraco.Core/Persistence/Repositories/IMemberRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/IMemberRepository.cs @@ -1,11 +1,10 @@ using System.Collections.Generic; using Umbraco.Core.Models; using Umbraco.Core.Persistence.Querying; -using Umbraco.Core.Persistence.UnitOfWork; namespace Umbraco.Core.Persistence.Repositories { - public interface IMemberRepository : IUnitOfWorkRepository, IContentRepository + public interface IMemberRepository : IContentRepository { /// /// Finds members in a given role diff --git a/src/Umbraco.Core/Persistence/Repositories/IMemberTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IMemberTypeRepository.cs index 54a495c181..3b78d9de57 100644 --- a/src/Umbraco.Core/Persistence/Repositories/IMemberTypeRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/IMemberTypeRepository.cs @@ -1,8 +1,7 @@ using Umbraco.Core.Models; -using Umbraco.Core.Persistence.UnitOfWork; namespace Umbraco.Core.Persistence.Repositories { - public interface IMemberTypeRepository : IUnitOfWorkRepository, IContentTypeRepositoryBase + public interface IMemberTypeRepository : IContentTypeRepositoryBase { } } diff --git a/src/Umbraco.Core/Persistence/Repositories/IMigrationEntryRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IMigrationEntryRepository.cs index 0b2d0f3ed9..51d94266ea 100644 --- a/src/Umbraco.Core/Persistence/Repositories/IMigrationEntryRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/IMigrationEntryRepository.cs @@ -1,10 +1,9 @@ using Semver; using Umbraco.Core.Models; -using Umbraco.Core.Persistence.UnitOfWork; namespace Umbraco.Core.Persistence.Repositories { - public interface IMigrationEntryRepository : IUnitOfWorkRepository, IReadWriteQueryRepository + public interface IMigrationEntryRepository : IReadWriteQueryRepository { IMigrationEntry FindEntry(string migrationName, SemVersion version); } diff --git a/src/Umbraco.Core/Persistence/Repositories/IPartialViewMacroRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IPartialViewMacroRepository.cs index 0f5475e7b6..fd83ffdfcc 100644 --- a/src/Umbraco.Core/Persistence/Repositories/IPartialViewMacroRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/IPartialViewMacroRepository.cs @@ -4,6 +4,6 @@ // without resorting to constants, names, whatever - and IPartialViewRepository // is implemented by PartialViewRepository and IPartialViewMacroRepository by // PartialViewMacroRepository - just to inject the proper filesystem. - internal interface IPartialViewMacroRepository : IPartialViewRepository + public interface IPartialViewMacroRepository : IPartialViewRepository { } } diff --git a/src/Umbraco.Core/Persistence/Repositories/IPartialViewRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IPartialViewRepository.cs index 331d929800..5a7bae1ce3 100644 --- a/src/Umbraco.Core/Persistence/Repositories/IPartialViewRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/IPartialViewRepository.cs @@ -3,7 +3,7 @@ using Umbraco.Core.Models; namespace Umbraco.Core.Persistence.Repositories { - internal interface IPartialViewRepository : IReadRepository, IWriteRepository + public interface IPartialViewRepository : IReadRepository, IWriteRepository { void AddFolder(string folderPath); void DeleteFolder(string folderPath); diff --git a/src/Umbraco.Core/Persistence/Repositories/IPublicAccessRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IPublicAccessRepository.cs index 1283271330..8ed8b17114 100644 --- a/src/Umbraco.Core/Persistence/Repositories/IPublicAccessRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/IPublicAccessRepository.cs @@ -1,9 +1,8 @@ using System; using Umbraco.Core.Models; -using Umbraco.Core.Persistence.UnitOfWork; namespace Umbraco.Core.Persistence.Repositories { - public interface IPublicAccessRepository : IUnitOfWorkRepository, IReadWriteQueryRepository + public interface IPublicAccessRepository : IReadWriteQueryRepository { } } diff --git a/src/Umbraco.Core/Persistence/Repositories/IRedirectUrlRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IRedirectUrlRepository.cs index 071e9d2a93..47a56bb530 100644 --- a/src/Umbraco.Core/Persistence/Repositories/IRedirectUrlRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/IRedirectUrlRepository.cs @@ -1,14 +1,13 @@ using System; using System.Collections.Generic; using Umbraco.Core.Models; -using Umbraco.Core.Persistence.UnitOfWork; namespace Umbraco.Core.Persistence.Repositories { /// /// Defines the repository. /// - public interface IRedirectUrlRepository : IUnitOfWorkRepository, IReadWriteQueryRepository + public interface IRedirectUrlRepository : IReadWriteQueryRepository { /// /// Gets a redirect url. diff --git a/src/Umbraco.Core/Persistence/Repositories/IRelationRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IRelationRepository.cs index 029077dfee..51d7656d8a 100644 --- a/src/Umbraco.Core/Persistence/Repositories/IRelationRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/IRelationRepository.cs @@ -1,9 +1,8 @@ using Umbraco.Core.Models; -using Umbraco.Core.Persistence.UnitOfWork; namespace Umbraco.Core.Persistence.Repositories { - public interface IRelationRepository : IUnitOfWorkRepository, IReadWriteQueryRepository + public interface IRelationRepository : IReadWriteQueryRepository { } diff --git a/src/Umbraco.Core/Persistence/Repositories/IRelationTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IRelationTypeRepository.cs index 30c8b82125..393bf5a7ca 100644 --- a/src/Umbraco.Core/Persistence/Repositories/IRelationTypeRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/IRelationTypeRepository.cs @@ -1,9 +1,8 @@ using System; using Umbraco.Core.Models; -using Umbraco.Core.Persistence.UnitOfWork; namespace Umbraco.Core.Persistence.Repositories { - public interface IRelationTypeRepository : IUnitOfWorkRepository, IReadWriteQueryRepository, IReadRepository + public interface IRelationTypeRepository : IReadWriteQueryRepository, IReadRepository { } } diff --git a/src/Umbraco.Core/Persistence/Repositories/IServerRegistrationRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IServerRegistrationRepository.cs index 8bd3f43c35..eac90b57d2 100644 --- a/src/Umbraco.Core/Persistence/Repositories/IServerRegistrationRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/IServerRegistrationRepository.cs @@ -1,10 +1,9 @@ using System; using Umbraco.Core.Models; -using Umbraco.Core.Persistence.UnitOfWork; namespace Umbraco.Core.Persistence.Repositories { - public interface IServerRegistrationRepository : IUnitOfWorkRepository, IReadWriteQueryRepository + public interface IServerRegistrationRepository : IReadWriteQueryRepository { void DeactiveStaleServers(TimeSpan staleTimeout); } diff --git a/src/Umbraco.Core/Persistence/Repositories/ITagRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ITagRepository.cs index 9268cc01bb..34ca21b37d 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ITagRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ITagRepository.cs @@ -1,11 +1,10 @@ using System; using System.Collections.Generic; using Umbraco.Core.Models; -using Umbraco.Core.Persistence.UnitOfWork; namespace Umbraco.Core.Persistence.Repositories { - public interface ITagRepository : IUnitOfWorkRepository, IReadWriteQueryRepository + public interface ITagRepository : IReadWriteQueryRepository { TaggedEntity GetTaggedEntityByKey(Guid key); diff --git a/src/Umbraco.Core/Persistence/Repositories/ITaskRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ITaskRepository.cs index d1ebd1ffe5..10c517fa72 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ITaskRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ITaskRepository.cs @@ -1,10 +1,9 @@ using System.Collections.Generic; using Umbraco.Core.Models; -using Umbraco.Core.Persistence.UnitOfWork; namespace Umbraco.Core.Persistence.Repositories { - public interface ITaskRepository : IUnitOfWorkRepository, IReadWriteQueryRepository + public interface ITaskRepository : IReadWriteQueryRepository { IEnumerable GetTasks(int? itemId = null, int? assignedUser = null, int? ownerUser = null, string taskTypeAlias = null, bool includeClosed = false); } diff --git a/src/Umbraco.Core/Persistence/Repositories/ITaskTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ITaskTypeRepository.cs index 950dc7e954..9fe483b462 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ITaskTypeRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ITaskTypeRepository.cs @@ -1,8 +1,7 @@ using Umbraco.Core.Models; -using Umbraco.Core.Persistence.UnitOfWork; namespace Umbraco.Core.Persistence.Repositories { - public interface ITaskTypeRepository : IUnitOfWorkRepository, IReadWriteQueryRepository + public interface ITaskTypeRepository : IReadWriteQueryRepository { } } diff --git a/src/Umbraco.Core/Persistence/Repositories/IUserGroupRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IUserGroupRepository.cs index 4bebc4ef5b..fa4b21dbc8 100644 --- a/src/Umbraco.Core/Persistence/Repositories/IUserGroupRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/IUserGroupRepository.cs @@ -1,10 +1,9 @@ using System.Collections.Generic; using Umbraco.Core.Models.Membership; -using Umbraco.Core.Persistence.UnitOfWork; namespace Umbraco.Core.Persistence.Repositories { - public interface IUserGroupRepository : IUnitOfWorkRepository, IReadWriteQueryRepository + public interface IUserGroupRepository : IReadWriteQueryRepository { /// /// Gets a group by it's alias diff --git a/src/Umbraco.Core/Persistence/Repositories/IUserRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IUserRepository.cs index a4e7ae65fc..0079f0c3e1 100644 --- a/src/Umbraco.Core/Persistence/Repositories/IUserRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/IUserRepository.cs @@ -4,11 +4,10 @@ using System.Linq.Expressions; using Umbraco.Core.Models.Membership; using Umbraco.Core.Persistence.DatabaseModelDefinitions; using Umbraco.Core.Persistence.Querying; -using Umbraco.Core.Persistence.UnitOfWork; namespace Umbraco.Core.Persistence.Repositories { - public interface IUserRepository : IUnitOfWorkRepository, IReadWriteQueryRepository + public interface IUserRepository : IReadWriteQueryRepository { /// /// Gets the count of items based on a complex query diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/AuditRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/AuditRepository.cs index 4e6dc34d32..99e57ab73d 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/AuditRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/AuditRepository.cs @@ -15,8 +15,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement { internal class AuditRepository : NPocoRepositoryBase, IAuditRepository { - public AuditRepository(ScopeProvider scopeProvider, [Inject(RepositoryCompositionRoot.DisabledCache)] CacheHelper cache, ILogger logger) - : base(scopeProvider, cache, logger) + public AuditRepository(IScopeAccessor scopeAccessor, [Inject(RepositoryCompositionRoot.DisabledCache)] CacheHelper cache, ILogger logger) + : base(scopeAccessor, cache, logger) { } protected override void PersistNewItem(AuditItem entity) diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/ContentRepositoryBase.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/ContentRepositoryBase.cs index a2ff2eb087..cde712389a 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/ContentRepositoryBase.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/ContentRepositoryBase.cs @@ -14,7 +14,6 @@ using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Persistence.DatabaseModelDefinitions; using Umbraco.Core.Persistence.Factories; using Umbraco.Core.Persistence.Querying; -using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.PropertyEditors; using Umbraco.Core.Scoping; using Umbraco.Core.Services; @@ -33,8 +32,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement where TEntity : class, IUmbracoEntity where TRepository : class, IRepository { - protected ContentRepositoryBase(ScopeProvider scopeProvider, CacheHelper cache, ILogger logger) - : base(scopeProvider, cache, logger) + protected ContentRepositoryBase(IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger) + : base(scopeAccessor, cache, logger) { } protected abstract TRepository This { get; } diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/ContentTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/ContentTypeRepository.cs index d1866d3fd2..ba28d0e0d6 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/ContentTypeRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/ContentTypeRepository.cs @@ -9,7 +9,6 @@ using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Persistence.SqlSyntax; -using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.Scoping; namespace Umbraco.Core.Persistence.Repositories.Implement @@ -21,8 +20,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement { private readonly ITemplateRepository _templateRepository; - public ContentTypeRepository(ScopeProvider scopeProvider, CacheHelper cache, ILogger logger, ITemplateRepository templateRepository) - : base(scopeProvider, cache, logger) + public ContentTypeRepository(IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger, ITemplateRepository templateRepository) + : base(scopeAccessor, cache, logger) { _templateRepository = templateRepository; } diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/ContentTypeRepositoryBase.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/ContentTypeRepositoryBase.cs index 6f7f585be9..36d57e5bd7 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/ContentTypeRepositoryBase.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/ContentTypeRepositoryBase.cs @@ -15,7 +15,6 @@ using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Persistence.Factories; using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Persistence.SqlSyntax; -using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.Scoping; using Umbraco.Core.Services; @@ -29,8 +28,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement internal abstract class ContentTypeRepositoryBase : NPocoRepositoryBase, IReadRepository where TEntity : class, IContentTypeComposition { - protected ContentTypeRepositoryBase(ScopeProvider scopeProvider, CacheHelper cache, ILogger logger) - : base(scopeProvider, cache, logger) + protected ContentTypeRepositoryBase(IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger) + : base(scopeAccessor, cache, logger) { } protected abstract bool IsPublishing { get; } diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/DataTypeContainerRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/DataTypeContainerRepository.cs index 83fd58f3c2..f23b6df5e2 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/DataTypeContainerRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/DataTypeContainerRepository.cs @@ -6,8 +6,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement { class DataTypeContainerRepository : EntityContainerRepository, IDataTypeContainerRepository { - public DataTypeContainerRepository(ScopeProvider scopeProvider, CacheHelper cache, ILogger logger) - : base(scopeProvider, cache, logger, Constants.ObjectTypes.DataTypeContainer) + public DataTypeContainerRepository(IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger) + : base(scopeAccessor, cache, logger, Constants.ObjectTypes.DataTypeContainer) { } } } diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/DataTypeDefinitionRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/DataTypeDefinitionRepository.cs index ac30a60f9a..1d6cb68709 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/DataTypeDefinitionRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/DataTypeDefinitionRepository.cs @@ -13,7 +13,6 @@ using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Persistence.Factories; using Umbraco.Core.Persistence.Querying; -using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.Scoping; using Umbraco.Core.Services; @@ -24,14 +23,12 @@ namespace Umbraco.Core.Persistence.Repositories.Implement /// internal class DataTypeDefinitionRepository : NPocoRepositoryBase, IDataTypeDefinitionRepository { - private readonly IContentTypeRepository _contentTypeRepository; private readonly DataTypePreValueRepository _preValRepository; - public DataTypeDefinitionRepository(ScopeProvider scopeProvider, CacheHelper cache, ILogger logger, IContentTypeRepository contentTypeRepository) - : base(scopeProvider, cache, logger) + public DataTypeDefinitionRepository(IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger) + : base(scopeAccessor, cache, logger) { - _contentTypeRepository = contentTypeRepository; - _preValRepository = new DataTypePreValueRepository(scopeProvider, CacheHelper.NoCache, logger); + _preValRepository = new DataTypePreValueRepository(scopeAccessor, CacheHelper.NoCache, logger); } #region Overrides of RepositoryBase @@ -72,47 +69,6 @@ namespace Umbraco.Core.Persistence.Repositories.Implement return dtos.Select(factory.BuildEntity).ToArray(); } - /// - /// Override the delete method so that we can ensure that all related content type's are updated as part of the overall transaction - /// - /// - public override void Delete(IDataTypeDefinition entity) - { - //Find ContentTypes using this IDataTypeDefinition on a PropertyType - var query = Query().Where(x => x.DataTypeDefinitionId == entity.Id); - - //TODO: Don't we need to be concerned about media and member types here too ? - var contentTypes = _contentTypeRepository.GetByQuery(query); - - //Loop through the list of results and remove the PropertyTypes that references the DataTypeDefinition that is being deleted - foreach (var contentType in contentTypes) - { - if (contentType == null) continue; - - foreach (var group in contentType.PropertyGroups) - { - var types = @group.PropertyTypes.Where(x => x.DataTypeDefinitionId == entity.Id).ToList(); - foreach (var propertyType in types) - { - @group.PropertyTypes.Remove(propertyType); - } - } - - // so... we are modifying content types here. the service will trigger Deleted event, - // which will propagate to DataTypeCacheRefresher which will clear almost every cache - // there is to clear... and in addition published snapshot caches will clear themselves too, so - // this is probably safe alghough it looks... weird. - // - // what IS weird is that a content type is losing a property and we do NOT raise any - // content type event... so ppl better listen on the data type events too. - - _contentTypeRepository.Save(contentType); - } - - //call the base method to queue the deletion of this data type - base.Delete(entity); - } - #endregion #region Overrides of NPocoRepositoryBase @@ -479,8 +435,8 @@ AND umbracoNode.id <> @id", /// private class DataTypePreValueRepository : NPocoRepositoryBase { - public DataTypePreValueRepository(ScopeProvider scopeProvider, CacheHelper cache, ILogger logger) - : base(scopeProvider, cache, logger) + public DataTypePreValueRepository(IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger) + : base(scopeAccessor, cache, logger) { } #region Not implemented (don't need to for the purposes of this repo) diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/DictionaryRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/DictionaryRepository.cs index abfb1d2686..87e435a5e8 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/DictionaryRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/DictionaryRepository.cs @@ -9,7 +9,6 @@ using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Persistence.Factories; using Umbraco.Core.Persistence.Querying; -using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.Scoping; namespace Umbraco.Core.Persistence.Repositories.Implement @@ -19,8 +18,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement /// internal class DictionaryRepository : NPocoRepositoryBase, IDictionaryRepository { - public DictionaryRepository(ScopeProvider scopeProvider, CacheHelper cache, ILogger logger) - : base(scopeProvider, cache, logger) + public DictionaryRepository(IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger) + : base(scopeAccessor, cache, logger) { } protected override IRepositoryCachePolicy CreateCachePolicy(IRuntimeCacheProvider runtimeCache) @@ -231,13 +230,13 @@ namespace Umbraco.Core.Persistence.Repositories.Implement public IDictionaryItem Get(Guid uniqueId) { - var uniqueIdRepo = new DictionaryByUniqueIdRepository(this, ScopeProvider, GlobalCache, Logger); + var uniqueIdRepo = new DictionaryByUniqueIdRepository(this, ScopeAccessor, GlobalCache, Logger); return uniqueIdRepo.Get(uniqueId); } public IDictionaryItem Get(string key) { - var keyRepo = new DictionaryByKeyRepository(this, ScopeProvider, GlobalCache, Logger); + var keyRepo = new DictionaryByKeyRepository(this, ScopeAccessor, GlobalCache, Logger); return keyRepo.Get(key); } @@ -297,8 +296,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement { private readonly DictionaryRepository _dictionaryRepository; - public DictionaryByUniqueIdRepository(DictionaryRepository dictionaryRepository, ScopeProvider scopeProvider, CacheHelper cache, ILogger logger) - : base(scopeProvider, cache, logger) + public DictionaryByUniqueIdRepository(DictionaryRepository dictionaryRepository, IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger) + : base(scopeAccessor, cache, logger) { _dictionaryRepository = dictionaryRepository; } @@ -350,8 +349,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement { private readonly DictionaryRepository _dictionaryRepository; - public DictionaryByKeyRepository(DictionaryRepository dictionaryRepository, ScopeProvider scopeProvider, CacheHelper cache, ILogger logger) - : base(scopeProvider, cache, logger) + public DictionaryByKeyRepository(DictionaryRepository dictionaryRepository, IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger) + : base(scopeAccessor, cache, logger) { _dictionaryRepository = dictionaryRepository; } diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/DocumentBlueprintRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/DocumentBlueprintRepository.cs index 0e2020babb..3a7f24cbe2 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/DocumentBlueprintRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/DocumentBlueprintRepository.cs @@ -2,7 +2,6 @@ using Umbraco.Core.Cache; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Logging; -using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.Scoping; namespace Umbraco.Core.Persistence.Repositories.Implement @@ -18,8 +17,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement /// internal class DocumentBlueprintRepository : DocumentRepository, IDocumentBlueprintRepository { - public DocumentBlueprintRepository(ScopeProvider scopeProvider, CacheHelper cacheHelper, ILogger logger, IContentTypeRepository contentTypeRepository, ITemplateRepository templateRepository, ITagRepository tagRepository, IContentSection settings) - : base(scopeProvider, cacheHelper, logger, contentTypeRepository, templateRepository, tagRepository, settings) + public DocumentBlueprintRepository(IScopeAccessor scopeAccessor, CacheHelper cacheHelper, ILogger logger, IContentTypeRepository contentTypeRepository, ITemplateRepository templateRepository, ITagRepository tagRepository, IContentSection settings) + : base(scopeAccessor, cacheHelper, logger, contentTypeRepository, templateRepository, tagRepository, settings) { EnsureUniqueNaming = false; // duplicates are allowed } diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/DocumentRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/DocumentRepository.cs index 1dd8653cda..4892a9d0d7 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/DocumentRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/DocumentRepository.cs @@ -13,7 +13,6 @@ using Umbraco.Core.Persistence.DatabaseModelDefinitions; using Umbraco.Core.Persistence.Factories; using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Persistence.SqlSyntax; -using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.Scoping; namespace Umbraco.Core.Persistence.Repositories.Implement @@ -23,22 +22,23 @@ namespace Umbraco.Core.Persistence.Repositories.Implement /// internal class DocumentRepository : ContentRepositoryBase, IDocumentRepository { - private readonly ScopeProvider _scopeProvider; private readonly IContentTypeRepository _contentTypeRepository; private readonly ITemplateRepository _templateRepository; private readonly ITagRepository _tagRepository; private readonly CacheHelper _cacheHelper; private PermissionRepository _permissionRepository; private readonly ContentByGuidReadRepository _contentByGuidReadRepository; + private readonly IScopeAccessor _scopeAccessor; - public DocumentRepository(ScopeProvider scopeProvider, CacheHelper cacheHelper, ILogger logger, IContentTypeRepository contentTypeRepository, ITemplateRepository templateRepository, ITagRepository tagRepository, IContentSection settings) - : base(scopeProvider, cacheHelper, logger) + public DocumentRepository(IScopeAccessor scopeAccessor, CacheHelper cacheHelper, ILogger logger, IContentTypeRepository contentTypeRepository, ITemplateRepository templateRepository, ITagRepository tagRepository, IContentSection settings) + : base(scopeAccessor, cacheHelper, logger) { _contentTypeRepository = contentTypeRepository ?? throw new ArgumentNullException(nameof(contentTypeRepository)); _templateRepository = templateRepository ?? throw new ArgumentNullException(nameof(templateRepository)); _tagRepository = tagRepository ?? throw new ArgumentNullException(nameof(tagRepository)); _cacheHelper = cacheHelper; - _contentByGuidReadRepository = new ContentByGuidReadRepository(this, scopeProvider, cacheHelper, logger); + _scopeAccessor = scopeAccessor; + _contentByGuidReadRepository = new ContentByGuidReadRepository(this, scopeAccessor, cacheHelper, logger); EnsureUniqueNaming = settings.EnsureUniqueNaming; } @@ -48,7 +48,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement // note: is ok to 'new' the repo here as it's a sub-repo really private PermissionRepository PermissionRepository => _permissionRepository - ?? (_permissionRepository = new PermissionRepository(_scopeProvider, _cacheHelper, Logger)); + ?? (_permissionRepository = new PermissionRepository(_scopeAccessor, _cacheHelper, Logger)); #region Repository Base @@ -664,8 +664,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement { private readonly DocumentRepository _outerRepo; - public ContentByGuidReadRepository(DocumentRepository outerRepo, ScopeProvider scopeProvider, CacheHelper cache, ILogger logger) - : base(scopeProvider, cache, logger) + public ContentByGuidReadRepository(DocumentRepository outerRepo, IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger) + : base(scopeAccessor, cache, logger) { _outerRepo = outerRepo; } diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/DocumentTypeContainerRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/DocumentTypeContainerRepository.cs index 83c606aaf1..de8042cfcf 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/DocumentTypeContainerRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/DocumentTypeContainerRepository.cs @@ -6,8 +6,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement { class DocumentTypeContainerRepository : EntityContainerRepository, IDocumentTypeContainerRepository { - public DocumentTypeContainerRepository(ScopeProvider scopeProvider, CacheHelper cache, ILogger logger) - : base(scopeProvider, cache, logger, Constants.ObjectTypes.DocumentTypeContainer) + public DocumentTypeContainerRepository(IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger) + : base(scopeAccessor, cache, logger, Constants.ObjectTypes.DocumentTypeContainer) { } } } diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/DomainRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/DomainRepository.cs index 7c490e6d03..24667cd8b9 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/DomainRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/DomainRepository.cs @@ -16,8 +16,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement internal class DomainRepository : NPocoRepositoryBase, IDomainRepository { - public DomainRepository(ScopeProvider scopeProvider, CacheHelper cache, ILogger logger) - : base(scopeProvider, cache, logger) + public DomainRepository(IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger) + : base(scopeAccessor, cache, logger) { } protected override IRepositoryCachePolicy CreateCachePolicy(IRuntimeCacheProvider runtimeCache) diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/EntityContainerRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/EntityContainerRepository.cs index b627857b8a..569e3310a1 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/EntityContainerRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/EntityContainerRepository.cs @@ -8,7 +8,6 @@ using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Persistence.Querying; -using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.Scoping; namespace Umbraco.Core.Persistence.Repositories.Implement @@ -16,12 +15,12 @@ namespace Umbraco.Core.Persistence.Repositories.Implement /// /// An internal repository for managing entity containers such as doc type, media type, data type containers. /// - internal class EntityContainerRepository : NPocoRepositoryBase + internal class EntityContainerRepository : NPocoRepositoryBase, IEntityContainerRepository { private readonly Guid _containerObjectType; - public EntityContainerRepository(ScopeProvider scopeProvider, CacheHelper cache, ILogger logger, Guid containerObjectType) - : base(scopeProvider, cache, logger) + public EntityContainerRepository(IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger, Guid containerObjectType) + : base(scopeAccessor, cache, logger) { var allowedContainers = new[] { Constants.ObjectTypes.DocumentTypeContainer, Constants.ObjectTypes.MediaTypeContainer, Constants.ObjectTypes.DataTypeContainer }; _containerObjectType = containerObjectType; diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/EntityRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/EntityRepository.cs index f9cab92a44..dce8350e57 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/EntityRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/EntityRepository.cs @@ -7,7 +7,7 @@ using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Persistence.DatabaseModelDefinitions; using Umbraco.Core.Persistence.Querying; -using Umbraco.Core.Persistence.UnitOfWork; +using Umbraco.Core.Scoping; namespace Umbraco.Core.Persistence.Repositories.Implement { @@ -21,14 +21,14 @@ namespace Umbraco.Core.Persistence.Repositories.Implement /// internal class EntityRepository : IEntityRepository { - public EntityRepository(IScopeUnitOfWork work) + private readonly IScopeAccessor _scopeAccessor; + public EntityRepository(IScopeAccessor scopeAccessor) { - UnitOfWork = work; + _scopeAccessor = scopeAccessor; } - protected IScopeUnitOfWork UnitOfWork { get; } - protected IUmbracoDatabase Database => UnitOfWork.Database; - protected Sql Sql() => UnitOfWork.SqlContext.Sql(); + protected IUmbracoDatabase Database => _scopeAccessor.AmbientScope.Database; + protected Sql Sql() => _scopeAccessor.AmbientScope.SqlContext.Sql(); #region Repository diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/ExternalLoginRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/ExternalLoginRepository.cs index 8fc2ad2fc5..0fc24a1029 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/ExternalLoginRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/ExternalLoginRepository.cs @@ -10,15 +10,14 @@ using Umbraco.Core.Models.Identity; using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Persistence.Factories; using Umbraco.Core.Persistence.Querying; -using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.Scoping; namespace Umbraco.Core.Persistence.Repositories.Implement { internal class ExternalLoginRepository : NPocoRepositoryBase, IExternalLoginRepository { - public ExternalLoginRepository(ScopeProvider scopeProvider, CacheHelper cache, ILogger logger) - : base(scopeProvider, cache, logger) + public ExternalLoginRepository(IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger) + : base(scopeAccessor, cache, logger) { } public void DeleteUserLogins(int memberId) diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/FileRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/FileRepository.cs index 80481ddeb5..e97ac8aa05 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/FileRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/FileRepository.cs @@ -4,24 +4,18 @@ using System.Text; using Umbraco.Core.IO; using Umbraco.Core.Models; using Umbraco.Core.Models.EntityBase; -using Umbraco.Core.Persistence.UnitOfWork; +using Umbraco.Core.Scoping; namespace Umbraco.Core.Persistence.Repositories.Implement { - internal abstract class FileRepository : DisposableObject, IUnitOfWorkRepository, IReadRepository, IWriteRepository + internal abstract class FileRepository : IReadRepository, IWriteRepository where TEntity : IFile { - protected FileRepository(IUnitOfWork work, IFileSystem fileSystem) + protected FileRepository(IFileSystem fileSystem) { - UnitOfWork = work; FileSystem = fileSystem; } - /// - /// Returns the Unit of Work added to the repository - /// - protected IUnitOfWork UnitOfWork { get; } - protected IFileSystem FileSystem { get; } public virtual void AddFolder(string folderPath) @@ -226,17 +220,5 @@ namespace Umbraco.Core.Persistence.Repositories.Implement return -1; // deal with race conds } } - - /// - /// Dispose any disposable properties - /// - /// - /// Dispose the unit of work - /// - protected override void DisposeResources() - { - // fixme - wtf in v8? - UnitOfWork.DisposeIfDisposable(); - } } } diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/LanguageRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/LanguageRepository.cs index 9af4cb1de5..9bd2f175a9 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/LanguageRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/LanguageRepository.cs @@ -9,7 +9,6 @@ using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Persistence.Factories; using Umbraco.Core.Persistence.Querying; -using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.Scoping; namespace Umbraco.Core.Persistence.Repositories.Implement @@ -19,8 +18,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement /// internal class LanguageRepository : NPocoRepositoryBase, ILanguageRepository { - public LanguageRepository(ScopeProvider scopeProvider, CacheHelper cache, ILogger logger) - : base(scopeProvider, cache, logger) + public LanguageRepository(IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger) + : base(scopeAccessor, cache, logger) { } protected override IRepositoryCachePolicy CreateCachePolicy(IRuntimeCacheProvider runtimeCache) diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/MacroRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/MacroRepository.cs index 44d15947b4..c377844c8c 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/MacroRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/MacroRepository.cs @@ -15,8 +15,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement { internal class MacroRepository : NPocoRepositoryBase, IMacroRepository { - public MacroRepository(ScopeProvider scopeProvider, CacheHelper cache, ILogger logger) - : base(scopeProvider, cache, logger) + public MacroRepository(IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger) + : base(scopeAccessor, cache, logger) { } protected override IMacro PerformGet(int id) diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/MediaRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/MediaRepository.cs index fe2a4e80e3..6e8b77fd5c 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/MediaRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/MediaRepository.cs @@ -12,7 +12,6 @@ using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Persistence.DatabaseModelDefinitions; using Umbraco.Core.Persistence.Factories; using Umbraco.Core.Persistence.Querying; -using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.Scoping; namespace Umbraco.Core.Persistence.Repositories.Implement @@ -26,12 +25,12 @@ namespace Umbraco.Core.Persistence.Repositories.Implement private readonly ITagRepository _tagRepository; private readonly MediaByGuidReadRepository _mediaByGuidReadRepository; - public MediaRepository(ScopeProvider scopeProvider, CacheHelper cache, ILogger logger, IMediaTypeRepository mediaTypeRepository, ITagRepository tagRepository, IContentSection contentSection) - : base(scopeProvider, cache, logger) + public MediaRepository(IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger, IMediaTypeRepository mediaTypeRepository, ITagRepository tagRepository, IContentSection contentSection) + : base(scopeAccessor, cache, logger) { _mediaTypeRepository = mediaTypeRepository ?? throw new ArgumentNullException(nameof(mediaTypeRepository)); _tagRepository = tagRepository ?? throw new ArgumentNullException(nameof(tagRepository)); - _mediaByGuidReadRepository = new MediaByGuidReadRepository(this, scopeProvider, cache, logger); + _mediaByGuidReadRepository = new MediaByGuidReadRepository(this, scopeAccessor, cache, logger); EnsureUniqueNaming = contentSection.EnsureUniqueNaming; } @@ -403,8 +402,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement { private readonly MediaRepository _outerRepo; - public MediaByGuidReadRepository(MediaRepository outerRepo, ScopeProvider scopeProvider, CacheHelper cache, ILogger logger) - : base(scopeProvider, cache, logger) + public MediaByGuidReadRepository(MediaRepository outerRepo, IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger) + : base(scopeAccessor, cache, logger) { _outerRepo = outerRepo; } diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/MediaTypeContainerRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/MediaTypeContainerRepository.cs index ddb189b1d5..318d3a9c5a 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/MediaTypeContainerRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/MediaTypeContainerRepository.cs @@ -6,8 +6,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement { class MediaTypeContainerRepository : EntityContainerRepository, IMediaTypeContainerRepository { - public MediaTypeContainerRepository(ScopeProvider scopeProvider, CacheHelper cache, ILogger logger) - : base(scopeProvider, cache, logger, Constants.ObjectTypes.MediaTypeContainer) + public MediaTypeContainerRepository(IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger) + : base(scopeAccessor, cache, logger, Constants.ObjectTypes.MediaTypeContainer) { } } } diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/MediaTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/MediaTypeRepository.cs index a9c810b414..12cb6010fd 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/MediaTypeRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/MediaTypeRepository.cs @@ -7,7 +7,6 @@ using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Persistence.Querying; -using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.Scoping; namespace Umbraco.Core.Persistence.Repositories.Implement @@ -17,8 +16,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement /// internal class MediaTypeRepository : ContentTypeRepositoryBase, IMediaTypeRepository { - public MediaTypeRepository(ScopeProvider scopeProvider, CacheHelper cache, ILogger logger) - : base(scopeProvider, cache, logger) + public MediaTypeRepository(IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger) + : base(scopeAccessor, cache, logger) { } protected override bool IsPublishing => MediaType.IsPublishingConst; diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/MemberGroupRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/MemberGroupRepository.cs index 28c88d0352..a697b92dd7 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/MemberGroupRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/MemberGroupRepository.cs @@ -15,8 +15,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement { internal class MemberGroupRepository : NPocoRepositoryBase, IMemberGroupRepository { - public MemberGroupRepository(ScopeProvider scopeProvider, CacheHelper cache, ILogger logger) - : base(scopeProvider, cache, logger) + public MemberGroupRepository(IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger) + : base(scopeAccessor, cache, logger) { } private readonly MemberGroupFactory _modelFactory = new MemberGroupFactory(); diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/MemberRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/MemberRepository.cs index 40b76d05c5..d3a4d58c0d 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/MemberRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/MemberRepository.cs @@ -10,7 +10,6 @@ using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Persistence.DatabaseModelDefinitions; using Umbraco.Core.Persistence.Factories; using Umbraco.Core.Persistence.Querying; -using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.Scoping; namespace Umbraco.Core.Persistence.Repositories.Implement @@ -24,8 +23,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement private readonly ITagRepository _tagRepository; private readonly IMemberGroupRepository _memberGroupRepository; - public MemberRepository(ScopeProvider scopeProvider, CacheHelper cache, ILogger logger, IMemberTypeRepository memberTypeRepository, IMemberGroupRepository memberGroupRepository, ITagRepository tagRepository) - : base(scopeProvider, cache, logger) + public MemberRepository(IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger, IMemberTypeRepository memberTypeRepository, IMemberGroupRepository memberGroupRepository, ITagRepository tagRepository) + : base(scopeAccessor, cache, logger) { _memberTypeRepository = memberTypeRepository ?? throw new ArgumentNullException(nameof(memberTypeRepository)); _tagRepository = tagRepository ?? throw new ArgumentNullException(nameof(tagRepository)); diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/MemberTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/MemberTypeRepository.cs index 5b3c047396..16d1843952 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/MemberTypeRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/MemberTypeRepository.cs @@ -17,8 +17,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement /// internal class MemberTypeRepository : ContentTypeRepositoryBase, IMemberTypeRepository { - public MemberTypeRepository(ScopeProvider scopeProvider, CacheHelper cache, ILogger logger) - : base(scopeProvider, cache, logger) + public MemberTypeRepository(IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger) + : base(scopeAccessor, cache, logger) { } protected override bool IsPublishing => MemberType.IsPublishingConst; diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/MigrationEntryRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/MigrationEntryRepository.cs index 0eb693c962..886bb85216 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/MigrationEntryRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/MigrationEntryRepository.cs @@ -17,8 +17,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement { internal class MigrationEntryRepository : NPocoRepositoryBase, IMigrationEntryRepository { - public MigrationEntryRepository(ScopeProvider scopeProvider, [Inject(RepositoryCompositionRoot.DisabledCache)] CacheHelper cache, ILogger logger) - : base(scopeProvider, cache, logger) + public MigrationEntryRepository(IScopeAccessor scopeAccessor, [Inject(RepositoryCompositionRoot.DisabledCache)] CacheHelper cache, ILogger logger) + : base(scopeAccessor, cache, logger) { } protected override IMigrationEntry PerformGet(int id) diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/NPocoRepositoryBase.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/NPocoRepositoryBase.cs index 207f3de0f4..c5cb65a9b6 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/NPocoRepositoryBase.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/NPocoRepositoryBase.cs @@ -6,7 +6,6 @@ using Umbraco.Core.Logging; using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Persistence.SqlSyntax; -using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.Scoping; namespace Umbraco.Core.Persistence.Repositories.Implement @@ -22,8 +21,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement /// /// Initializes a new instance of the class. /// - protected NPocoRepositoryBase(ScopeProvider scopeProvider, CacheHelper cache, ILogger logger) - : base(scopeProvider, cache, logger) + protected NPocoRepositoryBase(IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger) + : base(scopeAccessor, cache, logger) { } /// diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/NotificationsRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/NotificationsRepository.cs index e8b8c0fa20..b18b655038 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/NotificationsRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/NotificationsRepository.cs @@ -5,23 +5,25 @@ using Umbraco.Core.Models; using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Models.Membership; using Umbraco.Core.Models.Rdbms; -using Umbraco.Core.Persistence.UnitOfWork; +using Umbraco.Core.Scoping; namespace Umbraco.Core.Persistence.Repositories.Implement { - public class NotificationsRepository : DisposableObject, INotificationsRepository + public class NotificationsRepository : INotificationsRepository { - private readonly IScopeUnitOfWork _unitOfWork; + private readonly IScopeAccessor _scopeAccessor; - public NotificationsRepository(IScopeUnitOfWork unitOfWork) + public NotificationsRepository(IScopeAccessor scopeAccessor) { - _unitOfWork = unitOfWork; + _scopeAccessor = scopeAccessor; } + private IScope AmbientScope => _scopeAccessor.AmbientScope; + public IEnumerable GetUsersNotifications(IEnumerable userIds, string action, IEnumerable nodeIds, Guid objectType) { var nodeIdsA = nodeIds.ToArray(); - var sql = _unitOfWork.SqlContext.Sql() + var sql = AmbientScope.SqlContext.Sql() .Select("DISTINCT umbracoNode.id nodeId, umbracoUser.id userId, umbracoNode.nodeObjectType, umbracoUser2NodeNotify.action") .From() .InnerJoin().On(left => left.NodeId, right => right.NodeId) @@ -35,12 +37,12 @@ namespace Umbraco.Core.Persistence.Repositories.Implement sql .OrderBy(x => x.Id) .OrderBy(dto => dto.NodeId); - return _unitOfWork.Database.Fetch(sql).Select(x => new Notification(x.nodeId, x.userId, x.action, objectType)); + return AmbientScope.Database.Fetch(sql).Select(x => new Notification(x.nodeId, x.userId, x.action, objectType)); } public IEnumerable GetUserNotifications(IUser user) { - var sql = _unitOfWork.SqlContext.Sql() + var sql = AmbientScope.SqlContext.Sql() .Select("DISTINCT umbracoNode.id, umbracoUser2NodeNotify.userId, umbracoNode.nodeObjectType, umbracoUser2NodeNotify.action") .From() .InnerJoin() @@ -48,7 +50,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement .Where(dto => dto.UserId == (int)user.Id) .OrderBy(dto => dto.NodeId); - var dtos = _unitOfWork.Database.Fetch(sql); + var dtos = AmbientScope.Database.Fetch(sql); //need to map the results return dtos.Select(d => new Notification(d.id, d.userId, d.action, d.nodeObjectType)).ToList(); } @@ -61,7 +63,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement public IEnumerable GetEntityNotifications(IEntity entity) { - var sql = _unitOfWork.SqlContext.Sql() + var sql = AmbientScope.SqlContext.Sql() .Select("DISTINCT umbracoNode.id, umbracoUser2NodeNotify.userId, umbracoNode.nodeObjectType, umbracoUser2NodeNotify.action") .From() .InnerJoin() @@ -69,34 +71,34 @@ namespace Umbraco.Core.Persistence.Repositories.Implement .Where(dto => dto.NodeId == entity.Id) .OrderBy(dto => dto.NodeId); - var dtos = _unitOfWork.Database.Fetch(sql); + var dtos = AmbientScope.Database.Fetch(sql); //need to map the results return dtos.Select(d => new Notification(d.id, d.userId, d.action, d.nodeObjectType)).ToList(); } public int DeleteNotifications(IEntity entity) { - return _unitOfWork.Database.Delete("WHERE nodeId = @nodeId", new { nodeId = entity.Id }); + return AmbientScope.Database.Delete("WHERE nodeId = @nodeId", new { nodeId = entity.Id }); } public int DeleteNotifications(IUser user) { - return _unitOfWork.Database.Delete("WHERE userId = @userId", new { userId = user.Id }); + return AmbientScope.Database.Delete("WHERE userId = @userId", new { userId = user.Id }); } public int DeleteNotifications(IUser user, IEntity entity) { // delete all settings on the node for this user - return _unitOfWork.Database.Delete("WHERE userId = @userId AND nodeId = @nodeId", new { userId = user.Id, nodeId = entity.Id }); + return AmbientScope.Database.Delete("WHERE userId = @userId AND nodeId = @nodeId", new { userId = user.Id, nodeId = entity.Id }); } public Notification CreateNotification(IUser user, IEntity entity, string action) { - var sql = _unitOfWork.SqlContext.Sql() + var sql = AmbientScope.SqlContext.Sql() .Select("DISTINCT nodeObjectType") .From() .Where(nodeDto => nodeDto.NodeId == entity.Id); - var nodeType = _unitOfWork.Database.ExecuteScalar(sql); + var nodeType = AmbientScope.Database.ExecuteScalar(sql); var dto = new User2NodeNotifyDto { @@ -104,11 +106,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement NodeId = entity.Id, UserId = user.Id }; - _unitOfWork.Database.Insert(dto); + AmbientScope.Database.Insert(dto); return new Notification(dto.NodeId, dto.UserId, dto.Action, nodeType); } - - protected override void DisposeResources() - { } } } diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/PartialViewMacroRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/PartialViewMacroRepository.cs index 944f1fd38a..741bb98e7c 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/PartialViewMacroRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/PartialViewMacroRepository.cs @@ -1,15 +1,14 @@ using LightInject; using Umbraco.Core.IO; using Umbraco.Core.Models; -using Umbraco.Core.Persistence.UnitOfWork; namespace Umbraco.Core.Persistence.Repositories.Implement { internal class PartialViewMacroRepository : PartialViewRepository, IPartialViewMacroRepository { - public PartialViewMacroRepository(IUnitOfWork work, [Inject("PartialViewMacroFileSystem")] IFileSystem fileSystem) - : base(work, fileSystem) + public PartialViewMacroRepository([Inject("PartialViewMacroFileSystem")] IFileSystem fileSystem) + : base(fileSystem) { } protected override PartialViewType ViewType => PartialViewType.PartialViewMacro; diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/PartialViewRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/PartialViewRepository.cs index b086351fff..2aa63813e5 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/PartialViewRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/PartialViewRepository.cs @@ -5,13 +5,13 @@ using System.Text; using LightInject; using Umbraco.Core.IO; using Umbraco.Core.Models; -using Umbraco.Core.Persistence.UnitOfWork; namespace Umbraco.Core.Persistence.Repositories.Implement { internal class PartialViewRepository : FileRepository, IPartialViewRepository { - public PartialViewRepository(IUnitOfWork work, [Inject("PartialViewFileSystem")] IFileSystem fileSystem) : base(work, fileSystem) + public PartialViewRepository([Inject("PartialViewFileSystem")] IFileSystem fileSystem) + : base(fileSystem) { } protected virtual PartialViewType ViewType => PartialViewType.PartialView; diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/PermissionRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/PermissionRepository.cs index d23255f956..25717caa1a 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/PermissionRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/PermissionRepository.cs @@ -10,7 +10,6 @@ using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Models.Membership; using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Persistence.Querying; -using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.Scoping; namespace Umbraco.Core.Persistence.Repositories.Implement @@ -26,8 +25,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement internal class PermissionRepository : NPocoRepositoryBase where TEntity : class, IAggregateRoot { - public PermissionRepository(ScopeProvider scopeProvider, CacheHelper cache, ILogger logger) - : base(scopeProvider, cache, logger) + public PermissionRepository(IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger) + : base(scopeAccessor, cache, logger) { } /// diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/PublicAccessRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/PublicAccessRepository.cs index 7d09b2f829..dc0e93733b 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/PublicAccessRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/PublicAccessRepository.cs @@ -14,8 +14,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement { internal class PublicAccessRepository : NPocoRepositoryBase, IPublicAccessRepository { - public PublicAccessRepository(ScopeProvider scopeProvider, CacheHelper cache, ILogger logger) - : base(scopeProvider, cache, logger) + public PublicAccessRepository(IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger) + : base(scopeAccessor, cache, logger) { } protected override IRepositoryCachePolicy CreateCachePolicy(IRuntimeCacheProvider runtimeCache) diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/RedirectUrlRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/RedirectUrlRepository.cs index 6093085c42..c8f17f5c55 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/RedirectUrlRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/RedirectUrlRepository.cs @@ -13,8 +13,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement { internal class RedirectUrlRepository : NPocoRepositoryBase, IRedirectUrlRepository { - public RedirectUrlRepository(ScopeProvider scopeProvider, CacheHelper cache, ILogger logger) - : base(scopeProvider, cache, logger) + public RedirectUrlRepository(IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger) + : base(scopeAccessor, cache, logger) { } protected override int PerformCount(IQuery query) diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/RelationRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/RelationRepository.cs index c8a6f14b66..365fa3b1ef 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/RelationRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/RelationRepository.cs @@ -11,7 +11,6 @@ using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Persistence.Factories; using Umbraco.Core.Persistence.Querying; -using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.Scoping; namespace Umbraco.Core.Persistence.Repositories.Implement @@ -23,8 +22,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement { private readonly IRelationTypeRepository _relationTypeRepository; - public RelationRepository(ScopeProvider scopeProvider, [Inject(RepositoryCompositionRoot.DisabledCache)] CacheHelper cache, ILogger logger, IRelationTypeRepository relationTypeRepository) - : base(scopeProvider, cache, logger) + public RelationRepository(IScopeAccessor scopeAccessor, [Inject(RepositoryCompositionRoot.DisabledCache)] CacheHelper cache, ILogger logger, IRelationTypeRepository relationTypeRepository) + : base(scopeAccessor, cache, logger) { _relationTypeRepository = relationTypeRepository; } diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/RelationTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/RelationTypeRepository.cs index 2724303f3c..8fe3e3819a 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/RelationTypeRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/RelationTypeRepository.cs @@ -18,8 +18,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement /// internal class RelationTypeRepository : NPocoRepositoryBase, IRelationTypeRepository { - public RelationTypeRepository(ScopeProvider scopeProvider, CacheHelper cache, ILogger logger) - : base(scopeProvider, cache, logger) + public RelationTypeRepository(IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger) + : base(scopeAccessor, cache, logger) { } protected override IRepositoryCachePolicy CreateCachePolicy(IRuntimeCacheProvider runtimeCache) diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/RepositoryBaseOfTIdTEntity.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/RepositoryBaseOfTIdTEntity.cs index f2ac006f42..e5bdd99ec4 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/RepositoryBaseOfTIdTEntity.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/RepositoryBaseOfTIdTEntity.cs @@ -20,9 +20,9 @@ namespace Umbraco.Core.Persistence.Repositories.Implement private IRepositoryCachePolicy _cachePolicy; private IRuntimeCacheProvider _isolatedCache; - protected RepositoryBase(ScopeProvider scopeProvider, CacheHelper cache, ILogger logger) + protected RepositoryBase(IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger) { - ScopeProvider = scopeProvider ?? throw new ArgumentNullException(nameof(scopeProvider)); + ScopeAccessor = scopeAccessor ?? throw new ArgumentNullException(nameof(scopeAccessor)); Logger = logger ?? throw new ArgumentNullException(nameof(logger)); GlobalCache = cache ?? throw new ArgumentNullException(nameof(cache)); } @@ -31,13 +31,13 @@ namespace Umbraco.Core.Persistence.Repositories.Implement protected CacheHelper GlobalCache { get; } - protected ScopeProvider ScopeProvider { get; } + protected IScopeAccessor ScopeAccessor { get; } protected IScope AmbientScope { get { - var scope = ScopeProvider.AmbientScope; + var scope = ScopeAccessor.AmbientScope; if (scope == null) throw new InvalidOperationException("Cannot run a repository without an ambient scope."); return scope; diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/ScriptRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/ScriptRepository.cs index d2a1debb76..d5719554c9 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/ScriptRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/ScriptRepository.cs @@ -6,7 +6,6 @@ using LightInject; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.IO; using Umbraco.Core.Models; -using Umbraco.Core.Persistence.UnitOfWork; namespace Umbraco.Core.Persistence.Repositories.Implement { @@ -17,11 +16,10 @@ namespace Umbraco.Core.Persistence.Repositories.Implement { private readonly IContentSection _contentConfig; - public ScriptRepository(IUnitOfWork work, [Inject("ScriptFileSystem")] IFileSystem fileSystem, IContentSection contentConfig) - : base(work, fileSystem) + public ScriptRepository([Inject("ScriptFileSystem")] IFileSystem fileSystem, IContentSection contentConfig) + : base(fileSystem) { - if (contentConfig == null) throw new ArgumentNullException(nameof(contentConfig)); - _contentConfig = contentConfig; + _contentConfig = contentConfig ?? throw new ArgumentNullException(nameof(contentConfig)); } #region Implementation of IRepository diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/ServerRegistrationRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/ServerRegistrationRepository.cs index 232f8cd414..a32b756429 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/ServerRegistrationRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/ServerRegistrationRepository.cs @@ -15,8 +15,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement internal class ServerRegistrationRepository : NPocoRepositoryBase, IServerRegistrationRepository { // fixme - should we use NoCache instead of CreateDisabledCacheHelper?! - public ServerRegistrationRepository(ScopeProvider scopeProvider, ILogger logger) - : base(scopeProvider, CacheHelper.CreateDisabledCacheHelper(), logger) + public ServerRegistrationRepository(IScopeAccessor scopeAccessor, ILogger logger) + : base(scopeAccessor, CacheHelper.CreateDisabledCacheHelper(), logger) { } protected override IRepositoryCachePolicy CreateCachePolicy(IRuntimeCacheProvider runtimeCache) diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/SimpleGetRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/SimpleGetRepository.cs index 0e42daea96..d4ab97030a 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/SimpleGetRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/SimpleGetRepository.cs @@ -18,8 +18,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement where TEntity : class, IAggregateRoot where TDto: class { - protected SimpleGetRepository(ScopeProvider scopeProvider, CacheHelper cache, ILogger logger) - : base(scopeProvider, cache, logger) + protected SimpleGetRepository(IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger) + : base(scopeAccessor, cache, logger) { } protected abstract TEntity ConvertToEntity(TDto dto); diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/StylesheetRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/StylesheetRepository.cs index 3ef7d7f245..8a0333a965 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/StylesheetRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/StylesheetRepository.cs @@ -4,7 +4,6 @@ using System.Linq; using LightInject; using Umbraco.Core.IO; using Umbraco.Core.Models; -using Umbraco.Core.Persistence.UnitOfWork; namespace Umbraco.Core.Persistence.Repositories.Implement { @@ -13,8 +12,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement /// internal class StylesheetRepository : FileRepository, IStylesheetRepository { - public StylesheetRepository(IUnitOfWork work, [Inject("StylesheetFileSystem")] IFileSystem fileSystem) - : base(work, fileSystem) + public StylesheetRepository([Inject("StylesheetFileSystem")] IFileSystem fileSystem) + : base(fileSystem) { } #region Overrides of FileRepository diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/TagRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/TagRepository.cs index 5dd64cdd46..c7b6a67e4e 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/TagRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/TagRepository.cs @@ -15,10 +15,9 @@ namespace Umbraco.Core.Persistence.Repositories.Implement { internal class TagRepository : NPocoRepositoryBase, ITagRepository { - public TagRepository(ScopeProvider scopeProvider, CacheHelper cache, ILogger logger) - : base(scopeProvider, cache, logger) - { - } + public TagRepository(IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger) + : base(scopeAccessor, cache, logger) + { } protected override ITag PerformGet(int id) { diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/TaskRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/TaskRepository.cs index 96546d1b03..2bffd054c0 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/TaskRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/TaskRepository.cs @@ -17,8 +17,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement { internal class TaskRepository : NPocoRepositoryBase, ITaskRepository { - public TaskRepository(ScopeProvider scopeProvider, [Inject(RepositoryCompositionRoot.DisabledCache)] CacheHelper cache, ILogger logger) - : base(scopeProvider, cache, logger) + public TaskRepository(IScopeAccessor scopeAccessor, [Inject(RepositoryCompositionRoot.DisabledCache)] CacheHelper cache, ILogger logger) + : base(scopeAccessor, cache, logger) { } protected override Task PerformGet(int id) diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/TaskTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/TaskTypeRepository.cs index f8539d2257..61ec59f71e 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/TaskTypeRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/TaskTypeRepository.cs @@ -16,8 +16,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement { internal class TaskTypeRepository : NPocoRepositoryBase, ITaskTypeRepository { - public TaskTypeRepository(ScopeProvider scopeProvider, [Inject(RepositoryCompositionRoot.DisabledCache)] CacheHelper cache, ILogger logger) - : base(scopeProvider, cache, logger) + public TaskTypeRepository(IScopeAccessor scopeAccessor, [Inject(RepositoryCompositionRoot.DisabledCache)] CacheHelper cache, ILogger logger) + : base(scopeAccessor, cache, logger) { } protected override TaskType PerformGet(int id) diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/TemplateRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/TemplateRepository.cs index 23faa72d68..acfcd903e2 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/TemplateRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/TemplateRepository.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; +using LightInject; using NPoco; using Umbraco.Core.Cache; using Umbraco.Core.Configuration.UmbracoSettings; @@ -29,8 +30,10 @@ namespace Umbraco.Core.Persistence.Repositories.Implement private readonly ViewHelper _viewHelper; private readonly MasterPageHelper _masterPageHelper; - public TemplateRepository(ScopeProvider scopeProvider, CacheHelper cache, ILogger logger, IFileSystem masterpageFileSystem, IFileSystem viewFileSystem, ITemplatesSection templateConfig) - : base(scopeProvider, cache, logger) + public TemplateRepository(IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger, ITemplatesSection templateConfig, + [Inject(Constants.Composing.FileSystems.MasterpageFileSystem)] IFileSystem masterpageFileSystem, + [Inject(Constants.Composing.FileSystems.ViewFileSystem)] IFileSystem viewFileSystem) + : base(scopeAccessor, cache, logger) { _masterpagesFileSystem = masterpageFileSystem; _viewsFileSystem = viewFileSystem; diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/UserGroupRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/UserGroupRepository.cs index 0df01f6a6e..23ed88b187 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/UserGroupRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/UserGroupRepository.cs @@ -11,7 +11,6 @@ using Umbraco.Core.Models.Membership; using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Persistence.Factories; using Umbraco.Core.Persistence.Querying; -using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.Scoping; namespace Umbraco.Core.Persistence.Repositories.Implement @@ -24,11 +23,11 @@ namespace Umbraco.Core.Persistence.Repositories.Implement private readonly UserGroupWithUsersRepository _userGroupWithUsersRepository; private readonly PermissionRepository _permissionRepository; - public UserGroupRepository(ScopeProvider scopeProvider, CacheHelper cacheHelper, ILogger logger) - : base(scopeProvider, cacheHelper, logger) + public UserGroupRepository(IScopeAccessor scopeAccessor, CacheHelper cacheHelper, ILogger logger) + : base(scopeAccessor, cacheHelper, logger) { - _userGroupWithUsersRepository = new UserGroupWithUsersRepository(this, scopeProvider, cacheHelper, logger); - _permissionRepository = new PermissionRepository(scopeProvider, cacheHelper, logger); + _userGroupWithUsersRepository = new UserGroupWithUsersRepository(this, scopeAccessor, cacheHelper, logger); + _permissionRepository = new PermissionRepository(scopeAccessor, cacheHelper, logger); } public const string GetByAliasCacheKeyPrefix = "UserGroupRepository_GetByAlias_"; @@ -361,8 +360,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement { private readonly UserGroupRepository _userGroupRepo; - public UserGroupWithUsersRepository(UserGroupRepository userGroupRepo, ScopeProvider scopeProvider, CacheHelper cache, ILogger logger) - : base(scopeProvider, cache, logger) + public UserGroupWithUsersRepository(UserGroupRepository userGroupRepo, IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger) + : base(scopeAccessor, cache, logger) { _userGroupRepo = userGroupRepo; } diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/UserRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/UserRepository.cs index bf862c44b5..9d076bdb94 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/UserRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/UserRepository.cs @@ -15,7 +15,6 @@ using Umbraco.Core.Persistence.DatabaseModelDefinitions; using Umbraco.Core.Persistence.Factories; using Umbraco.Core.Persistence.Mappers; using Umbraco.Core.Persistence.Querying; -using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.Scoping; using Umbraco.Core.Security; @@ -27,7 +26,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement internal class UserRepository : NPocoRepositoryBase, IUserRepository { private readonly IMapperCollection _mapperCollection; - private readonly IDictionary _passwordConfig; + private string _passwordConfigJson; + private bool _passwordConfigInitialized; /// /// Constructor @@ -38,23 +38,36 @@ namespace Umbraco.Core.Persistence.Repositories.Implement /// /// A dictionary specifying the configuration for user passwords. If this is null then no password configuration will be persisted or read. /// - public UserRepository(ScopeProvider scopeProvider, CacheHelper cacheHelper, ILogger logger, IMapperCollection mapperCollection) - : base(scopeProvider, cacheHelper, logger) + public UserRepository(IScopeAccessor scopeAccessor, CacheHelper cacheHelper, ILogger logger, IMapperCollection mapperCollection) + : base(scopeAccessor, cacheHelper, logger) { _mapperCollection = mapperCollection; - - var userMembershipProvider = MembershipProviderExtensions.GetUsersMembershipProvider(); - _passwordConfig = userMembershipProvider == null || userMembershipProvider.PasswordFormat != MembershipPasswordFormat.Hashed - ? null - : new Dictionary { { "hashAlgorithm", Membership.HashAlgorithmType } }; } // for tests - internal UserRepository(ScopeProvider scopeProvider, CacheHelper cacheHelper, ILogger logger, IMapperCollection mapperCollection, IDictionary passwordConfig) - : base(scopeProvider, cacheHelper, logger) + internal UserRepository(IScopeAccessor scopeAccessor, CacheHelper cacheHelper, ILogger logger, IMapperCollection mapperCollection, IDictionary passwordConfig) + : base(scopeAccessor, cacheHelper, logger) { _mapperCollection = mapperCollection; - _passwordConfig = passwordConfig; + _passwordConfigJson = JsonConvert.SerializeObject(passwordConfig); + _passwordConfigInitialized = true; + } + + private string PasswordConfigJson + { + get + { + if (_passwordConfigInitialized) + return _passwordConfigJson; + + var userMembershipProvider = MembershipProviderExtensions.GetUsersMembershipProvider(); + var passwordConfig = userMembershipProvider == null || userMembershipProvider.PasswordFormat != MembershipPasswordFormat.Hashed + ? null + : new Dictionary { { "hashAlgorithm", Membership.HashAlgorithmType } }; + _passwordConfigJson = passwordConfig == null ? null : JsonConvert.SerializeObject(passwordConfig); + _passwordConfigInitialized = true; + return _passwordConfigJson; + } } #region Overrides of RepositoryBase @@ -343,11 +356,8 @@ ORDER BY colName"; // check if we have a known config, we only want to store config for hashing //TODO: This logic will need to be updated when we do http://issues.umbraco.org/issue/U4-10089 - if (_passwordConfig != null && _passwordConfig.Count > 0) - { - var json = JsonConvert.SerializeObject(_passwordConfig); - userDto.PasswordConfig = json; - } + if (PasswordConfigJson != null) + userDto.PasswordConfig = PasswordConfigJson; var id = Convert.ToInt32(Database.Insert(userDto)); entity.Id = id; @@ -440,11 +450,9 @@ ORDER BY colName"; // check if we have a known config, we only want to store config for hashing //TODO: This logic will need to be updated when we do http://issues.umbraco.org/issue/U4-10089 - if (_passwordConfig != null && _passwordConfig.Count > 0) + if (PasswordConfigJson != null) { - var json = JsonConvert.SerializeObject(_passwordConfig); - userDto.PasswordConfig = json; - + userDto.PasswordConfig = PasswordConfigJson; changedCols.Add("passwordConfig"); } } diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/XsltFileRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/XsltFileRepository.cs index cd03e9272d..75d92eabf6 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/XsltFileRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/XsltFileRepository.cs @@ -1,9 +1,9 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using LightInject; using Umbraco.Core.IO; using Umbraco.Core.Models; -using Umbraco.Core.Persistence.UnitOfWork; namespace Umbraco.Core.Persistence.Repositories.Implement { @@ -12,10 +12,9 @@ namespace Umbraco.Core.Persistence.Repositories.Implement /// internal class XsltFileRepository : FileRepository, IXsltFileRepository { - public XsltFileRepository(IUnitOfWork work, IFileSystem fileSystem) - : base(work, fileSystem) - { - } + public XsltFileRepository([Inject("XsltFileSystem")] IFileSystem fileSystem) + : base(fileSystem) + { } public override XsltFile Get(string id) { diff --git a/src/Umbraco.Core/Persistence/RepositoryFactory.cs b/src/Umbraco.Core/Persistence/RepositoryFactory.cs deleted file mode 100644 index e3bb717d39..0000000000 --- a/src/Umbraco.Core/Persistence/RepositoryFactory.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using LightInject; -using Umbraco.Core.Persistence.Repositories; -using Umbraco.Core.Persistence.UnitOfWork; - -namespace Umbraco.Core.Persistence -{ - /// - /// Instanciates repositories. - /// - public class RepositoryFactory - { - private readonly IServiceContainer _container; - - /// - /// Initializes a new instance of the class with a container. - /// - /// A container. - public RepositoryFactory(IServiceContainer container) - { - _container = container ?? throw new ArgumentNullException(nameof(container)); - } - - /// - /// Creates a repository. - /// - /// The type of the repository. - /// A unit of work. - /// The created repository for the unit of work. - public virtual TRepository CreateRepository(IScopeUnitOfWork uow) - where TRepository : IRepository - { - return _container.GetInstance(uow); - } - } -} diff --git a/src/Umbraco.Core/Persistence/UnitOfWork/IScopeUnitOfWork.cs b/src/Umbraco.Core/Persistence/UnitOfWork/IScopeUnitOfWork.cs deleted file mode 100644 index 7e537c3093..0000000000 --- a/src/Umbraco.Core/Persistence/UnitOfWork/IScopeUnitOfWork.cs +++ /dev/null @@ -1,45 +0,0 @@ -using Umbraco.Core.Events; -using Umbraco.Core.Scoping; - -namespace Umbraco.Core.Persistence.UnitOfWork -{ - public interface IScopeUnitOfWork : IUnitOfWork - { - /// - /// Gets the scope. - /// - IScope Scope { get; } - - /// - /// Gets the event messages. - /// - EventMessages Messages { get; } - - /// - /// Gets the events dispatcher. - /// - IEventDispatcher Events { get; } - - /// - /// Gets the database. - /// - IUmbracoDatabase Database { get; } - - /// - /// Gets the Sql context. - /// - ISqlContext SqlContext { get; } - - /// - /// Read-locks some lock objects. - /// - /// The lock object identifiers. - void ReadLock(params int[] lockIds); - - /// - /// Write-locks some lock objects. - /// - /// The lock object identifiers. - void WriteLock(params int[] lockIds); - } -} diff --git a/src/Umbraco.Core/Persistence/UnitOfWork/IScopeUnitOfWorkProvider.cs b/src/Umbraco.Core/Persistence/UnitOfWork/IScopeUnitOfWorkProvider.cs deleted file mode 100644 index 32ca81b8d3..0000000000 --- a/src/Umbraco.Core/Persistence/UnitOfWork/IScopeUnitOfWorkProvider.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System.Data; -using Umbraco.Core.Scoping; - -namespace Umbraco.Core.Persistence.UnitOfWork -{ - /// - /// Provides scoped units of work. - /// - public interface IScopeUnitOfWorkProvider - { - /// - /// Gets the scope provider. - /// - IScopeProvider ScopeProvider { get; } - - /// - /// Gets the sql context. - /// - ISqlContext SqlContext { get; } - - /// - /// Creates a unit of work. - /// - /// An optional isolation level. - /// A value indicating whether the unit of work is read-only. - /// A value indicating whether the unit of work is immediate. - /// A new unit of work. - /// - /// A read-only unit of work does not need to be completed, and should not be used to write. - /// An immediate unit of work does not queue operations but executes them immediately. - /// - IScopeUnitOfWork CreateUnitOfWork(IsolationLevel isolationLevel = IsolationLevel.Unspecified, bool readOnly = false, bool immediate = false); - } -} diff --git a/src/Umbraco.Core/Persistence/UnitOfWork/IUnitOfWork.cs b/src/Umbraco.Core/Persistence/UnitOfWork/IUnitOfWork.cs deleted file mode 100644 index e72933ce90..0000000000 --- a/src/Umbraco.Core/Persistence/UnitOfWork/IUnitOfWork.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using Umbraco.Core.Models.EntityBase; -using Umbraco.Core.Persistence.Repositories; - -namespace Umbraco.Core.Persistence.UnitOfWork -{ - /// - /// Represents a persistence unit of work. - /// - public interface IUnitOfWork : IDisposable - { - // fixme - we should get rid of all references to database here, or merge IUnitOfWork with IDatabaseUnitOfWork - // fixme - do we have a scope.Begin()? or is it even automatic? and then do we need Begin() at all? - - /// - /// Begins the unit of work. - /// - /// When a unit of work begins, a local transaction scope is created at database level. - /// This is useful eg when reading entities before creating, updating or deleting, and the read - /// needs to be part of the transaction. Flushing or completing the unit of work automatically - /// begins the transaction (so no need to call Begin if not necessary). - void Begin(); - - /// - /// Flushes the unit of work. - /// - /// - /// When a unit of work is flushed, all queued operations are executed. This is useful eg - /// when a row needs to be created in the database, so that its auto-generated ID can be retrieved. - /// Note that it does *not* complete the unit of work, however. Completing the unit of work - /// automatically flushes the queue (so no need to call Flush if not necessary). - /// - void Flush(); - - /// - /// Completes the unit of work. - /// - /// When a unit of work is completed, a local transaction scope is created at database level, - /// all queued operations are executed, and the scope is commited. If the unit of work is not completed - /// before it is disposed, all queued operations are cleared and the scope is rolled back (and also - /// higher level transactions if any). - /// Whether this actually commits or rolls back the transaction depends on whether the transaction scope - /// is part of a higher level transactions. The database transaction is committed or rolled back only - /// when the upper level scope is disposed. - /// If any operation is added to the unit of work after it has been completed, then its completion - /// status is resetted. So in a way it could be possible to always complete and never flush, but flush - /// is preferred when appropriate to indicate that you understand what you are doing. - /// Every units of work should be completed, unless a rollback is required. That is, even if the unit of - /// work contains only read operations, that do not need to be "commited", the unit of work should be - /// properly completed, else it may force an unexpected rollback of a higher-level transaction. - /// - void Complete(); - - /// - /// Creates a repository. - /// - /// The type of the repository. - /// The created repository for the unit of work. - TRepository CreateRepository() - where TRepository : IRepository; - } -} diff --git a/src/Umbraco.Core/Persistence/UnitOfWork/IUnitOfWorkRepository.cs b/src/Umbraco.Core/Persistence/UnitOfWork/IUnitOfWorkRepository.cs deleted file mode 100644 index 1dda7efb94..0000000000 --- a/src/Umbraco.Core/Persistence/UnitOfWork/IUnitOfWorkRepository.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Umbraco.Core.Models.EntityBase; - -namespace Umbraco.Core.Persistence.UnitOfWork -{ - /// - /// Defines the Unit Of Work-part of a repository - /// - public interface IUnitOfWorkRepository - { - void PersistNewItem(IEntity entity); - void PersistUpdatedItem(IEntity entity); - void PersistDeletedItem(IEntity entity); - } -} diff --git a/src/Umbraco.Core/Persistence/UnitOfWork/ScopeUnitOfWork.cs b/src/Umbraco.Core/Persistence/UnitOfWork/ScopeUnitOfWork.cs deleted file mode 100644 index 7ec1ff49d5..0000000000 --- a/src/Umbraco.Core/Persistence/UnitOfWork/ScopeUnitOfWork.cs +++ /dev/null @@ -1,125 +0,0 @@ -using System; -using System.Data; -using Umbraco.Core.Events; -using Umbraco.Core.Scoping; - -namespace Umbraco.Core.Persistence.UnitOfWork -{ - /// - /// Represents a scoped unit of work. - /// - internal class ScopeUnitOfWork : UnitOfWorkBase, IScopeUnitOfWork - { - private readonly IsolationLevel _isolationLevel; - private readonly IScopeProvider _scopeProvider; - private bool _completeScope; - private IScope _scope; - private Guid _key; - - /// - /// Used for testing - /// - internal Guid InstanceId { get; } - - /// - /// Creates a new unit of work instance - /// - /// - /// - /// - /// - /// - /// - /// - /// This should normally not be used directly and should be created with the UnitOfWorkProvider - /// - internal ScopeUnitOfWork(IScopeProvider scopeProvider, ISqlContext sqlContext, RepositoryFactory repositoryFactory, IsolationLevel isolationLevel = IsolationLevel.Unspecified, bool readOnly = false, bool immediate = false) - : base(repositoryFactory, readOnly, immediate) - { - _scopeProvider = scopeProvider; - SqlContext = sqlContext; - _isolationLevel = isolationLevel; - - // fixme only 1! - _key = Guid.NewGuid(); - InstanceId = Guid.NewGuid(); - - // be false by default - // if set to true... the UnitOfWork is "auto-commit" which means that even in the case of - // an exception, the scope would still be completed - ppl should use it with great care! - _completeScope = readOnly; - } - - #region IDatabaseContext - - /// - public ISqlContext SqlContext { get; } - - #endregion - - public override TRepository CreateRepository() - { - return RepositoryFactory.CreateRepository(this); - } - - public override void Begin() - { - base.Begin(); - - // soon as we get Database, a transaction is started - var unused = Database; - } - - /// - public void ReadLock(params int[] lockIds) - { - Scope.ReadLock(lockIds); - } - - /// - public void WriteLock(params int[] lockIds) - { - if (ReadOnly) - throw new NotSupportedException("This unit of work is read-only."); - - Scope.WriteLock(lockIds); - } - - public override void Complete() - { - base.Complete(); - _completeScope = true; - _key = Guid.NewGuid(); // fixme kill! - } - - public object Key => _key; - - // fixme v8 - // once we are absolutely sure that our UOW cannot be disposed more than once, - // this should throw if the UOW has already been disposed, NOT recreate a scope! - public IScope Scope => _scope ?? (_scope = _scopeProvider.CreateScope(_isolationLevel)); - - public IUmbracoDatabase Database => Scope.Database; - - public EventMessages Messages => Scope.Messages; - - public IEventDispatcher Events => Scope.Events; - - /// - /// Ensures disposable objects are disposed - /// - /// - /// Ensures that the Transaction instance is disposed of - /// - protected override void DisposeResources() - { - // base deals with the operation's queue - base.DisposeResources(); - - if (_scope == null) return; - if (_completeScope) _scope.Complete(); - _scope.Dispose(); - _scope = null; - } - } -} diff --git a/src/Umbraco.Core/Persistence/UnitOfWork/ScopeUnitOfWorkProvider.cs b/src/Umbraco.Core/Persistence/UnitOfWork/ScopeUnitOfWorkProvider.cs deleted file mode 100644 index 54b7309ed9..0000000000 --- a/src/Umbraco.Core/Persistence/UnitOfWork/ScopeUnitOfWorkProvider.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using System.Data; -using Umbraco.Core.Scoping; - -namespace Umbraco.Core.Persistence.UnitOfWork -{ - public class ScopeUnitOfWorkProvider : IScopeUnitOfWorkProvider - { - private readonly RepositoryFactory _repositoryFactory; - - /// - /// Initializes a new instance of the class. - /// - public ScopeUnitOfWorkProvider(IScopeProvider scopeProvider, ISqlContext sqlContext, RepositoryFactory repositoryFactory) - { - ScopeProvider = scopeProvider ?? throw new ArgumentNullException(nameof(scopeProvider)); - SqlContext = sqlContext ?? throw new ArgumentNullException(nameof(sqlContext)); - _repositoryFactory = repositoryFactory ?? throw new ArgumentNullException(nameof(repositoryFactory)); - } - - /// - public IScopeProvider ScopeProvider { get; } - - /// - public ISqlContext SqlContext { get; } - - /// - public IScopeUnitOfWork CreateUnitOfWork(IsolationLevel isolationLevel = IsolationLevel.Unspecified, bool readOnly = false, bool immediate = false) - { - return new ScopeUnitOfWork(ScopeProvider, SqlContext, _repositoryFactory, isolationLevel, readOnly, immediate); - } - } -} diff --git a/src/Umbraco.Core/Persistence/UnitOfWork/UnitOfWorkBase.cs b/src/Umbraco.Core/Persistence/UnitOfWork/UnitOfWorkBase.cs deleted file mode 100644 index de65f00cc6..0000000000 --- a/src/Umbraco.Core/Persistence/UnitOfWork/UnitOfWorkBase.cs +++ /dev/null @@ -1,128 +0,0 @@ -using System; -using System.Collections.Generic; -using Umbraco.Core.Models.EntityBase; -using Umbraco.Core.Persistence.Repositories; - -namespace Umbraco.Core.Persistence.UnitOfWork -{ - public abstract class UnitOfWorkBase : DisposableObject, IUnitOfWork - { - private Queue _operations; - - // fixme - explain readonly - // it means that the unit of work *will* complete no matter what - // but if an exception is thrown from within the 'using' block - // the calling code still can deal with it and cancel everything - // - // fixme - explain immediate - // do not queue things - save allocations + in some complex operations - // that are transactional queueing makes no sense (or we keep flushing) - - protected UnitOfWorkBase(RepositoryFactory repositoryFactory, bool readOnly = false, bool immediate = false) - { - RepositoryFactory = repositoryFactory; - ReadOnly = readOnly; - Immediate = immediate; - } - - private Queue Operations => _operations ?? (_operations = new Queue()); - - protected bool ReadOnly { get; } - protected bool Immediate { get; } - - protected RepositoryFactory RepositoryFactory { get; } - - public abstract TRepository CreateRepository() - where TRepository : IRepository; - - // fixme - we don't need Begin, really, or do we? - public virtual void Begin() - { } - - public virtual void Flush() - { - if (ReadOnly) - throw new NotSupportedException("This unit of work is read-only."); - - Begin(); - - if (_operations == null) - return; - - while (_operations.Count > 0) - { - var operation = _operations.Dequeue(); - switch (operation.Type) - { - case OperationType.Insert: - operation.Repository.PersistNewItem(operation.Entity); - break; - case OperationType.Delete: - operation.Repository.PersistDeletedItem(operation.Entity); - break; - case OperationType.Update: - operation.Repository.PersistUpdatedItem(operation.Entity); - break; - } - } - - // fixme - if any operation throws, the uow still contains the remaining ops - // should we clear the ops? - } - - public virtual void Complete() - { - if (ReadOnly) - throw new NotSupportedException("This unit of work is read-only."); - - if (Completed) - throw new InvalidOperationException("This unit of work has already been completed."); - - Flush(); - Completed = true; - } - - protected bool Completed { get; private set; } - - protected override void DisposeResources() - { - // whatever hasn't been commited is lost - // not sure we need this as we are being disposed... - _operations?.Clear(); - } - - /// - /// Provides a snapshot of an entity and the repository reference it belongs to. - /// - private sealed class Operation - { - /// - /// Gets or sets the entity. - /// - /// The entity. - public IEntity Entity { get; set; } - - /// - /// Gets or sets the repository. - /// - /// The repository. - public IUnitOfWorkRepository Repository { get; set; } - - /// - /// Gets or sets the type of operation. - /// - /// The type of operation. - public OperationType Type { get; set; } - } - - /// - /// The types of unit of work operation. - /// - private enum OperationType - { - Insert, - Update, - Delete - } - } -} diff --git a/src/Umbraco.Core/Persistence/UnitOfWorkExtensions.cs b/src/Umbraco.Core/Persistence/UnitOfWorkExtensions.cs deleted file mode 100644 index 10e34a2edb..0000000000 --- a/src/Umbraco.Core/Persistence/UnitOfWorkExtensions.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using Umbraco.Core.Models; -using Umbraco.Core.Persistence.Repositories; -using Umbraco.Core.Persistence.UnitOfWork; - -namespace Umbraco.Core.Persistence -{ - internal static class UnitOfWorkExtensions - { - public static IEntityContainerRepository CreateContainerRepository(this IUnitOfWork uow, Guid containerObjectType) - { - if (containerObjectType == Constants.ObjectTypes.DocumentTypeContainer) - return uow.CreateRepository(); - if (containerObjectType == Constants.ObjectTypes.MediaTypeContainer) - return uow.CreateRepository(); - throw new ArgumentOutOfRangeException(nameof(containerObjectType)); - } - } -} diff --git a/src/Umbraco.Core/Scoping/IScopeAccessor.cs b/src/Umbraco.Core/Scoping/IScopeAccessor.cs new file mode 100644 index 0000000000..aa830967d3 --- /dev/null +++ b/src/Umbraco.Core/Scoping/IScopeAccessor.cs @@ -0,0 +1,14 @@ +namespace Umbraco.Core.Scoping +{ + /// + /// Provides access to the ambient scope. + /// + public interface IScopeAccessor + { + /// + /// Gets the ambient scope. + /// + /// Returns null if there is no ambient scope. + IScope AmbientScope { get; } + } +} diff --git a/src/Umbraco.Core/Scoping/ScopeProvider.cs b/src/Umbraco.Core/Scoping/ScopeProvider.cs index 2bcb954d76..555d943714 100644 --- a/src/Umbraco.Core/Scoping/ScopeProvider.cs +++ b/src/Umbraco.Core/Scoping/ScopeProvider.cs @@ -19,7 +19,7 @@ namespace Umbraco.Core.Scoping /// /// Implements . /// - internal class ScopeProvider : IScopeProvider + internal class ScopeProvider : IScopeProvider, IScopeAccessor { private readonly ILogger _logger; private readonly FileSystems _fileSystems; @@ -263,14 +263,14 @@ namespace Umbraco.Core.Scoping // only 1 instance which can be disposed and disposed again private readonly ScopeReference _scopeReference; + IScope IScopeAccessor.AmbientScope => AmbientScope; + + // null if there is none public Scope AmbientScope { - get - { - // try http context, fallback onto call context - var value = GetHttpContextObject(ScopeItemKey, false); - return value ?? GetCallContextObject(ScopeItemKey); - } + // try http context, fallback onto call context + get => GetHttpContextObject(ScopeItemKey, false) + ?? GetCallContextObject(ScopeItemKey); set { // clear both diff --git a/src/Umbraco.Core/Services/ContentTypeService.cs b/src/Umbraco.Core/Services/ContentTypeService.cs index 85e1efd29b..94f207fc70 100644 --- a/src/Umbraco.Core/Services/ContentTypeService.cs +++ b/src/Umbraco.Core/Services/ContentTypeService.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using LightInject; using Umbraco.Core.Events; using Umbraco.Core.Logging; using Umbraco.Core.Models; @@ -14,7 +15,7 @@ namespace Umbraco.Core.Services internal class ContentTypeService : ContentTypeServiceBase, IContentTypeService { public ContentTypeService(IScopeProvider provider, ILogger logger, IEventMessagesFactory eventMessagesFactory, IContentService contentService, - IContentTypeRepository repository, IAuditRepository auditRepository, IEntityContainerRepository entityContainerRepository, IEntityRepository entityRepository) + IContentTypeRepository repository, IAuditRepository auditRepository, IDocumentTypeContainerRepository entityContainerRepository, IEntityRepository entityRepository) : base(provider, logger, eventMessagesFactory, repository, auditRepository, entityContainerRepository, entityRepository) { ContentService = contentService; diff --git a/src/Umbraco.Core/Services/ContentTypeServiceBaseOfTItemTService.cs b/src/Umbraco.Core/Services/ContentTypeServiceBaseOfTItemTService.cs index c43e5fdcca..fc420ffecf 100644 --- a/src/Umbraco.Core/Services/ContentTypeServiceBaseOfTItemTService.cs +++ b/src/Umbraco.Core/Services/ContentTypeServiceBaseOfTItemTService.cs @@ -1,7 +1,6 @@ using Umbraco.Core.Events; using Umbraco.Core.Logging; using Umbraco.Core.Models; -using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.Scoping; using Umbraco.Core.Services.Changes; diff --git a/src/Umbraco.Core/Services/DataTypeService.cs b/src/Umbraco.Core/Services/DataTypeService.cs index e50dcb2244..644ce8ac40 100644 --- a/src/Umbraco.Core/Services/DataTypeService.cs +++ b/src/Umbraco.Core/Services/DataTypeService.cs @@ -20,18 +20,20 @@ namespace Umbraco.Core.Services { private readonly IDataTypeDefinitionRepository _dataTypeDefinitionRepository; private readonly IDataTypeContainerRepository _dataTypeContainerRepository; + private readonly IContentTypeRepository _contentTypeRepository; private readonly IAuditRepository _auditRepository; private readonly IEntityRepository _entityRepository; public DataTypeService(IScopeProvider provider, ILogger logger, IEventMessagesFactory eventMessagesFactory, IDataTypeDefinitionRepository dataTypeDefinitionRepository, IDataTypeContainerRepository dataTypeContainerRepository, - IAuditRepository auditRepository, IEntityRepository entityRepository) + IAuditRepository auditRepository, IEntityRepository entityRepository, IContentTypeRepository contentTypeRepository) : base(provider, logger, eventMessagesFactory) { _dataTypeDefinitionRepository = dataTypeDefinitionRepository; _dataTypeContainerRepository = dataTypeContainerRepository; _auditRepository = auditRepository; _entityRepository = entityRepository; + _contentTypeRepository = contentTypeRepository; } #region Containers @@ -561,6 +563,34 @@ namespace Umbraco.Core.Services return; } + + // find ContentTypes using this IDataTypeDefinition on a PropertyType, and delete + // fixme - media and members?! + // fixme - non-group properties?! + var query = Query().Where(x => x.DataTypeDefinitionId == dataTypeDefinition.Id); + var contentTypes = _contentTypeRepository.GetByQuery(query); + foreach (var contentType in contentTypes) + { + foreach (var propertyGroup in contentType.PropertyGroups) + { + var types = propertyGroup.PropertyTypes.Where(x => x.DataTypeDefinitionId == dataTypeDefinition.Id).ToList(); + foreach (var propertyType in types) + { + propertyGroup.PropertyTypes.Remove(propertyType); + } + } + + // so... we are modifying content types here. the service will trigger Deleted event, + // which will propagate to DataTypeCacheRefresher which will clear almost every cache + // there is to clear... and in addition published snapshot caches will clear themselves too, so + // this is probably safe alghough it looks... weird. + // + // what IS weird is that a content type is losing a property and we do NOT raise any + // content type event... so ppl better listen on the data type events too. + + _contentTypeRepository.Save(contentType); + } + _dataTypeDefinitionRepository.Delete(dataTypeDefinition); deleteEventArgs.CanCancel = false; diff --git a/src/Umbraco.Core/Services/EntityService.cs b/src/Umbraco.Core/Services/EntityService.cs index c230b62b42..5aa6340d3e 100644 --- a/src/Umbraco.Core/Services/EntityService.cs +++ b/src/Umbraco.Core/Services/EntityService.cs @@ -15,7 +15,6 @@ using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.DatabaseModelDefinitions; using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Persistence.Repositories; -using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.Scoping; namespace Umbraco.Core.Services diff --git a/src/Umbraco.Core/Services/FileService.cs b/src/Umbraco.Core/Services/FileService.cs index 4bda5d394d..4b05768454 100644 --- a/src/Umbraco.Core/Services/FileService.cs +++ b/src/Umbraco.Core/Services/FileService.cs @@ -17,7 +17,7 @@ namespace Umbraco.Core.Services /// /// Represents the File Service, which is an easy access to operations involving objects like Scripts, Stylesheets and Templates /// - internal class FileService : ScopeRepositoryService, IFileService + public class FileService : ScopeRepositoryService, IFileService { private readonly IStylesheetRepository _stylesheetRepository; private readonly IScriptRepository _scriptRepository; diff --git a/src/Umbraco.Core/Services/LocalizationService.cs b/src/Umbraco.Core/Services/LocalizationService.cs index 146da2f13c..b065696f34 100644 --- a/src/Umbraco.Core/Services/LocalizationService.cs +++ b/src/Umbraco.Core/Services/LocalizationService.cs @@ -5,7 +5,6 @@ using Umbraco.Core.Events; using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Persistence.Repositories; -using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.Scoping; namespace Umbraco.Core.Services diff --git a/src/Umbraco.Core/Services/MacroService.cs b/src/Umbraco.Core/Services/MacroService.cs index f1fcfe7b99..c4bc615a84 100644 --- a/src/Umbraco.Core/Services/MacroService.cs +++ b/src/Umbraco.Core/Services/MacroService.cs @@ -5,7 +5,6 @@ using Umbraco.Core.Events; using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Persistence.Repositories; -using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.Scoping; namespace Umbraco.Core.Services diff --git a/src/Umbraco.Core/Services/MediaTypeService.cs b/src/Umbraco.Core/Services/MediaTypeService.cs index 521f8dae9e..b1351d1874 100644 --- a/src/Umbraco.Core/Services/MediaTypeService.cs +++ b/src/Umbraco.Core/Services/MediaTypeService.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using LightInject; using Umbraco.Core.Events; using Umbraco.Core.Logging; using Umbraco.Core.Models; @@ -11,7 +12,7 @@ namespace Umbraco.Core.Services internal class MediaTypeService : ContentTypeServiceBase, IMediaTypeService { public MediaTypeService(IScopeProvider provider, ILogger logger, IEventMessagesFactory eventMessagesFactory, IMediaService mediaService, - IMediaTypeRepository mediaTypeRepository, IAuditRepository auditRepository, IEntityContainerRepository entityContainerRepository, + IMediaTypeRepository mediaTypeRepository, IAuditRepository auditRepository, IMediaTypeContainerRepository entityContainerRepository, IEntityRepository entityRepository) : base(provider, logger, eventMessagesFactory, mediaTypeRepository, auditRepository, entityContainerRepository, entityRepository) { diff --git a/src/Umbraco.Core/Services/MemberTypeService.cs b/src/Umbraco.Core/Services/MemberTypeService.cs index 5cdde050f3..d6def68aa4 100644 --- a/src/Umbraco.Core/Services/MemberTypeService.cs +++ b/src/Umbraco.Core/Services/MemberTypeService.cs @@ -13,8 +13,8 @@ namespace Umbraco.Core.Services private readonly IMemberTypeRepository _memberTypeRepository; public MemberTypeService(IScopeProvider provider, ILogger logger, IEventMessagesFactory eventMessagesFactory, IMemberService memberService, - IMemberTypeRepository memberTypeRepository, IAuditRepository auditRepository, IEntityContainerRepository entityContainerRepository, IEntityRepository entityRepository) - : base(provider, logger, eventMessagesFactory, memberTypeRepository, auditRepository, entityContainerRepository, entityRepository) + IMemberTypeRepository memberTypeRepository, IAuditRepository auditRepository, IEntityRepository entityRepository) + : base(provider, logger, eventMessagesFactory, memberTypeRepository, auditRepository, null, entityRepository) { MemberService = memberService; _memberTypeRepository = memberTypeRepository; diff --git a/src/Umbraco.Core/Services/RedirectUrlService.cs b/src/Umbraco.Core/Services/RedirectUrlService.cs index 84517c9038..f744a580c2 100644 --- a/src/Umbraco.Core/Services/RedirectUrlService.cs +++ b/src/Umbraco.Core/Services/RedirectUrlService.cs @@ -4,7 +4,6 @@ using Umbraco.Core.Events; using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Persistence.Repositories; -using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.Scoping; namespace Umbraco.Core.Services @@ -13,9 +12,12 @@ namespace Umbraco.Core.Services { private readonly IRedirectUrlRepository _redirectUrlRepository; - public RedirectUrlService(IScopeProvider provider, ILogger logger, IEventMessagesFactory eventMessagesFactory) + public RedirectUrlService(IScopeProvider provider, ILogger logger, IEventMessagesFactory eventMessagesFactory, + IRedirectUrlRepository redirectUrlRepository) : base(provider, logger, eventMessagesFactory) - { } + { + _redirectUrlRepository = redirectUrlRepository; + } public void Register(string url, Guid contentKey) { diff --git a/src/Umbraco.Core/Services/ServerRegistrationService.cs b/src/Umbraco.Core/Services/ServerRegistrationService.cs index a8857b4961..c83edd1d4b 100644 --- a/src/Umbraco.Core/Services/ServerRegistrationService.cs +++ b/src/Umbraco.Core/Services/ServerRegistrationService.cs @@ -7,7 +7,6 @@ using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Persistence.Repositories; using Umbraco.Core.Persistence.Repositories.Implement; -using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.Scoping; using Umbraco.Core.Sync; diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 82920961cb..e6749c9b78 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -300,6 +300,7 @@ + @@ -1148,7 +1149,6 @@ - @@ -1166,14 +1166,6 @@ - - - - - - - - @@ -1249,6 +1241,7 @@ + diff --git a/src/Umbraco.Web/PublishedCache/NuCache/DataSource/Database.cs b/src/Umbraco.Web/PublishedCache/NuCache/DataSource/Database.cs index d82d432818..c887316c07 100644 --- a/src/Umbraco.Web/PublishedCache/NuCache/DataSource/Database.cs +++ b/src/Umbraco.Web/PublishedCache/NuCache/DataSource/Database.cs @@ -8,7 +8,6 @@ using Umbraco.Core; using Umbraco.Core.Logging; using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Persistence; -using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.Scoping; using Umbraco.Core.Serialization; using Umbraco.Web.Composing; diff --git a/src/Umbraco.Web/PublishedCache/NuCache/NuCacheComponent.cs b/src/Umbraco.Web/PublishedCache/NuCache/NuCacheComponent.cs index 1a55fd3b02..2be36b2903 100644 --- a/src/Umbraco.Web/PublishedCache/NuCache/NuCacheComponent.cs +++ b/src/Umbraco.Web/PublishedCache/NuCache/NuCacheComponent.cs @@ -1,11 +1,11 @@ using Umbraco.Core; using Umbraco.Core.Components; using Umbraco.Core.Logging; -using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.Scoping; using Umbraco.Core.Services; using LightInject; using Umbraco.Core.Models.PublishedContent; +using Umbraco.Core.Persistence.Repositories; namespace Umbraco.Web.PublishedCache.NuCache { @@ -22,10 +22,12 @@ namespace Umbraco.Web.PublishedCache.NuCache factory.GetInstance(), factory.GetInstance(), factory.GetInstance(), - factory.GetInstance(), factory.GetInstance(), factory.GetInstance(), - factory.GetInstance())); + factory.GetInstance(), + factory.GetInstance(), + factory.GetInstance(), + factory.GetInstance())); // add the NuCache health check (hidden from type finder) // todo - no NuCache health check yet diff --git a/src/Umbraco.Web/PublishedCache/XmlPublishedCache/PublishedSnapshotService.cs b/src/Umbraco.Web/PublishedCache/XmlPublishedCache/PublishedSnapshotService.cs index ab8c361acc..7e0868dbe8 100644 --- a/src/Umbraco.Web/PublishedCache/XmlPublishedCache/PublishedSnapshotService.cs +++ b/src/Umbraco.Web/PublishedCache/XmlPublishedCache/PublishedSnapshotService.cs @@ -7,7 +7,7 @@ using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Models.Membership; using Umbraco.Core.Models.PublishedContent; -using Umbraco.Core.Persistence.UnitOfWork; +using Umbraco.Core.Persistence.Repositories; using Umbraco.Core.Scoping; using Umbraco.Core.Services; using Umbraco.Core.Strings; @@ -35,37 +35,41 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache public PublishedSnapshotService(ServiceContext serviceContext, IPublishedContentTypeFactory publishedContentTypeFactory, IScopeProvider scopeProvider, - IScopeUnitOfWorkProvider uowProvider, ICacheProvider requestCache, IEnumerable segmentProviders, IPublishedSnapshotAccessor publishedSnapshotAccessor, + IDocumentRepository documentRepository, IMediaRepository mediaRepository, IMemberRepository memberRepository, ILogger logger, MainDom mainDom, bool testing = false, bool enableRepositoryEvents = true) - : this(serviceContext, publishedContentTypeFactory, scopeProvider, uowProvider, requestCache, segmentProviders, publishedSnapshotAccessor, logger, null, mainDom, testing, enableRepositoryEvents) + : this(serviceContext, publishedContentTypeFactory, scopeProvider, requestCache, segmentProviders, publishedSnapshotAccessor, + documentRepository, mediaRepository, memberRepository, + logger, null, mainDom, testing, enableRepositoryEvents) { } // used in some tests internal PublishedSnapshotService(ServiceContext serviceContext, IPublishedContentTypeFactory publishedContentTypeFactory, IScopeProvider scopeProvider, - IScopeUnitOfWorkProvider uowProvider, ICacheProvider requestCache, IPublishedSnapshotAccessor publishedSnapshotAccessor, + IDocumentRepository documentRepository, IMediaRepository mediaRepository, IMemberRepository memberRepository, ILogger logger, PublishedContentTypeCache contentTypeCache, MainDom mainDom, bool testing, bool enableRepositoryEvents) - : this(serviceContext, publishedContentTypeFactory, scopeProvider, uowProvider, requestCache, Enumerable.Empty(), publishedSnapshotAccessor, logger, contentTypeCache, mainDom, testing, enableRepositoryEvents) + : this(serviceContext, publishedContentTypeFactory, scopeProvider, requestCache, Enumerable.Empty(), publishedSnapshotAccessor, + documentRepository, mediaRepository, memberRepository, + logger, contentTypeCache, mainDom, testing, enableRepositoryEvents) { } private PublishedSnapshotService(ServiceContext serviceContext, IPublishedContentTypeFactory publishedContentTypeFactory, IScopeProvider scopeProvider, - IScopeUnitOfWorkProvider uowProvider, ICacheProvider requestCache, IEnumerable segmentProviders, IPublishedSnapshotAccessor publishedSnapshotAccessor, + IDocumentRepository documentRepository, IMediaRepository mediaRepository, IMemberRepository memberRepository, ILogger logger, PublishedContentTypeCache contentTypeCache, MainDom mainDom, @@ -76,7 +80,8 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache _contentTypeCache = contentTypeCache ?? new PublishedContentTypeCache(serviceContext.ContentTypeService, serviceContext.MediaTypeService, serviceContext.MemberTypeService, publishedContentTypeFactory, logger); - _xmlStore = new XmlStore(serviceContext, scopeProvider, uowProvider, _routesCache, _contentTypeCache, segmentProviders, publishedSnapshotAccessor, mainDom, testing, enableRepositoryEvents); + _xmlStore = new XmlStore(serviceContext, scopeProvider, _routesCache, _contentTypeCache, segmentProviders, publishedSnapshotAccessor, mainDom, testing, enableRepositoryEvents, + documentRepository, mediaRepository, memberRepository); _domainService = serviceContext.DomainService; _memberService = serviceContext.MemberService; diff --git a/src/Umbraco.Web/PublishedCache/XmlPublishedCache/XmlCacheComponent.cs b/src/Umbraco.Web/PublishedCache/XmlPublishedCache/XmlCacheComponent.cs index c6ae22b132..bd895daa2d 100644 --- a/src/Umbraco.Web/PublishedCache/XmlPublishedCache/XmlCacheComponent.cs +++ b/src/Umbraco.Web/PublishedCache/XmlPublishedCache/XmlCacheComponent.cs @@ -1,7 +1,6 @@ using Umbraco.Core; using Umbraco.Core.Cache; using Umbraco.Core.Components; -using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.Services; using Umbraco.Core.Strings; using Umbraco.Core.Logging; @@ -9,6 +8,7 @@ using Umbraco.Core.Scoping; using Umbraco.Web.HealthCheck.Checks.DataIntegrity; using LightInject; using Umbraco.Core.Models.PublishedContent; +using Umbraco.Core.Persistence.Repositories; namespace Umbraco.Web.PublishedCache.XmlPublishedCache { @@ -24,10 +24,10 @@ namespace Umbraco.Web.PublishedCache.XmlPublishedCache factory.GetInstance(), factory.GetInstance(), factory.GetInstance(), - factory.GetInstance(), factory.GetInstance().RequestCache, factory.GetInstance(), factory.GetInstance(), + factory.GetInstance(), factory.GetInstance(), factory.GetInstance(), factory.GetInstance(), factory.GetInstance())); diff --git a/src/Umbraco.Web/Services/SectionService.cs b/src/Umbraco.Web/Services/SectionService.cs index 7eb68ab60e..411d122d49 100644 --- a/src/Umbraco.Web/Services/SectionService.cs +++ b/src/Umbraco.Web/Services/SectionService.cs @@ -9,7 +9,6 @@ using Umbraco.Core.Cache; using Umbraco.Core.Events; using Umbraco.Core.IO; using Umbraco.Core.Models; -using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.Composing; using Umbraco.Core.Scoping; using Umbraco.Core.Services;