diff --git a/src/Umbraco.Core/DependencyInjection/RepositoryCompositionRoot.cs b/src/Umbraco.Core/DependencyInjection/RepositoryCompositionRoot.cs index 6267a499ea..d579eb7d57 100644 --- a/src/Umbraco.Core/DependencyInjection/RepositoryCompositionRoot.cs +++ b/src/Umbraco.Core/DependencyInjection/RepositoryCompositionRoot.cs @@ -1,4 +1,3 @@ -using System; using LightInject; using Umbraco.Core.IO; using Umbraco.Core.Logging; @@ -34,11 +33,8 @@ namespace Umbraco.Core.DependencyInjection container.RegisterSingleton(); // register IUnitOfWork providers - // using a factory for NPocoUnitOfWorkProvider because it has another ctor accepting - // one single parameter - we should get rid of it but it is used hundreds of times in - // unit tests and I am lazy container.RegisterSingleton(); - container.RegisterSingleton(factory => new NPocoUnitOfWorkProvider(factory.GetInstance())); + container.RegisterSingleton(); // register mapping resover // using a factory because... no time to clean it up at the moment @@ -63,10 +59,14 @@ namespace Umbraco.Core.DependencyInjection // the disabled one is used by those repositories that have an annotated ctor parameter container.RegisterSingleton(factory => CacheHelper.CreateDisabledCacheHelper(), DisabledCache); - // register IDatabaseUnitOfWork - // resolve ctor dependency from GetInstance() runtimeArguments if possible - container.RegisterConstructorDependency((factory, info, runtimeArguments) => - runtimeArguments.Length > 0 ? runtimeArguments[0] as IDatabaseUnitOfWork : null); + // resolve ctor dependency from GetInstance() runtimeArguments, if possible - 'factory' is + // 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 IDatabaseUnitOfWork + container.RegisterConstructorDependency((factory, info, args) => args.Length > 0 ? args[0] as IDatabaseUnitOfWork : null); + // for IUnitOfWork + container.RegisterConstructorDependency((factory, info, args) => args.Length > 0 ? args[0] as IUnitOfWork : null); // register repositories // repos depend on various things, and a IDatabaseUnitOfWork (registered above) @@ -93,7 +93,6 @@ namespace Umbraco.Core.DependencyInjection container.Register(); container.Register(); container.Register(); - container.Register(); container.Register(); container.Register(); container.Register(); @@ -101,12 +100,15 @@ namespace Umbraco.Core.DependencyInjection container.Register(); container.Register(); container.Register(); + container.Register(); + container.Register(); + container.Register(); // repositories that depend on a filesystem // these have an annotated ctor parameter to pick the right file system container.Register(); - container.Register("PartialViewRepository"); - container.Register("PartialViewMacroRepository"); + container.Register(); + container.Register(); container.Register(); } } diff --git a/src/Umbraco.Core/Persistence/Repositories/EntityRepository.cs b/src/Umbraco.Core/Persistence/Repositories/EntityRepository.cs index c706d780df..e08cc016db 100644 --- a/src/Umbraco.Core/Persistence/Repositories/EntityRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/EntityRepository.cs @@ -34,11 +34,6 @@ namespace Umbraco.Core.Persistence.Repositories /// protected internal IDatabaseUnitOfWork UnitOfWork { get; } - /// - /// Internal for testing purposes - /// - internal Guid UnitKey => (Guid) UnitOfWork.Key; - #region Query Methods public Query Query => _queryFactory.Create(); diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/DataTypeContainerRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/DataTypeContainerRepository.cs new file mode 100644 index 0000000000..b98868c73a --- /dev/null +++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/DataTypeContainerRepository.cs @@ -0,0 +1,13 @@ +using Umbraco.Core.Logging; +using Umbraco.Core.Persistence.Mappers; +using Umbraco.Core.Persistence.UnitOfWork; + +namespace Umbraco.Core.Persistence.Repositories +{ + class DataTypeContainerRepository : EntityContainerRepository, IDataTypeContainerRepository + { + public DataTypeContainerRepository(IDatabaseUnitOfWork uow, CacheHelper cache, ILogger logger, IMappingResolver mappingResolver) + : base(uow, cache, logger, mappingResolver, Constants.ObjectTypes.DataTypeContainerGuid) + { } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/DocumentTypeContainerRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/DocumentTypeContainerRepository.cs new file mode 100644 index 0000000000..b1bedc9a96 --- /dev/null +++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/DocumentTypeContainerRepository.cs @@ -0,0 +1,13 @@ +using Umbraco.Core.Logging; +using Umbraco.Core.Persistence.Mappers; +using Umbraco.Core.Persistence.UnitOfWork; + +namespace Umbraco.Core.Persistence.Repositories +{ + class DocumentTypeContainerRepository : EntityContainerRepository, IDocumentTypeContainerRepository + { + public DocumentTypeContainerRepository(IDatabaseUnitOfWork uow, CacheHelper cache, ILogger logger, IMappingResolver mappingResolver) + : base(uow, cache, logger, mappingResolver, Constants.ObjectTypes.DocumentTypeContainerGuid) + { } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IDataTypeContainerRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IDataTypeContainerRepository.cs new file mode 100644 index 0000000000..b2675c3ce4 --- /dev/null +++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IDataTypeContainerRepository.cs @@ -0,0 +1,5 @@ +namespace Umbraco.Core.Persistence.Repositories +{ + interface IDataTypeContainerRepository : IEntityContainerRepository + { } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IDocumentTypeContainerRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IDocumentTypeContainerRepository.cs new file mode 100644 index 0000000000..03a71e0f19 --- /dev/null +++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IDocumentTypeContainerRepository.cs @@ -0,0 +1,5 @@ +namespace Umbraco.Core.Persistence.Repositories +{ + interface IDocumentTypeContainerRepository : IEntityContainerRepository + { } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IEntityContainerRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IEntityContainerRepository.cs new file mode 100644 index 0000000000..5e892e037a --- /dev/null +++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IEntityContainerRepository.cs @@ -0,0 +1,7 @@ +using Umbraco.Core.Models; + +namespace Umbraco.Core.Persistence.Repositories +{ + interface IEntityContainerRepository : IRepository + { } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IMediaTypeContainerRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IMediaTypeContainerRepository.cs new file mode 100644 index 0000000000..7d3b5a14b1 --- /dev/null +++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IMediaTypeContainerRepository.cs @@ -0,0 +1,5 @@ +namespace Umbraco.Core.Persistence.Repositories +{ + interface IMediaTypeContainerRepository : IEntityContainerRepository + { } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/INotificationsRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/INotificationsRepository.cs index 1f31a9bc80..72a968890b 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Interfaces/INotificationsRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/INotificationsRepository.cs @@ -5,7 +5,7 @@ using Umbraco.Core.Models.Membership; namespace Umbraco.Core.Persistence.Repositories { - public interface INotificationsRepository + public interface INotificationsRepository : IRepository { Notification CreateNotification(IUser user, IEntity entity, string action); int DeleteNotifications(IUser user); diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IPartialViewMacroRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IPartialViewMacroRepository.cs new file mode 100644 index 0000000000..fca0d61d4e --- /dev/null +++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IPartialViewMacroRepository.cs @@ -0,0 +1,9 @@ +namespace Umbraco.Core.Persistence.Repositories +{ + // this only exists to differenciate with IPartialViewRepository in IoC + // without resorting to constants, names, whatever - both interfaces are + // implemented by PartialViewRepository anyway + // fixme - what about file systems?! + internal interface IPartialViewMacroRepository : IPartialViewRepository + { } +} diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IServerRegistrationRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IServerRegistrationRepository.cs index 5db9c6087e..498082461e 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IServerRegistrationRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IServerRegistrationRepository.cs @@ -6,5 +6,8 @@ namespace Umbraco.Core.Persistence.Repositories public interface IServerRegistrationRepository : IRepositoryQueryable { void DeactiveStaleServers(TimeSpan staleTimeout); + + void ReadLockServers(); + void WriteLockServers(); } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/MediaTypeContainerRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/MediaTypeContainerRepository.cs new file mode 100644 index 0000000000..a20e73338a --- /dev/null +++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/MediaTypeContainerRepository.cs @@ -0,0 +1,13 @@ +using Umbraco.Core.Logging; +using Umbraco.Core.Persistence.Mappers; +using Umbraco.Core.Persistence.UnitOfWork; + +namespace Umbraco.Core.Persistence.Repositories +{ + class MediaTypeContainerRepository : EntityContainerRepository, IMediaTypeContainerRepository + { + public MediaTypeContainerRepository(IDatabaseUnitOfWork uow, CacheHelper cache, ILogger logger, IMappingResolver mappingResolver) + : base(uow, cache, logger, mappingResolver, Constants.ObjectTypes.MediaTypeContainerGuid) + { } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/NotificationsRepository.cs b/src/Umbraco.Core/Persistence/Repositories/NotificationsRepository.cs index 1736932456..106d1bfcd6 100644 --- a/src/Umbraco.Core/Persistence/Repositories/NotificationsRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/NotificationsRepository.cs @@ -11,7 +11,7 @@ using Umbraco.Core.Persistence.UnitOfWork; namespace Umbraco.Core.Persistence.Repositories { - public class NotificationsRepository : INotificationsRepository + public class NotificationsRepository : DisposableObject, INotificationsRepository { private readonly IDatabaseUnitOfWork _unitOfWork; @@ -95,5 +95,8 @@ namespace Umbraco.Core.Persistence.Repositories _unitOfWork.Database.Insert(dto); return new Notification(dto.NodeId, dto.UserId, dto.Action, nodeType); } + + protected override void DisposeResources() + { } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/PartialViewMacroRepository.cs b/src/Umbraco.Core/Persistence/Repositories/PartialViewMacroRepository.cs index 82131bd9f1..d10e4add02 100644 --- a/src/Umbraco.Core/Persistence/Repositories/PartialViewMacroRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/PartialViewMacroRepository.cs @@ -6,7 +6,7 @@ using Umbraco.Core.Persistence.UnitOfWork; namespace Umbraco.Core.Persistence.Repositories { - internal class PartialViewMacroRepository : PartialViewRepository + internal class PartialViewMacroRepository : PartialViewRepository, IPartialViewMacroRepository { public PartialViewMacroRepository(IUnitOfWork work, [Inject("PartialViewMacroFileSystem")] IFileSystem fileSystem) diff --git a/src/Umbraco.Core/Persistence/Repositories/PartialViewRepository.cs b/src/Umbraco.Core/Persistence/Repositories/PartialViewRepository.cs index 48288ddc19..660ccdd983 100644 --- a/src/Umbraco.Core/Persistence/Repositories/PartialViewRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/PartialViewRepository.cs @@ -12,7 +12,6 @@ namespace Umbraco.Core.Persistence.Repositories { internal class PartialViewRepository : FileRepository, IPartialViewRepository { - public PartialViewRepository(IUnitOfWork work, [Inject("PartialViewFileSystem")] IFileSystem fileSystem) : base(work, fileSystem) { } diff --git a/src/Umbraco.Core/Persistence/Repositories/RepositoryBase.cs b/src/Umbraco.Core/Persistence/Repositories/RepositoryBase.cs index 958eca5816..df10409e0c 100644 --- a/src/Umbraco.Core/Persistence/Repositories/RepositoryBase.cs +++ b/src/Umbraco.Core/Persistence/Repositories/RepositoryBase.cs @@ -35,14 +35,6 @@ namespace Umbraco.Core.Persistence.Repositories get { return _work; } } - /// - /// Internal for testing purposes - /// - internal Guid UnitKey - { - get { return (Guid)_work.Key; } - } - protected CacheHelper RepositoryCache { get { return _cache; } diff --git a/src/Umbraco.Core/Persistence/Repositories/ServerRegistrationRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ServerRegistrationRepository.cs index 37f249df6e..265e7c2857 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ServerRegistrationRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ServerRegistrationRepository.cs @@ -18,6 +18,7 @@ namespace Umbraco.Core.Persistence.Repositories internal class ServerRegistrationRepository : NPocoRepositoryBase, IServerRegistrationRepository { private readonly ICacheProvider _staticCache; + private readonly int[] _lockIds = { Constants.System.ServersLock }; public ServerRegistrationRepository(IDatabaseUnitOfWork work, CacheHelper cacheHelper, ILogger logger, IMappingResolver mappingResolver) : base(work, CacheHelper.CreateDisabledCacheHelper(), logger, mappingResolver) @@ -146,5 +147,15 @@ namespace Umbraco.Core.Persistence.Repositories Database.Update("SET isActive=0, isMaster=0 WHERE lastNotifiedDate < @timeoutDate", new { /*timeoutDate =*/ timeoutDate }); ReloadCache(); } + + public void ReadLockServers() + { + UnitOfWork.ReadLockNodes(_lockIds); + } + + public void WriteLockServers() + { + UnitOfWork.WriteLockNodes(_lockIds); + } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/RepositoryFactory.cs b/src/Umbraco.Core/Persistence/RepositoryFactory.cs index fa4599b95f..05a33676bc 100644 --- a/src/Umbraco.Core/Persistence/RepositoryFactory.cs +++ b/src/Umbraco.Core/Persistence/RepositoryFactory.cs @@ -22,164 +22,34 @@ namespace Umbraco.Core.Persistence _container = container; } - public virtual INotificationsRepository CreateNotificationsRepository(IDatabaseUnitOfWork uow) + /// + /// Creates a repository. + /// + /// The type of the repository. + /// A unit of work. + /// The optional name of the repository. + /// The created repository for the unit of work. + public virtual TRepository CreateRepository(IDatabaseUnitOfWork uow, string name = null) + where TRepository : IRepository { - return _container.GetInstance(uow); + return string.IsNullOrWhiteSpace(name) + ? _container.GetInstance(uow) + : _container.GetInstance(uow, name); } - public virtual IExternalLoginRepository CreateExternalLoginRepository(IDatabaseUnitOfWork uow) + /// + /// Creates a repository. + /// + /// The type of the repository. + /// A unit of work. + /// The optional name of the repository. + /// The created repository for the unit of work. + internal virtual TRepository CreateRepository(FileUnitOfWork uow, string name = null) + where TRepository : IRepository { - return _container.GetInstance(uow); - } - - public virtual IPublicAccessRepository CreatePublicAccessRepository(IDatabaseUnitOfWork uow) - { - return _container.GetInstance(uow); - } - - public virtual ITaskRepository CreateTaskRepository(IDatabaseUnitOfWork uow) - { - return _container.GetInstance(uow); - } - - public virtual IAuditRepository CreateAuditRepository(IDatabaseUnitOfWork uow) - { - return _container.GetInstance(uow); - } - - public virtual ITagRepository CreateTagRepository(IDatabaseUnitOfWork uow) - { - return _container.GetInstance(uow); - } - - public virtual IContentRepository CreateContentRepository(IDatabaseUnitOfWork uow) - { - return _container.GetInstance(uow); - } - - public virtual IContentTypeRepository CreateContentTypeRepository(IDatabaseUnitOfWork uow) - { - return _container.GetInstance(uow); - } - - public virtual IDataTypeDefinitionRepository CreateDataTypeDefinitionRepository(IDatabaseUnitOfWork uow) - { - return _container.GetInstance(uow); - } - - public virtual IDictionaryRepository CreateDictionaryRepository(IDatabaseUnitOfWork uow) - { - return _container.GetInstance(uow); - } - - public virtual ILanguageRepository CreateLanguageRepository(IDatabaseUnitOfWork uow) - { - return _container.GetInstance(uow); - } - - public virtual IMediaRepository CreateMediaRepository(IDatabaseUnitOfWork uow) - { - return _container.GetInstance(uow); - } - - public virtual IMediaTypeRepository CreateMediaTypeRepository(IDatabaseUnitOfWork uow) - { - return _container.GetInstance(uow); - } - - public virtual IRelationRepository CreateRelationRepository(IDatabaseUnitOfWork uow) - { - return _container.GetInstance(uow); - } - - public virtual IRelationTypeRepository CreateRelationTypeRepository(IDatabaseUnitOfWork uow) - { - return _container.GetInstance(uow); - } - - public virtual IScriptRepository CreateScriptRepository(IUnitOfWork uow) - { - return _container.GetInstance(uow); - } - - internal virtual IPartialViewRepository CreatePartialViewRepository(IUnitOfWork uow) - { - return _container.GetInstance(uow, "PartialViewRepository"); - } - - internal virtual IPartialViewRepository CreatePartialViewMacroRepository(IUnitOfWork uow) - { - return _container.GetInstance(uow, "PartialViewMacroRepository"); - } - - public virtual IStylesheetRepository CreateStylesheetRepository(IUnitOfWork uow, IDatabaseUnitOfWork db) - { - return _container.GetInstance(uow); - } - - public virtual ITemplateRepository CreateTemplateRepository(IDatabaseUnitOfWork uow) - { - return _container.GetInstance(uow); - } - - public virtual IMigrationEntryRepository CreateMigrationEntryRepository(IDatabaseUnitOfWork uow) - { - return _container.GetInstance(uow); - } - - public virtual IServerRegistrationRepository CreateServerRegistrationRepository(IDatabaseUnitOfWork uow) - { - return _container.GetInstance(uow); - } - - public virtual IUserTypeRepository CreateUserTypeRepository(IDatabaseUnitOfWork uow) - { - return _container.GetInstance(uow); - } - - public virtual IUserRepository CreateUserRepository(IDatabaseUnitOfWork uow) - { - return _container.GetInstance(uow); - } - - internal virtual IMacroRepository CreateMacroRepository(IDatabaseUnitOfWork uow) - { - return _container.GetInstance(uow); - } - - public virtual IMemberRepository CreateMemberRepository(IDatabaseUnitOfWork uow) - { - return _container.GetInstance(uow); - } - - public virtual IMemberTypeRepository CreateMemberTypeRepository(IDatabaseUnitOfWork uow) - { - return _container.GetInstance(uow); - } - - public virtual IMemberGroupRepository CreateMemberGroupRepository(IDatabaseUnitOfWork uow) - { - return _container.GetInstance(uow); - } - - public virtual IEntityRepository CreateEntityRepository(IDatabaseUnitOfWork uow) - { - return _container.GetInstance(uow); - } - - public virtual IDomainRepository CreateDomainRepository(IDatabaseUnitOfWork uow) - { - return _container.GetInstance(uow); - } - - public virtual ITaskTypeRepository CreateTaskTypeRepository(IDatabaseUnitOfWork uow) - { - return _container.GetInstance(uow); - } - - internal virtual EntityContainerRepository CreateEntityContainerRepository(IDatabaseUnitOfWork uow, Guid containerObjectType) - { - return _container.GetInstance(uow); + return string.IsNullOrWhiteSpace(name) + ? _container.GetInstance(uow) + : _container.GetInstance(uow, name); } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/UnitOfWork/FileUnitOfWork.cs b/src/Umbraco.Core/Persistence/UnitOfWork/FileUnitOfWork.cs index c4c31849eb..82000248d1 100644 --- a/src/Umbraco.Core/Persistence/UnitOfWork/FileUnitOfWork.cs +++ b/src/Umbraco.Core/Persistence/UnitOfWork/FileUnitOfWork.cs @@ -1,72 +1,82 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Transactions; +using System.Collections.Generic; using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Persistence.Repositories; namespace Umbraco.Core.Persistence.UnitOfWork { /// /// Represents the Unit of Work implementation for working with files /// - internal class FileUnitOfWork : IUnitOfWork + internal class FileUnitOfWork : DisposableObject, IUnitOfWork { - private Guid _key; private readonly Queue _operations = new Queue(); - - public FileUnitOfWork() - { - _key = Guid.NewGuid(); - } - - #region Implementation of IUnitOfWork + private readonly RepositoryFactory _factory; /// - /// Registers an instance to be added through this + /// Initializes a new instance of the class with a a repository factory. /// - /// The - /// The participating in the transaction + /// A repository factory. + /// This should be used by the FileUnitOfWorkProvider exclusively. + public FileUnitOfWork(RepositoryFactory factory) + { + _factory = factory; + } + + /// + /// Creates a repository. + /// + /// The type of the repository. + /// The optional name of the repository. + /// The created repository for the unit of work. + public TRepository CreateRepository(string name = null) + where TRepository : IRepository + { + return _factory.CreateRepository(this, name); + } + + /// + /// Registers an instance to be added through this . + /// + /// The entity. + /// The repository participating in the transaction. public void RegisterAdded(IEntity entity, IUnitOfWorkRepository repository) { - _operations.Enqueue( - new Operation - { - Entity = entity, - Repository = repository, - Type = TransactionType.Insert - }); + _operations.Enqueue(new Operation + { + Entity = entity, + Repository = repository, + Type = TransactionType.Insert + }); } /// - /// Registers an instance to be changed through this + /// Registers an instance to be changed through this . /// - /// The - /// The participating in the transaction + /// The entity. + /// The repository participating in the transaction. public void RegisterChanged(IEntity entity, IUnitOfWorkRepository repository) { - _operations.Enqueue( - new Operation - { - Entity = entity, - Repository = repository, - Type = TransactionType.Update - }); + _operations.Enqueue(new Operation + { + Entity = entity, + Repository = repository, + Type = TransactionType.Update + }); } /// - /// Registers an instance to be removed through this + /// Registers an instance to be removed through this . /// - /// The - /// The participating in the transaction + /// The entity. + /// The repository participating in the transaction. public void RegisterRemoved(IEntity entity, IUnitOfWorkRepository repository) { - _operations.Enqueue( - new Operation - { - Entity = entity, - Repository = repository, - Type = TransactionType.Delete - }); + _operations.Enqueue(new Operation + { + Entity = entity, + Repository = repository, + Type = TransactionType.Delete + }); } public void Commit() @@ -98,20 +108,16 @@ namespace Umbraco.Core.Persistence.UnitOfWork } } - // Clear everything + // clear everything + // fixme - why? everything should have been dequeued? _operations.Clear(); - _key = Guid.NewGuid(); } - public object Key + protected override void DisposeResources() { - get { return _key; } + _operations.Clear(); } - #endregion - - #region Operation - /// /// Provides a snapshot of an entity and the repository reference it belongs to. /// @@ -135,8 +141,5 @@ namespace Umbraco.Core.Persistence.UnitOfWork /// The type of operation. public TransactionType Type { get; set; } } - - #endregion - } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/UnitOfWork/FileUnitOfWorkProvider.cs b/src/Umbraco.Core/Persistence/UnitOfWork/FileUnitOfWorkProvider.cs index c27e86a515..1a022c38ac 100644 --- a/src/Umbraco.Core/Persistence/UnitOfWork/FileUnitOfWorkProvider.cs +++ b/src/Umbraco.Core/Persistence/UnitOfWork/FileUnitOfWorkProvider.cs @@ -5,13 +5,30 @@ /// public class FileUnitOfWorkProvider : IUnitOfWorkProvider { - #region Implementation of IUnitOfWorkProvider + private readonly RepositoryFactory _repositoryFactory; + + /// + /// Initializes a new instance of the class with a repository factory. + /// + /// A repository factory. + public FileUnitOfWorkProvider(RepositoryFactory repositoryFactory) + { + Mandate.ParameterNotNull(repositoryFactory, nameof(repositoryFactory)); + _repositoryFactory = repositoryFactory; + } + + /// + /// Initializes a new instance of the class. + /// + /// FOR UNIT TESTS ONLY + internal FileUnitOfWorkProvider() + { + // careful, _repositoryFactory remains null! + } public IUnitOfWork GetUnitOfWork() { - return new FileUnitOfWork(); + return new FileUnitOfWork(_repositoryFactory); } - - #endregion } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/UnitOfWork/IDatabaseUnitOfWork.cs b/src/Umbraco.Core/Persistence/UnitOfWork/IDatabaseUnitOfWork.cs index 616009988f..025f1bfc2b 100644 --- a/src/Umbraco.Core/Persistence/UnitOfWork/IDatabaseUnitOfWork.cs +++ b/src/Umbraco.Core/Persistence/UnitOfWork/IDatabaseUnitOfWork.cs @@ -8,5 +8,8 @@ namespace Umbraco.Core.Persistence.UnitOfWork public interface IDatabaseUnitOfWork : IUnitOfWork, IDisposable { UmbracoDatabase Database { get; } - } + + void ReadLockNodes(params int[] lockIds); + void WriteLockNodes(params int[] lockIds); + } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/UnitOfWork/IUnitOfWork.cs b/src/Umbraco.Core/Persistence/UnitOfWork/IUnitOfWork.cs index 13d2bb8be9..b8242795a4 100644 --- a/src/Umbraco.Core/Persistence/UnitOfWork/IUnitOfWork.cs +++ b/src/Umbraco.Core/Persistence/UnitOfWork/IUnitOfWork.cs @@ -1,17 +1,18 @@ using System; using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Persistence.Repositories; namespace Umbraco.Core.Persistence.UnitOfWork { /// /// Defines a Unit Of Work /// - public interface IUnitOfWork - { + public interface IUnitOfWork : IDisposable + { void RegisterAdded(IEntity entity, IUnitOfWorkRepository repository); void RegisterChanged(IEntity entity, IUnitOfWorkRepository repository); void RegisterRemoved(IEntity entity, IUnitOfWorkRepository repository); void Commit(); - object Key { get; } + TRepository CreateRepository(string name = null) where TRepository : IRepository; } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/UnitOfWork/NPocoUnitOfWork.cs b/src/Umbraco.Core/Persistence/UnitOfWork/NPocoUnitOfWork.cs index 5b6af0b4c0..0634affdb1 100644 --- a/src/Umbraco.Core/Persistence/UnitOfWork/NPocoUnitOfWork.cs +++ b/src/Umbraco.Core/Persistence/UnitOfWork/NPocoUnitOfWork.cs @@ -1,44 +1,57 @@ using System; using System.Collections.Generic; +using System.Data; +using LightInject; using NPoco; using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Persistence.Repositories; namespace Umbraco.Core.Persistence.UnitOfWork { /// - /// Represents the Unit of Work implementation for NPoco + /// Represents the Unit of Work implementation for NPoco. /// internal class NPocoUnitOfWork : DisposableObject, IDatabaseUnitOfWork { - - /// - /// Used for testing - /// - internal Guid InstanceId { get; private set; } - - private Guid _key; private readonly Queue _operations = new Queue(); + private readonly RepositoryFactory _factory; + private ITransaction _transaction; - /// - /// Creates a new unit of work instance - /// - /// - /// - /// This should normally not be used directly and should be created with the UnitOfWorkProvider - /// - internal NPocoUnitOfWork(UmbracoDatabase database) + /// + /// Initializes a new instance of the class with a database and a repository factory. + /// + /// A database. + /// A repository factory. + /// This should be used by the NPocoUnitOfWorkProvider exclusively. + internal NPocoUnitOfWork(UmbracoDatabase database, RepositoryFactory factory) { Database = database; - _key = Guid.NewGuid(); - InstanceId = Guid.NewGuid(); + _factory = factory; } - /// - /// Registers an instance to be added through this - /// - /// The - /// The participating in the transaction - public void RegisterAdded(IEntity entity, IUnitOfWorkRepository repository) + /// + /// Gets the unit of work underlying database. + /// + public UmbracoDatabase Database { get; } + + /// + /// Creates a repository. + /// + /// The type of the repository. + /// The optional name of the repository. + /// The created repository for the unit of work. + public TRepository CreateRepository(string name = null) + where TRepository : IRepository + { + return _factory.CreateRepository(this, name); + } + + /// + /// Registers an instance to be added through this . + /// + /// The entity. + /// The repository participating in the transaction. + public void RegisterAdded(IEntity entity, IUnitOfWorkRepository repository) { _operations.Enqueue(new Operation { @@ -49,39 +62,48 @@ namespace Umbraco.Core.Persistence.UnitOfWork } /// - /// Registers an instance to be changed through this + /// Registers an instance to be changed through this . /// - /// The - /// The participating in the transaction + /// The entity. + /// The repository participating in the transaction. public void RegisterChanged(IEntity entity, IUnitOfWorkRepository repository) { - _operations.Enqueue( - new Operation - { - Entity = entity, - Repository = repository, - Type = TransactionType.Update - }); + _operations.Enqueue(new Operation + { + Entity = entity, + Repository = repository, + Type = TransactionType.Update + }); } /// - /// Registers an instance to be removed through this + /// Registers an instance to be removed through this . /// - /// The - /// The participating in the transaction + /// The entity. + /// The repository participating in the transaction. public void RegisterRemoved(IEntity entity, IUnitOfWorkRepository repository) { - _operations.Enqueue( - new Operation - { - Entity = entity, - Repository = repository, - Type = TransactionType.Delete - }); + _operations.Enqueue(new Operation + { + Entity = entity, + Repository = repository, + Type = TransactionType.Delete + }); } + /// + /// Ensures that we have a transaction. + /// + /// Isolation level is determined by the database, see UmbracoDatabase.DefaultIsolationLevel. Should be + /// at least IsolationLevel.RepeatablRead else the node locks will not work correctly. + public void EnsureTransaction() + { + if (_transaction == null) + _transaction = Database.GetTransaction(); + } + /// - /// Commits all batched changes within the scope of a NPoco . + /// Commits all batched changes. /// /// /// Unlike a typical unit of work, this UOW will let you commit more than once since a new transaction is creaed per @@ -93,15 +115,15 @@ namespace Umbraco.Core.Persistence.UnitOfWork } /// - /// Commits all batched changes within the scope of a NPoco . + /// Commits all batched changes. /// - /// - /// Allows you to set a callback which is executed before the transaction is committed, allow you to add additional SQL - /// operations to the overall commit process after the queue has been processed. - /// - internal void Commit(Action transactionCompleting) + /// A callback which is executed after the operations have been processed and + /// before the transaction is completed. + internal void Commit(Action completing) { - using (var transaction = Database.GetTransaction()) + EnsureTransaction(); + + try { while (_operations.Count > 0) { @@ -120,33 +142,55 @@ namespace Umbraco.Core.Persistence.UnitOfWork } } - //Execute the callback if there is one - if (transactionCompleting != null) - { - transactionCompleting(Database); - } - - transaction.Complete(); + // execute the callback if there is one + completing?.Invoke(Database); + _transaction.Complete(); + } + finally + { + _transaction.Dispose(); // will rollback if not completed + _transaction = null; } - // Clear everything + // clear everything + // in case the Dequeue loop was aborted + // fixme - but the, exception and this is never reached? _operations.Clear(); - _key = Guid.NewGuid(); } - public object Key - { - get { return _key; } - } + protected override void DisposeResources() + { + _operations.Clear(); - public UmbracoDatabase Database { get; private set; } + if (_transaction == null) return; + _transaction.Dispose(); + _transaction = null; + } - #region Operation + public void ReadLockNodes(params int[] lockIds) + { + EnsureTransaction(); + if (Database.Transaction.IsolationLevel < IsolationLevel.RepeatableRead) + throw new InvalidOperationException("A transaction with minimum RepeatableRead isolation level is required."); + foreach (var lockId in lockIds) + Database.ExecuteScalar("SELECT sortOrder FROM umbracoNode WHERE id=@id", + new { @id = lockId }); + } - /// - /// Provides a snapshot of an entity and the repository reference it belongs to. - /// - private sealed class Operation + public void WriteLockNodes(params int[] lockIds) + { + EnsureTransaction(); + if (Database.Transaction.IsolationLevel < IsolationLevel.RepeatableRead) + throw new InvalidOperationException("A transaction with minimum RepeatableRead isolation level is required."); + foreach (var lockId in lockIds) + Database.Execute("UPDATE umbracoNode SET sortOrder = (CASE WHEN (sortOrder=1) THEN -1 ELSE 1 END) WHERE id=@id", + new { @id = lockId }); + } + + /// + /// Provides a snapshot of an entity and the repository reference it belongs to. + /// + private sealed class Operation { /// /// Gets or sets the entity. @@ -166,18 +210,5 @@ namespace Umbraco.Core.Persistence.UnitOfWork /// The type of operation. public TransactionType Type { get; set; } } - - #endregion - - /// - /// Ensures disposable objects are disposed - /// - /// - /// Ensures that the Transaction instance is disposed of - /// - protected override void DisposeResources() - { - _operations.Clear(); - } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/UnitOfWork/NPocoUnitOfWorkProvider.cs b/src/Umbraco.Core/Persistence/UnitOfWork/NPocoUnitOfWorkProvider.cs index 17e05dc3ed..8738812bc1 100644 --- a/src/Umbraco.Core/Persistence/UnitOfWork/NPocoUnitOfWorkProvider.cs +++ b/src/Umbraco.Core/Persistence/UnitOfWork/NPocoUnitOfWorkProvider.cs @@ -11,16 +11,20 @@ namespace Umbraco.Core.Persistence.UnitOfWork /// public class NPocoUnitOfWorkProvider : IDatabaseUnitOfWorkProvider { - private readonly IDatabaseFactory _dbFactory; + private readonly IDatabaseFactory _databaseFactory; + private readonly RepositoryFactory _repositoryFactory; /// - /// Initializes a new instance of the class with a database factory. + /// Initializes a new instance of the class with a database factory and a repository factory. /// - /// A database factory implementation. - public NPocoUnitOfWorkProvider(IDatabaseFactory dbFactory) + /// A database factory. + /// A repository factory. + public NPocoUnitOfWorkProvider(IDatabaseFactory databaseFactory, RepositoryFactory repositoryFactory) { - Mandate.ParameterNotNull(dbFactory, nameof(dbFactory)); - _dbFactory = dbFactory; + Mandate.ParameterNotNull(databaseFactory, nameof(databaseFactory)); + Mandate.ParameterNotNull(repositoryFactory, nameof(repositoryFactory)); + _databaseFactory = databaseFactory; + _repositoryFactory = repositoryFactory; } /// @@ -33,8 +37,10 @@ namespace Umbraco.Core.Persistence.UnitOfWork /// with the default connection name, and default sql syntax providers. /// internal NPocoUnitOfWorkProvider(ILogger logger) - : this(new DefaultDatabaseFactory(GlobalSettings.UmbracoConnectionName, GetDefaultSqlSyntaxProviders(logger), logger)) - { } + { + _databaseFactory = new DefaultDatabaseFactory(GlobalSettings.UmbracoConnectionName, GetDefaultSqlSyntaxProviders(logger), logger); + // careful, _repositoryFactory remains null! + } // this should NOT be here, all tests should supply the appropriate providers, // however the above ctor is used in hundreds of tests at the moment, so... @@ -61,8 +67,8 @@ namespace Umbraco.Core.Persistence.UnitOfWork // get a database from the factory - might be the "ambient" database eg // the one that's enlisted with the HttpContext - so it's not always a // "new" database. - var database = _dbFactory.GetDatabase(); - return new NPocoUnitOfWork(database); + var database = _databaseFactory.GetDatabase(); + return new NPocoUnitOfWork(database, _repositoryFactory); } #endregion diff --git a/src/Umbraco.Core/Services/AuditService.cs b/src/Umbraco.Core/Services/AuditService.cs index b1393775e3..82b5222c34 100644 --- a/src/Umbraco.Core/Services/AuditService.cs +++ b/src/Umbraco.Core/Services/AuditService.cs @@ -5,6 +5,7 @@ using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.Querying; +using Umbraco.Core.Persistence.Repositories; using Umbraco.Core.Persistence.UnitOfWork; namespace Umbraco.Core.Services @@ -18,9 +19,9 @@ namespace Umbraco.Core.Services public void Add(AuditType type, string comment, int userId, int objectId) { - var uow = UowProvider.GetUnitOfWork(); - using (var repo = RepositoryFactory.CreateAuditRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repo = uow.CreateRepository(); repo.AddOrUpdate(new AuditItem(objectId, comment, type, userId)); uow.Commit(); } @@ -28,9 +29,9 @@ namespace Umbraco.Core.Services public IEnumerable GetLogs(int objectId) { - var uow = UowProvider.GetUnitOfWork(); - using (var repo = RepositoryFactory.CreateAuditRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repo = uow.CreateRepository(); var result = repo.GetByQuery(repo.Query.Where(x => x.Id == objectId)); return result; } @@ -38,9 +39,9 @@ namespace Umbraco.Core.Services public IEnumerable GetUserLogs(int userId, AuditType type, DateTime? sinceDate = null) { - var uow = UowProvider.GetUnitOfWork(); - using (var repo = RepositoryFactory.CreateAuditRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repo = uow.CreateRepository(); var result = sinceDate.HasValue == false ? repo.GetByQuery(repo.Query.Where(x => x.UserId == userId && x.AuditType == type)) : repo.GetByQuery(repo.Query.Where(x => x.UserId == userId && x.AuditType == type && x.CreateDate >= sinceDate.Value)); @@ -50,9 +51,9 @@ namespace Umbraco.Core.Services public IEnumerable GetLogs(AuditType type, DateTime? sinceDate = null) { - var uow = UowProvider.GetUnitOfWork(); - using (var repo = RepositoryFactory.CreateAuditRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repo = uow.CreateRepository(); var result = sinceDate.HasValue == false ? repo.GetByQuery(repo.Query.Where(x => x.AuditType == type)) : repo.GetByQuery(repo.Query.Where(x => x.AuditType == type && x.CreateDate >= sinceDate.Value)); @@ -62,8 +63,9 @@ namespace Umbraco.Core.Services public void CleanLogs(int maximumAgeOfLogsInMinutes) { - using (var repo = RepositoryFactory.CreateAuditRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repo = uow.CreateRepository(); repo.CleanLogs(maximumAgeOfLogsInMinutes); } } diff --git a/src/Umbraco.Core/Services/ContentService.cs b/src/Umbraco.Core/Services/ContentService.cs index f213a584be..a1658fed06 100644 --- a/src/Umbraco.Core/Services/ContentService.cs +++ b/src/Umbraco.Core/Services/ContentService.cs @@ -62,36 +62,36 @@ namespace Umbraco.Core.Services public int CountPublished(string contentTypeAlias = null) { - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateContentRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.CountPublished(); } } public int Count(string contentTypeAlias = null) { - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateContentRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.Count(contentTypeAlias); } } public int CountChildren(int parentId, string contentTypeAlias = null) { - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateContentRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.CountChildren(parentId, contentTypeAlias); } } public int CountDescendants(int parentId, string contentTypeAlias = null) { - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateContentRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.CountDescendants(parentId, contentTypeAlias); } } @@ -103,9 +103,9 @@ namespace Umbraco.Core.Services /// public void ReplaceContentPermissions(EntityPermissionSet permissionSet) { - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateContentRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); repository.ReplaceContentPermissions(permissionSet); } } @@ -118,9 +118,9 @@ namespace Umbraco.Core.Services /// public void AssignContentPermission(IContent entity, char permission, IEnumerable userIds) { - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateContentRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); repository.AssignEntityPermission(entity, permission, userIds); } } @@ -132,9 +132,9 @@ namespace Umbraco.Core.Services /// public IEnumerable GetPermissionsForEntity(IContent content) { - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateContentRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.GetPermissionsForEntity(content.Id); } } @@ -172,10 +172,10 @@ namespace Umbraco.Core.Services Created.RaiseEvent(new NewEventArgs(content, false, contentTypeAlias, parentId), this); - var uow = UowProvider.GetUnitOfWork(); - using (var auditRepo = RepositoryFactory.CreateAuditRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { - auditRepo.AddOrUpdate(new AuditItem(content.Id, string.Format("Content '{0}' was created", name), AuditType.New, content.CreatorId)); + var repo = uow.CreateRepository(); + repo.AddOrUpdate(new AuditItem(content.Id, string.Format("Content '{0}' was created", name), AuditType.New, content.CreatorId)); uow.Commit(); } @@ -252,9 +252,9 @@ namespace Umbraco.Core.Services return content; } - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateContentRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); content.CreatorId = userId; content.WriterId = userId; repository.AddOrUpdate(content); @@ -306,9 +306,9 @@ namespace Umbraco.Core.Services return content; } - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateContentRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); content.CreatorId = userId; content.WriterId = userId; repository.AddOrUpdate(content); @@ -333,8 +333,9 @@ namespace Umbraco.Core.Services /// public IContent GetById(int id) { - using (var repository = RepositoryFactory.CreateContentRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.Get(id); } } @@ -348,8 +349,9 @@ namespace Umbraco.Core.Services { if (ids.Any() == false) return Enumerable.Empty(); - using (var repository = RepositoryFactory.CreateContentRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.GetAll(ids.ToArray()); } } @@ -361,8 +363,9 @@ namespace Umbraco.Core.Services /// public IContent GetById(Guid key) { - using (var repository = RepositoryFactory.CreateContentRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var query = repository.Query.Where(x => x.Key == key); var contents = repository.GetByQuery(query); return contents.SingleOrDefault(); @@ -376,8 +379,9 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetContentOfContentType(int id) { - using (var repository = RepositoryFactory.CreateContentRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var query = repository.Query.Where(x => x.ContentTypeId == id); var contents = repository.GetByQuery(query); @@ -387,8 +391,9 @@ namespace Umbraco.Core.Services internal IEnumerable GetPublishedContentOfContentType(int id) { - using (var repository = RepositoryFactory.CreateContentRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var query = repository.Query.Where(x => x.ContentTypeId == id); var contents = repository.GetByPublishedVersion(query); @@ -403,8 +408,9 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetByLevel(int level) { - using (var repository = RepositoryFactory.CreateContentRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var query = repository.Query.Where(x => x.Level == level && !x.Path.StartsWith(Constants.System.RecycleBinContent.ToInvariantString())); var contents = repository.GetByQuery(query); @@ -419,8 +425,9 @@ namespace Umbraco.Core.Services /// An item public IContent GetByVersion(Guid versionId) { - using (var repository = RepositoryFactory.CreateContentRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.GetByVersion(versionId); } } @@ -433,8 +440,9 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetVersions(int id) { - using (var repository = RepositoryFactory.CreateContentRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var versions = repository.GetAllVersions(id); return versions; } @@ -465,8 +473,9 @@ namespace Umbraco.Core.Services if (ids.Any() == false) return new List(); - using (var repository = RepositoryFactory.CreateContentRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.GetAll(ids); } } @@ -478,8 +487,9 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetChildren(int id) { - using (var repository = RepositoryFactory.CreateContentRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var query = repository.Query.Where(x => x.ParentId == id); var contents = repository.GetByQuery(query).OrderBy(x => x.SortOrder); @@ -521,8 +531,9 @@ namespace Umbraco.Core.Services { Mandate.ParameterCondition(pageIndex >= 0, "pageIndex"); Mandate.ParameterCondition(pageSize > 0, "pageSize"); - using (var repository = RepositoryFactory.CreateContentRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var query = repository.Query; //if the id is System Root, then just get all @@ -568,8 +579,9 @@ namespace Umbraco.Core.Services { Mandate.ParameterCondition(pageIndex >= 0, "pageIndex"); Mandate.ParameterCondition(pageSize > 0, "pageSize"); - using (var repository = RepositoryFactory.CreateContentRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var query = repository.Query; //if the id is System Root, then just get all @@ -591,8 +603,9 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetChildrenByName(int parentId, string name) { - using (var repository = RepositoryFactory.CreateContentRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var query = repository.Query.Where(x => x.ParentId == parentId && x.Name.Contains(name)); var contents = repository.GetByQuery(query); @@ -622,8 +635,9 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetDescendants(IContent content) { - using (var repository = RepositoryFactory.CreateContentRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var pathMatch = content.Path + ","; var query = repository.Query.Where(x => x.Path.StartsWith(pathMatch) && x.Id != content.Id); var contents = repository.GetByQuery(query); @@ -686,8 +700,9 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetRootContent() { - using (var repository = RepositoryFactory.CreateContentRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var query = repository.Query.Where(x => x.ParentId == Constants.System.Root); var contents = repository.GetByQuery(query); @@ -701,8 +716,9 @@ namespace Umbraco.Core.Services /// internal IEnumerable GetAllPublished() { - using (var repository = RepositoryFactory.CreateContentRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var query = repository.Query.Where(x => x.Trashed == false); return repository.GetByPublishedVersion(query); } @@ -714,8 +730,9 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetContentForExpiration() { - using (var repository = RepositoryFactory.CreateContentRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var query = repository.Query.Where(x => x.Published == true && x.ExpireDate <= DateTime.Now); var contents = repository.GetByQuery(query); @@ -729,8 +746,9 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetContentForRelease() { - using (var repository = RepositoryFactory.CreateContentRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var query = repository.Query.Where(x => x.Published == false && x.ReleaseDate <= DateTime.Now); var contents = repository.GetByQuery(query); @@ -744,8 +762,9 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetContentInRecycleBin() { - using (var repository = RepositoryFactory.CreateContentRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var query = repository.Query.Where(x => x.Path.Contains(Constants.System.RecycleBinContent.ToInvariantString())); var contents = repository.GetByQuery(query); @@ -767,8 +786,9 @@ namespace Umbraco.Core.Services internal int CountChildren(int id) { - using (var repository = RepositoryFactory.CreateContentRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var query = repository.Query.Where(x => x.ParentId == id); var count = repository.Count(query); return count; @@ -782,8 +802,9 @@ namespace Umbraco.Core.Services /// True if the content has any published version otherwise False public bool HasPublishedVersion(int id) { - using (var repository = RepositoryFactory.CreateContentRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var query = repository.Query.Where(x => x.Published == true && x.Id == id && x.Trashed == false); int count = repository.Count(query); return count > 0; @@ -928,9 +949,9 @@ namespace Umbraco.Core.Services UnPublish(descendant, userId); } - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateContentRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); content.WriterId = userId; content.ChangeTrashedState(true); repository.AddOrUpdate(content); @@ -1082,9 +1103,9 @@ namespace Umbraco.Core.Services { var containsNew = asArray.Any(x => x.HasIdentity == false); - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateContentRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); if (containsNew) { foreach (var content in asArray) @@ -1158,9 +1179,9 @@ namespace Umbraco.Core.Services Delete(child, userId); } - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateContentRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); repository.Delete(content); uow.Commit(); @@ -1233,7 +1254,7 @@ namespace Umbraco.Core.Services { using (var uow = UowProvider.GetUnitOfWork()) { - var repository = RepositoryFactory.CreateContentRepository(uow); + var repository = uow.CreateRepository(); //NOTE What about content that has the contenttype as part of its composition? var query = repository.Query.Where(x => x.ContentTypeId == contentTypeId); var contents = repository.GetByQuery(query).ToArray(); @@ -1291,9 +1312,9 @@ namespace Umbraco.Core.Services if (DeletingVersions.IsRaisedEventCancelled(new DeleteRevisionsEventArgs(id, dateToRetain: versionDate), this)) return; - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateContentRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); repository.DeleteVersions(id, versionDate); uow.Commit(); } @@ -1324,9 +1345,9 @@ namespace Umbraco.Core.Services DeleteVersions(id, content.UpdateDate, userId); } - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateContentRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); repository.DeleteVersion(versionId); uow.Commit(); } @@ -1401,8 +1422,9 @@ namespace Umbraco.Core.Services bool success; var nodeObjectType = new Guid(Constants.ObjectTypes.Document); - using (var repository = RepositoryFactory.CreateContentRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); //Create a dictionary of ids -> dictionary of property aliases + values entities = repository.GetEntitiesInRecycleBin() .ToDictionary( @@ -1465,9 +1487,9 @@ namespace Umbraco.Core.Services if (Copying.IsRaisedEventCancelled(new CopyEventArgs(content, copy, parentId), this)) return null; - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateContentRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); // Update the create author and last edit author copy.CreatorId = userId; copy.WriterId = userId; @@ -1552,9 +1574,9 @@ namespace Umbraco.Core.Services if (RollingBack.IsRaisedEventCancelled(new RollbackEventArgs(content), this)) return content; - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateContentRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); content.WriterId = userId; content.CreatorId = userId; content.ChangePublishedState(PublishedState.Unpublished); @@ -1598,9 +1620,9 @@ namespace Umbraco.Core.Services var asArray = items.ToArray(); using (new WriteLock(Locker)) { - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateContentRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); int i = 0; foreach (var content in asArray) { @@ -1663,9 +1685,9 @@ namespace Umbraco.Core.Services /// public XElement GetContentXml(int contentId) { - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateContentRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.GetContentXml(contentId); } } @@ -1678,9 +1700,9 @@ namespace Umbraco.Core.Services /// public XElement GetContentPreviewXml(int contentId, Guid version) { - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateContentRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.GetContentPreviewXml(contentId, version); } } @@ -1694,9 +1716,9 @@ namespace Umbraco.Core.Services /// public void RebuildXmlStructures(params int[] contentTypeIds) { - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateContentRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); repository.RebuildXmlStructures( content => _entitySerializer.Serialize(this, _dataTypeService, _userService, _urlSegmentProviders, content), contentTypeIds: contentTypeIds.Length == 0 ? null : contentTypeIds); @@ -1717,8 +1739,9 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects internal IEnumerable GetPublishedDescendants(IContent content) { - using (var repository = RepositoryFactory.CreateContentRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var query = repository.Query.Where(x => x.Id != content.Id && x.Path.StartsWith(content.Path) && x.Trashed == false); var contents = repository.GetByPublishedVersion(query); @@ -1732,10 +1755,10 @@ namespace Umbraco.Core.Services private void Audit(AuditType type, string message, int userId, int objectId) { - var uow = UowProvider.GetUnitOfWork(); - using (var auditRepo = RepositoryFactory.CreateAuditRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { - auditRepo.AddOrUpdate(new AuditItem(objectId, message, type, userId)); + var repo = uow.CreateRepository(); + repo.AddOrUpdate(new AuditItem(objectId, message, type, userId)); uow.Commit(); } } @@ -1883,9 +1906,9 @@ namespace Umbraco.Core.Services .OrderBy(x => x.Result.ContentItem.Level) .ThenBy(x => x.Result.ContentItem.SortOrder); - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateContentRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); //NOTE The Publish with subpages-dialog was used more as a republish-type-thing, so we'll have to include PublishStatusType.SuccessAlreadyPublished //in the updated-list, so the Published event is triggered with the expected set of pages and the xml is updated. foreach (var item in published) @@ -1936,9 +1959,9 @@ namespace Umbraco.Core.Services var unpublished = _publishingStrategy.UnPublish(content, userId); if (unpublished == false) return Attempt.Fail(new UnPublishStatus(content, UnPublishedStatusType.FailedCancelledByEvent, evtMsgs)); - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateContentRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); content.WriterId = userId; repository.AddOrUpdate(content); // is published is not newest, reset the published flag on published version @@ -2006,9 +2029,9 @@ namespace Umbraco.Core.Services //we are successfully published if our publishStatus is still Successful bool published = publishStatus.StatusType == PublishStatusType.Success; - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateContentRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); if (published == false) { content.ChangePublishedState(PublishedState.Saved); @@ -2080,9 +2103,9 @@ namespace Umbraco.Core.Services using (new WriteLock(Locker)) { - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateContentRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); if (content.HasIdentity == false) { content.CreatorId = userId; @@ -2192,8 +2215,9 @@ namespace Umbraco.Core.Services private IContentType FindContentTypeByAlias(string contentTypeAlias) { - using (var repository = RepositoryFactory.CreateContentTypeRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var query = repository.Query.Where(x => x.Alias == contentTypeAlias); var types = repository.GetByQuery(query); diff --git a/src/Umbraco.Core/Services/ContentTypeService.cs b/src/Umbraco.Core/Services/ContentTypeService.cs index 90a01b8c62..1fcc8f61e8 100644 --- a/src/Umbraco.Core/Services/ContentTypeService.cs +++ b/src/Umbraco.Core/Services/ContentTypeService.cs @@ -47,9 +47,9 @@ namespace Umbraco.Core.Services public Attempt> CreateContentTypeContainer(int parentId, string name, int userId = 0) { var evtMsgs = EventMessagesFactory.Get(); - var uow = UowProvider.GetUnitOfWork(); - using (var repo = RepositoryFactory.CreateEntityContainerRepository(uow, Constants.ObjectTypes.DocumentTypeContainerGuid)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repo = uow.CreateRepository(); try { var container = new EntityContainer(Constants.ObjectTypes.DocumentTypeGuid) @@ -84,9 +84,9 @@ namespace Umbraco.Core.Services public Attempt> CreateMediaTypeContainer(int parentId, string name, int userId = 0) { var evtMsgs = EventMessagesFactory.Get(); - var uow = UowProvider.GetUnitOfWork(); - using (var repo = RepositoryFactory.CreateEntityContainerRepository(uow, Constants.ObjectTypes.MediaTypeContainerGuid)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repo = uow.CreateRepository(); try { var container = new EntityContainer(Constants.ObjectTypes.MediaTypeGuid) @@ -160,9 +160,9 @@ namespace Umbraco.Core.Services return OperationStatus.Cancelled(evtMsgs); } - var uow = UowProvider.GetUnitOfWork(); - using (var repo = RepositoryFactory.CreateEntityContainerRepository(uow, containerObjectType)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repo = GetContainerRepository(uow, containerObjectType); repo.AddOrUpdate(container); uow.Commit(); } @@ -174,6 +174,15 @@ namespace Umbraco.Core.Services return OperationStatus.Success(evtMsgs); } + private IEntityContainerRepository GetContainerRepository(IDatabaseUnitOfWork uow, Guid containerObjectType) + { + if (containerObjectType == Constants.ObjectTypes.DocumentTypeContainerGuid) + return uow.CreateRepository(); + if (containerObjectType == Constants.ObjectTypes.MediaTypeContainerGuid) + return uow.CreateRepository(); + throw new ArgumentException("Object type is not supported.", nameof(containerObjectType)); + } + public EntityContainer GetContentTypeContainer(int containerId) { return GetContainer(containerId, Constants.ObjectTypes.DocumentTypeContainerGuid); @@ -186,9 +195,9 @@ namespace Umbraco.Core.Services private EntityContainer GetContainer(int containerId, Guid containerObjectType) { - var uow = UowProvider.GetUnitOfWork(); - using (var repo = RepositoryFactory.CreateEntityContainerRepository(uow, containerObjectType)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repo = GetContainerRepository(uow, containerObjectType); var container = repo.Get(containerId); return container; } @@ -196,19 +205,19 @@ namespace Umbraco.Core.Services public IEnumerable GetMediaTypeContainers(int[] containerIds) { - var uow = UowProvider.GetUnitOfWork(); - using (var repo = RepositoryFactory.CreateEntityContainerRepository(uow, Constants.ObjectTypes.MediaTypeContainerGuid)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repo = uow.CreateRepository(); return repo.GetAll(containerIds); } } public IEnumerable GetMediaTypeContainers(string name, int level) { - var uow = UowProvider.GetUnitOfWork(); - using (var repo = RepositoryFactory.CreateEntityContainerRepository(uow, Constants.ObjectTypes.MediaTypeContainerGuid)) + using (var uow = UowProvider.GetUnitOfWork()) { - return repo.Get(name, level); + var repo = uow.CreateRepository(); + return ((EntityContainerRepository) repo).Get(name, level); } } @@ -234,9 +243,9 @@ namespace Umbraco.Core.Services public IEnumerable GetContentTypeContainers(int[] containerIds) { - var uow = UowProvider.GetUnitOfWork(); - using (var repo = RepositoryFactory.CreateEntityContainerRepository(uow, Constants.ObjectTypes.DocumentTypeContainerGuid)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repo = uow.CreateRepository(); return repo.GetAll(containerIds); } } @@ -263,29 +272,29 @@ namespace Umbraco.Core.Services private EntityContainer GetContainer(Guid containerId, Guid containerObjectType) { - var uow = UowProvider.GetUnitOfWork(); - using (var repo = RepositoryFactory.CreateEntityContainerRepository(uow, containerObjectType)) + using (var uow = UowProvider.GetUnitOfWork()) { - var container = repo.Get(containerId); + var repo = GetContainerRepository(uow, containerObjectType); + var container = ((EntityContainerRepository)repo).Get(containerId); return container; } } public IEnumerable GetContentTypeContainers(string name, int level) { - var uow = UowProvider.GetUnitOfWork(); - using (var repo = RepositoryFactory.CreateEntityContainerRepository(uow, Constants.ObjectTypes.DocumentTypeContainerGuid)) + using (var uow = UowProvider.GetUnitOfWork()) { - return repo.Get(name, level); + var repo = uow.CreateRepository(); + return ((EntityContainerRepository)repo).Get(name, level); } } public Attempt DeleteContentTypeContainer(int containerId, int userId = 0) { var evtMsgs = EventMessagesFactory.Get(); - var uow = UowProvider.GetUnitOfWork(); - using (var repo = RepositoryFactory.CreateEntityContainerRepository(uow, Constants.ObjectTypes.DocumentTypeContainerGuid)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repo = uow.CreateRepository(); var container = repo.Get(containerId); if (container == null) return OperationStatus.NoOperation(evtMsgs); @@ -309,9 +318,9 @@ namespace Umbraco.Core.Services public Attempt DeleteMediaTypeContainer(int containerId, int userId = 0) { var evtMsgs = EventMessagesFactory.Get(); - var uow = UowProvider.GetUnitOfWork(); - using (var repo = RepositoryFactory.CreateEntityContainerRepository(uow, Constants.ObjectTypes.MediaTypeContainerGuid)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repo = uow.CreateRepository(); var container = repo.Get(containerId); if (container == null) return OperationStatus.NoOperation(evtMsgs); @@ -340,8 +349,9 @@ namespace Umbraco.Core.Services /// public IEnumerable GetAllPropertyTypeAliases() { - using (var repository = RepositoryFactory.CreateContentTypeRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.GetAllPropertyTypeAliases(); } } @@ -356,8 +366,9 @@ namespace Umbraco.Core.Services /// public IEnumerable GetAllContentTypeAliases(params Guid[] objectTypes) { - using (var repository = RepositoryFactory.CreateContentTypeRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.GetAllContentTypeAliases(objectTypes); } } @@ -452,8 +463,9 @@ namespace Umbraco.Core.Services /// public IContentType GetContentType(int id) { - using (var repository = RepositoryFactory.CreateContentTypeRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.Get(id); } } @@ -465,8 +477,9 @@ namespace Umbraco.Core.Services /// public IContentType GetContentType(string alias) { - using (var repository = RepositoryFactory.CreateContentTypeRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.Get(alias); } } @@ -478,8 +491,9 @@ namespace Umbraco.Core.Services /// public IContentType GetContentType(Guid id) { - using (var repository = RepositoryFactory.CreateContentTypeRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.Get(id); } } @@ -491,8 +505,9 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetAllContentTypes(params int[] ids) { - using (var repository = RepositoryFactory.CreateContentTypeRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.GetAll(ids); } } @@ -504,8 +519,9 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetAllContentTypes(IEnumerable ids) { - using (var repository = RepositoryFactory.CreateContentTypeRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.GetAll(ids.ToArray()); } } @@ -517,8 +533,9 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetContentTypeChildren(int id) { - using (var repository = RepositoryFactory.CreateContentTypeRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var query = repository.Query.Where(x => x.ParentId == id); var contentTypes = repository.GetByQuery(query); return contentTypes; @@ -532,8 +549,9 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetContentTypeChildren(Guid id) { - using (var repository = RepositoryFactory.CreateContentTypeRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var found = GetContentType(id); if (found == null) return Enumerable.Empty(); var query = repository.Query.Where(x => x.ParentId == found.Id); @@ -549,8 +567,9 @@ namespace Umbraco.Core.Services /// True if the content type has any children otherwise False public bool HasChildren(int id) { - using (var repository = RepositoryFactory.CreateContentTypeRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var query = repository.Query.Where(x => x.ParentId == id); int count = repository.Count(query); return count > 0; @@ -564,8 +583,9 @@ namespace Umbraco.Core.Services /// True if the content type has any children otherwise False public bool HasChildren(Guid id) { - using (var repository = RepositoryFactory.CreateContentTypeRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var found = GetContentType(id); if (found == null) return false; var query = repository.Query.Where(x => x.ParentId == found.Id); @@ -616,16 +636,18 @@ namespace Umbraco.Core.Services public int CountContentTypes() { - using (var repository = RepositoryFactory.CreateContentTypeRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.Count(repository.Query); } } public int CountMediaTypes() { - using (var repository = RepositoryFactory.CreateMediaTypeRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.Count(repository.Query); } } @@ -724,9 +746,9 @@ namespace Umbraco.Core.Services using (new WriteLock(Locker)) { - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateContentTypeRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); ValidateLocked(contentType); // throws if invalid contentType.CreatorId = userId; repository.AddOrUpdate(contentType); @@ -754,9 +776,9 @@ namespace Umbraco.Core.Services using (new WriteLock(Locker)) { - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateContentTypeRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); // all-or-nothing, validate them all first foreach (var contentType in asArray) { @@ -800,9 +822,9 @@ namespace Umbraco.Core.Services _contentService.DeleteContentOfType(contentType.Id); - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateContentTypeRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); repository.Delete(contentType); uow.Commit(); @@ -835,9 +857,9 @@ namespace Umbraco.Core.Services _contentService.DeleteContentOfType(contentType.Id); } - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateContentTypeRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); foreach (var contentType in asArray) { repository.Delete(contentType); @@ -859,8 +881,9 @@ namespace Umbraco.Core.Services /// public IMediaType GetMediaType(int id) { - using (var repository = RepositoryFactory.CreateMediaTypeRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.Get(id); } } @@ -872,8 +895,9 @@ namespace Umbraco.Core.Services /// public IMediaType GetMediaType(string alias) { - using (var repository = RepositoryFactory.CreateMediaTypeRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.Get(alias); } } @@ -885,8 +909,9 @@ namespace Umbraco.Core.Services /// public IMediaType GetMediaType(Guid id) { - using (var repository = RepositoryFactory.CreateMediaTypeRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.Get(id); } } @@ -898,8 +923,9 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetAllMediaTypes(params int[] ids) { - using (var repository = RepositoryFactory.CreateMediaTypeRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.GetAll(ids); } } @@ -911,8 +937,9 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetAllMediaTypes(IEnumerable ids) { - using (var repository = RepositoryFactory.CreateMediaTypeRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.GetAll(ids.ToArray()); } } @@ -924,8 +951,9 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetMediaTypeChildren(int id) { - using (var repository = RepositoryFactory.CreateMediaTypeRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var query = repository.Query.Where(x => x.ParentId == id); var contentTypes = repository.GetByQuery(query); return contentTypes; @@ -939,8 +967,9 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetMediaTypeChildren(Guid id) { - using (var repository = RepositoryFactory.CreateMediaTypeRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var found = GetMediaType(id); if (found == null) return Enumerable.Empty(); var query = repository.Query.Where(x => x.ParentId == found.Id); @@ -956,8 +985,9 @@ namespace Umbraco.Core.Services /// True if the media type has any children otherwise False public bool MediaTypeHasChildren(int id) { - using (var repository = RepositoryFactory.CreateMediaTypeRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var query = repository.Query.Where(x => x.ParentId == id); int count = repository.Count(query); return count > 0; @@ -971,8 +1001,9 @@ namespace Umbraco.Core.Services /// True if the media type has any children otherwise False public bool MediaTypeHasChildren(Guid id) { - using (var repository = RepositoryFactory.CreateMediaTypeRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var found = GetMediaType(id); if (found == null) return false; var query = repository.Query.Where(x => x.ParentId == found.Id); @@ -995,10 +1026,11 @@ namespace Umbraco.Core.Services } var moveInfo = new List>(); - var uow = UowProvider.GetUnitOfWork(); - using (var containerRepository = RepositoryFactory.CreateEntityContainerRepository(uow, Constants.ObjectTypes.MediaTypeContainerGuid)) - using (var repository = RepositoryFactory.CreateMediaTypeRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var containerRepository = uow.CreateRepository(); + var repository = uow.CreateRepository(); + try { EntityContainer container = null; @@ -1038,10 +1070,11 @@ namespace Umbraco.Core.Services } var moveInfo = new List>(); - var uow = UowProvider.GetUnitOfWork(); - using (var containerRepository = RepositoryFactory.CreateEntityContainerRepository(uow, Constants.ObjectTypes.DocumentTypeContainerGuid)) - using (var repository = RepositoryFactory.CreateContentTypeRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var containerRepository = uow.CreateRepository(); + var repository = uow.CreateRepository(); + try { EntityContainer container = null; @@ -1072,10 +1105,10 @@ namespace Umbraco.Core.Services var evtMsgs = EventMessagesFactory.Get(); IMediaType copy; - var uow = UowProvider.GetUnitOfWork(); - using (var containerRepository = RepositoryFactory.CreateEntityContainerRepository(uow, Constants.ObjectTypes.MediaTypeContainerGuid)) - using (var repository = RepositoryFactory.CreateMediaTypeRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var containerRepository = uow.CreateRepository(); + var repository = uow.CreateRepository(); try { if (containerId > 0) @@ -1115,10 +1148,10 @@ namespace Umbraco.Core.Services var evtMsgs = EventMessagesFactory.Get(); IContentType copy; - var uow = UowProvider.GetUnitOfWork(); - using (var containerRepository = RepositoryFactory.CreateEntityContainerRepository(uow, Constants.ObjectTypes.DocumentTypeContainerGuid)) - using (var repository = RepositoryFactory.CreateContentTypeRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var containerRepository = uow.CreateRepository(); + var repository = uow.CreateRepository(); try { if (containerId > 0) @@ -1165,9 +1198,9 @@ namespace Umbraco.Core.Services using (new WriteLock(Locker)) { - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateMediaTypeRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); ValidateLocked(mediaType); // throws if invalid mediaType.CreatorId = userId; repository.AddOrUpdate(mediaType); @@ -1196,9 +1229,9 @@ namespace Umbraco.Core.Services using (new WriteLock(Locker)) { - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateMediaTypeRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); // all-or-nothing, validate them all first foreach (var mediaType in asArray) { @@ -1235,9 +1268,9 @@ namespace Umbraco.Core.Services { _mediaService.DeleteMediaOfType(mediaType.Id, userId); - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateMediaTypeRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); repository.Delete(mediaType); uow.Commit(); @@ -1268,9 +1301,9 @@ namespace Umbraco.Core.Services _mediaService.DeleteMediaOfType(mediaType.Id); } - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateMediaTypeRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); foreach (var mediaType in asArray) { repository.Delete(mediaType); @@ -1333,10 +1366,10 @@ namespace Umbraco.Core.Services private void Audit(AuditType type, string message, int userId, int objectId) { - var uow = UowProvider.GetUnitOfWork(); - using (var auditRepo = RepositoryFactory.CreateAuditRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { - auditRepo.AddOrUpdate(new AuditItem(objectId, message, type, userId)); + var repo = uow.CreateRepository(); + repo.AddOrUpdate(new AuditItem(objectId, message, type, userId)); uow.Commit(); } } diff --git a/src/Umbraco.Core/Services/DataTypeService.cs b/src/Umbraco.Core/Services/DataTypeService.cs index a3491499a7..2069fc45c6 100644 --- a/src/Umbraco.Core/Services/DataTypeService.cs +++ b/src/Umbraco.Core/Services/DataTypeService.cs @@ -12,6 +12,7 @@ using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.PropertyEditors; using Umbraco.Core.Exceptions; +using Umbraco.Core.Persistence.Repositories; namespace Umbraco.Core.Services { @@ -31,9 +32,9 @@ namespace Umbraco.Core.Services public Attempt> CreateContainer(int parentId, string name, int userId = 0) { var evtMsgs = EventMessagesFactory.Get(); - var uow = UowProvider.GetUnitOfWork(); - using (var repo = RepositoryFactory.CreateEntityContainerRepository(uow, Constants.ObjectTypes.DataTypeContainerGuid)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repo = uow.CreateRepository(); try { var container = new EntityContainer(Constants.ObjectTypes.DataTypeGuid) @@ -67,9 +68,9 @@ namespace Umbraco.Core.Services public EntityContainer GetContainer(int containerId) { - var uow = UowProvider.GetUnitOfWork(); - using (var repo = RepositoryFactory.CreateEntityContainerRepository(uow, Constants.ObjectTypes.DataTypeContainerGuid)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repo = uow.CreateRepository(); var container = repo.Get(containerId); return container; } @@ -77,20 +78,20 @@ namespace Umbraco.Core.Services public EntityContainer GetContainer(Guid containerId) { - var uow = UowProvider.GetUnitOfWork(); - using (var repo = RepositoryFactory.CreateEntityContainerRepository(uow, Constants.ObjectTypes.DataTypeContainerGuid)) + using (var uow = UowProvider.GetUnitOfWork()) { - var container = repo.Get(containerId); + var repo = uow.CreateRepository(); + var container = ((EntityContainerRepository)repo).Get(containerId); return container; } } public IEnumerable GetContainers(string name, int level) { - var uow = UowProvider.GetUnitOfWork(); - using (var repo = RepositoryFactory.CreateEntityContainerRepository(uow, Constants.ObjectTypes.DataTypeContainerGuid)) + using (var uow = UowProvider.GetUnitOfWork()) { - return repo.Get(name, level); + var repo = uow.CreateRepository(); + return ((EntityContainerRepository)repo).Get(name, level); } } @@ -111,9 +112,9 @@ namespace Umbraco.Core.Services public IEnumerable GetContainers(int[] containerIds) { - var uow = UowProvider.GetUnitOfWork(); - using (var repo = RepositoryFactory.CreateEntityContainerRepository(uow, Constants.ObjectTypes.DataTypeContainerGuid)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repo = uow.CreateRepository(); return repo.GetAll(containerIds); } } @@ -141,9 +142,9 @@ namespace Umbraco.Core.Services return OperationStatus.Cancelled(evtMsgs); } - var uow = UowProvider.GetUnitOfWork(); - using (var repo = RepositoryFactory.CreateEntityContainerRepository(uow, Constants.ObjectTypes.DataTypeContainerGuid)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repo = uow.CreateRepository(); repo.AddOrUpdate(container); uow.Commit(); } @@ -158,9 +159,9 @@ namespace Umbraco.Core.Services public Attempt DeleteContainer(int containerId, int userId = 0) { var evtMsgs = EventMessagesFactory.Get(); - var uow = UowProvider.GetUnitOfWork(); - using (var repo = RepositoryFactory.CreateEntityContainerRepository(uow, Constants.ObjectTypes.DataTypeContainerGuid)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repo = uow.CreateRepository(); var container = repo.Get(containerId); if (container == null) return OperationStatus.NoOperation(evtMsgs); @@ -190,8 +191,9 @@ namespace Umbraco.Core.Services /// public IDataTypeDefinition GetDataTypeDefinitionByName(string name) { - using (var repository = RepositoryFactory.CreateDataTypeDefinitionRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.GetByQuery(repository.Query.Where(x => x.Name == name)).FirstOrDefault(); } } @@ -203,8 +205,9 @@ namespace Umbraco.Core.Services /// public IDataTypeDefinition GetDataTypeDefinitionById(int id) { - using (var repository = RepositoryFactory.CreateDataTypeDefinitionRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.Get(id); } } @@ -216,8 +219,9 @@ namespace Umbraco.Core.Services /// public IDataTypeDefinition GetDataTypeDefinitionById(Guid id) { - using (var repository = RepositoryFactory.CreateDataTypeDefinitionRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var query = repository.Query.Where(x => x.Key == id); var definitions = repository.GetByQuery(query); return definitions.FirstOrDefault(); @@ -231,8 +235,9 @@ namespace Umbraco.Core.Services /// Collection of objects with a matching contorl id public IEnumerable GetDataTypeDefinitionByPropertyEditorAlias(string propertyEditorAlias) { - using (var repository = RepositoryFactory.CreateDataTypeDefinitionRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var query = repository.Query.Where(x => x.PropertyEditorAlias == propertyEditorAlias); var definitions = repository.GetByQuery(query); return definitions; @@ -246,8 +251,9 @@ namespace Umbraco.Core.Services /// An enumerable list of objects public IEnumerable GetAllDataTypeDefinitions(params int[] ids) { - using (var repository = RepositoryFactory.CreateDataTypeDefinitionRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.GetAll(ids); } } @@ -259,8 +265,9 @@ namespace Umbraco.Core.Services /// An enumerable list of string values public IEnumerable GetPreValuesByDataTypeId(int id) { - using (var repository = RepositoryFactory.CreateDataTypeDefinitionRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var collection = repository.GetPreValuesCollectionByDataTypeId(id); //now convert the collection to a string list var list = collection.FormatAsDictionary() @@ -277,8 +284,9 @@ namespace Umbraco.Core.Services /// public PreValueCollection GetPreValuesCollectionByDataTypeId(int id) { - using (var repository = RepositoryFactory.CreateDataTypeDefinitionRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.GetPreValuesCollectionByDataTypeId(id); } } @@ -290,8 +298,9 @@ namespace Umbraco.Core.Services /// PreValue as a string public string GetPreValueAsString(int id) { - using (var repository = RepositoryFactory.CreateDataTypeDefinitionRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.GetPreValueAsString(id); } } @@ -310,10 +319,11 @@ namespace Umbraco.Core.Services } var moveInfo = new List>(); - var uow = UowProvider.GetUnitOfWork(); - using (var containerRepository = RepositoryFactory.CreateEntityContainerRepository(uow, Constants.ObjectTypes.DataTypeContainerGuid)) - using (var repository = RepositoryFactory.CreateDataTypeDefinitionRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var containerRepository = uow.CreateRepository(); + var repository = uow.CreateRepository(); + try { EntityContainer container = null; @@ -349,9 +359,9 @@ namespace Umbraco.Core.Services if (Saving.IsRaisedEventCancelled(new SaveEventArgs(dataTypeDefinition), this)) return; - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateDataTypeDefinitionRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); dataTypeDefinition.CreatorId = userId; repository.AddOrUpdate(dataTypeDefinition); uow.Commit(); @@ -386,9 +396,9 @@ namespace Umbraco.Core.Services return; } - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateDataTypeDefinitionRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); foreach (var dataTypeDefinition in dataTypeDefinitions) { dataTypeDefinition.CreatorId = userId; @@ -470,9 +480,9 @@ namespace Umbraco.Core.Services { //TODO: Should we raise an event here since we are really saving values for the data type? - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateDataTypeDefinitionRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); repository.AddOrUpdatePreValues(dataTypeDefinition, values); uow.Commit(); } @@ -489,9 +499,9 @@ namespace Umbraco.Core.Services if (Saving.IsRaisedEventCancelled(new SaveEventArgs(dataTypeDefinition), this)) return; - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateDataTypeDefinitionRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); dataTypeDefinition.CreatorId = userId; //add/update the dtd @@ -522,10 +532,10 @@ namespace Umbraco.Core.Services { if (Deleting.IsRaisedEventCancelled(new DeleteEventArgs(dataTypeDefinition), this)) return; - - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateDataTypeDefinitionRepository(uow)) - { + + using (var uow = UowProvider.GetUnitOfWork()) + { + var repository = uow.CreateRepository(); repository.Delete(dataTypeDefinition); uow.Commit(); @@ -538,10 +548,10 @@ namespace Umbraco.Core.Services private void Audit(AuditType type, string message, int userId, int objectId) { - var uow = UowProvider.GetUnitOfWork(); - using (var auditRepo = RepositoryFactory.CreateAuditRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { - auditRepo.AddOrUpdate(new AuditItem(objectId, message, type, userId)); + var repo = uow.CreateRepository(); + repo.AddOrUpdate(new AuditItem(objectId, message, type, userId)); uow.Commit(); } } diff --git a/src/Umbraco.Core/Services/DomainService.cs b/src/Umbraco.Core/Services/DomainService.cs index 3ffcb92778..ba1dd81677 100644 --- a/src/Umbraco.Core/Services/DomainService.cs +++ b/src/Umbraco.Core/Services/DomainService.cs @@ -6,6 +6,7 @@ using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.Querying; +using Umbraco.Core.Persistence.Repositories; using Umbraco.Core.Persistence.UnitOfWork; namespace Umbraco.Core.Services @@ -19,9 +20,9 @@ namespace Umbraco.Core.Services public bool Exists(string domainName) { - var uow = UowProvider.GetUnitOfWork(); - using (var repo = RepositoryFactory.CreateDomainRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repo = uow.CreateRepository(); return repo.Exists(domainName); } } @@ -36,9 +37,9 @@ namespace Umbraco.Core.Services return OperationStatus.Cancelled(evtMsgs); } - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateDomainRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); repository.Delete(domain); uow.Commit(); } @@ -50,36 +51,36 @@ namespace Umbraco.Core.Services public IDomain GetByName(string name) { - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateDomainRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.GetByName(name); } } public IDomain GetById(int id) { - var uow = UowProvider.GetUnitOfWork(); - using (var repo = RepositoryFactory.CreateDomainRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repo = uow.CreateRepository(); return repo.Get(id); } } public IEnumerable GetAll(bool includeWildcards) { - var uow = UowProvider.GetUnitOfWork(); - using (var repo = RepositoryFactory.CreateDomainRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repo = uow.CreateRepository(); return repo.GetAll(includeWildcards); } } public IEnumerable GetAssignedDomains(int contentId, bool includeWildcards) { - var uow = UowProvider.GetUnitOfWork(); - using (var repo = RepositoryFactory.CreateDomainRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repo = uow.CreateRepository(); return repo.GetAssignedDomains(contentId, includeWildcards); } } @@ -94,9 +95,9 @@ namespace Umbraco.Core.Services return OperationStatus.Cancelled(evtMsgs); } - var uow = UowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateDomainRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); repository.AddOrUpdate(domainEntity); uow.Commit(); } diff --git a/src/Umbraco.Core/Services/EntityService.cs b/src/Umbraco.Core/Services/EntityService.cs index 6fa5e521b9..200280ad98 100644 --- a/src/Umbraco.Core/Services/EntityService.cs +++ b/src/Umbraco.Core/Services/EntityService.cs @@ -11,6 +11,7 @@ using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.Querying; +using Umbraco.Core.Persistence.Repositories; using Umbraco.Core.Persistence.UnitOfWork; namespace Umbraco.Core.Services @@ -152,8 +153,9 @@ namespace Umbraco.Core.Services { if (loadBaseType) { - using (var repository = RepositoryFactory.CreateEntityRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.GetByKey(key); } } @@ -182,8 +184,9 @@ namespace Umbraco.Core.Services { if (loadBaseType) { - using (var repository = RepositoryFactory.CreateEntityRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.Get(id); } } @@ -201,8 +204,9 @@ namespace Umbraco.Core.Services if (loadBaseType) { var objectTypeId = umbracoObjectType.GetGuid(); - using (var repository = RepositoryFactory.CreateEntityRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.GetByKey(key, objectTypeId); } } @@ -232,8 +236,9 @@ namespace Umbraco.Core.Services if (loadBaseType) { var objectTypeId = umbracoObjectType.GetGuid(); - using (var repository = RepositoryFactory.CreateEntityRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.Get(id, objectTypeId); } } @@ -264,8 +269,9 @@ namespace Umbraco.Core.Services { if (loadBaseType) { - using (var repository = RepositoryFactory.CreateEntityRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.Get(id); } } @@ -288,8 +294,9 @@ namespace Umbraco.Core.Services /// An public virtual IUmbracoEntity GetParent(int id) { - using (var repository = RepositoryFactory.CreateEntityRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var entity = repository.Get(id); if (entity.ParentId == -1 || entity.ParentId == -20 || entity.ParentId == -21) return null; @@ -306,8 +313,9 @@ namespace Umbraco.Core.Services /// An public virtual IUmbracoEntity GetParent(int id, UmbracoObjectTypes umbracoObjectType) { - using (var repository = RepositoryFactory.CreateEntityRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var entity = repository.Get(id); if (entity.ParentId == -1 || entity.ParentId == -20 || entity.ParentId == -21) return null; @@ -324,8 +332,9 @@ namespace Umbraco.Core.Services /// An enumerable list of objects public virtual IEnumerable GetChildren(int parentId) { - using (var repository = RepositoryFactory.CreateEntityRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var query = repository.Query.Where(x => x.ParentId == parentId); var contents = repository.GetByQuery(query); @@ -342,8 +351,9 @@ namespace Umbraco.Core.Services public virtual IEnumerable GetChildren(int parentId, UmbracoObjectTypes umbracoObjectType) { var objectTypeId = umbracoObjectType.GetGuid(); - using (var repository = RepositoryFactory.CreateEntityRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var query = repository.Query.Where(x => x.ParentId == parentId); var contents = repository.GetByQuery(query, objectTypeId).ToList(); // run within using! @@ -358,8 +368,9 @@ namespace Umbraco.Core.Services /// An enumerable list of objects public virtual IEnumerable GetDescendents(int id) { - using (var repository = RepositoryFactory.CreateEntityRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var entity = repository.Get(id); var pathMatch = entity.Path + ","; var query = repository.Query.Where(x => x.Path.StartsWith(pathMatch) && x.Id != id); @@ -378,8 +389,9 @@ namespace Umbraco.Core.Services public virtual IEnumerable GetDescendents(int id, UmbracoObjectTypes umbracoObjectType) { var objectTypeId = umbracoObjectType.GetGuid(); - using (var repository = RepositoryFactory.CreateEntityRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var entity = repository.Get(id); var query = repository.Query.Where(x => x.Path.StartsWith(entity.Path) && x.Id != id); var entities = repository.GetByQuery(query, objectTypeId); @@ -396,8 +408,9 @@ namespace Umbraco.Core.Services public virtual IEnumerable GetRootEntities(UmbracoObjectTypes umbracoObjectType) { var objectTypeId = umbracoObjectType.GetGuid(); - using (var repository = RepositoryFactory.CreateEntityRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var query = repository.Query.Where(x => x.ParentId == -1); var entities = repository.GetByQuery(query, objectTypeId); @@ -440,8 +453,9 @@ namespace Umbraco.Core.Services }); var objectTypeId = umbracoObjectType.GetGuid(); - using (var repository = RepositoryFactory.CreateEntityRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.GetAll(objectTypeId, ids); } } @@ -457,8 +471,9 @@ namespace Umbraco.Core.Services }); var objectTypeId = umbracoObjectType.GetGuid(); - using (var repository = RepositoryFactory.CreateEntityRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.GetAll(objectTypeId, keys); } } @@ -480,8 +495,9 @@ namespace Umbraco.Core.Services ("The passed in type is not supported"); }); - using (var repository = RepositoryFactory.CreateEntityRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.GetAll(objectTypeId, ids); } } diff --git a/src/Umbraco.Core/Services/ExternalLoginService.cs b/src/Umbraco.Core/Services/ExternalLoginService.cs index 45c36d3934..ce31eb734b 100644 --- a/src/Umbraco.Core/Services/ExternalLoginService.cs +++ b/src/Umbraco.Core/Services/ExternalLoginService.cs @@ -1,11 +1,10 @@ using System.Collections.Generic; -using System.Linq; using Microsoft.AspNet.Identity; using Umbraco.Core.Events; using Umbraco.Core.Logging; using Umbraco.Core.Models.Identity; using Umbraco.Core.Persistence; -using Umbraco.Core.Persistence.Querying; +using Umbraco.Core.Persistence.Repositories; using Umbraco.Core.Persistence.UnitOfWork; namespace Umbraco.Core.Services @@ -14,8 +13,7 @@ namespace Umbraco.Core.Services { public ExternalLoginService(IDatabaseUnitOfWorkProvider provider, RepositoryFactory repositoryFactory, ILogger logger, IEventMessagesFactory eventMessagesFactory) : base(provider, repositoryFactory, logger, eventMessagesFactory) - { - } + { } /// /// Returns all user logins assigned @@ -23,9 +21,10 @@ namespace Umbraco.Core.Services /// /// public IEnumerable GetAll(int userId) - { - using (var repo = RepositoryFactory.CreateExternalLoginRepository(UowProvider.GetUnitOfWork())) + { + using (var uow = UowProvider.GetUnitOfWork()) { + var repo = uow.CreateRepository(); return repo.GetByQuery(repo.Query.Where(x => x.UserId == userId)); } } @@ -38,8 +37,9 @@ namespace Umbraco.Core.Services /// public IEnumerable Find(UserLoginInfo login) { - using (var repo = RepositoryFactory.CreateExternalLoginRepository(UowProvider.GetUnitOfWork())) + using (var uow = UowProvider.GetUnitOfWork()) { + var repo = uow.CreateRepository(); return repo.GetByQuery(repo.Query .Where(x => x.ProviderKey == login.ProviderKey && x.LoginProvider == login.LoginProvider)); } @@ -52,9 +52,9 @@ namespace Umbraco.Core.Services /// public void SaveUserLogins(int userId, IEnumerable logins) { - var uow = UowProvider.GetUnitOfWork(); - using (var repo = RepositoryFactory.CreateExternalLoginRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repo = uow.CreateRepository(); repo.SaveUserLogins(userId, logins); uow.Commit(); } @@ -66,14 +66,12 @@ namespace Umbraco.Core.Services /// public void DeleteUserLogins(int userId) { - var uow = UowProvider.GetUnitOfWork(); - using (var repo = RepositoryFactory.CreateExternalLoginRepository(uow)) + using (var uow = UowProvider.GetUnitOfWork()) { + var repo = uow.CreateRepository(); repo.DeleteUserLogins(userId); uow.Commit(); } } - - } } \ No newline at end of file diff --git a/src/Umbraco.Core/Services/FileService.cs b/src/Umbraco.Core/Services/FileService.cs index c91ecb44a9..71aba313ae 100644 --- a/src/Umbraco.Core/Services/FileService.cs +++ b/src/Umbraco.Core/Services/FileService.cs @@ -50,8 +50,9 @@ namespace Umbraco.Core.Services /// An enumerable list of objects public IEnumerable GetStylesheets(params string[] names) { - using (var repository = RepositoryFactory.CreateStylesheetRepository(_fileUowProvider.GetUnitOfWork(), UowProvider.GetUnitOfWork())) + using (var uow = _fileUowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.GetAll(names); } } @@ -63,8 +64,9 @@ namespace Umbraco.Core.Services /// A object public Stylesheet GetStylesheetByName(string name) { - using (var repository = RepositoryFactory.CreateStylesheetRepository(_fileUowProvider.GetUnitOfWork(), UowProvider.GetUnitOfWork())) + using (var uow = _fileUowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.Get(name); } } @@ -79,9 +81,9 @@ namespace Umbraco.Core.Services if (SavingStylesheet.IsRaisedEventCancelled(new SaveEventArgs(stylesheet), this)) return; - var uow = _fileUowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateStylesheetRepository(uow, UowProvider.GetUnitOfWork())) + using (var uow = _fileUowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); repository.AddOrUpdate(stylesheet); uow.Commit(); @@ -98,9 +100,9 @@ namespace Umbraco.Core.Services /// public void DeleteStylesheet(string path, int userId = 0) { - var uow = _fileUowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateStylesheetRepository(uow, UowProvider.GetUnitOfWork())) + using (var uow = _fileUowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); var stylesheet = repository.Get(path); if (stylesheet == null) return; @@ -123,10 +125,9 @@ namespace Umbraco.Core.Services /// True if Stylesheet is valid, otherwise false public bool ValidateStylesheet(Stylesheet stylesheet) { - - var uow = _fileUowProvider.GetUnitOfWork(); - using (var repository = RepositoryFactory.CreateStylesheetRepository(uow, UowProvider.GetUnitOfWork())) + using (var uow = _fileUowProvider.GetUnitOfWork()) { + var repository = uow.CreateRepository(); return repository.ValidateStylesheet(stylesheet); } } @@ -140,8 +141,9 @@ namespace Umbraco.Core.Services /// An enumerable list of objects public IEnumerable