From c9f40a74def17e9c612d45cbe61a1db05235b504 Mon Sep 17 00:00:00 2001 From: Shannon Deminick Date: Mon, 10 Dec 2012 02:58:23 +0500 Subject: [PATCH] Changed all data services to create one repository type in the constructor instead of resolving them in each method since they are only supposed to be using their single unit of work anyways (resolving will return the same repository anyways, but in some cases it might have been with a different UOW) Removed SetUnitOfWork method on IRepository as this is not needed. Removed the old implementation of RepositoryResolver and replaces it with the RepositoryInstanceResolver (but maintained the name of RepositoryResolver) --- src/Umbraco.Core/CoreBootManager.cs | 4 +- src/Umbraco.Core/Models/ContentExtensions.cs | 7 +- .../Interfaces/IDictionaryRepository.cs | 2 +- .../Repositories/Interfaces/IRepository.cs | 13 +- ...nstanceFactory.cs => RepositoryFactory.cs} | 21 +- .../Persistence/RepositoryInstanceResolver.cs | 55 ---- .../RepositoryInstanceTypeAttribute.cs | 23 -- .../Persistence/RepositoryResolver.cs | 219 ++++----------- src/Umbraco.Core/Services/ContentService.cs | 58 ++-- .../Services/ContentTypeService.cs | 38 +-- src/Umbraco.Core/Services/DataTypeService.cs | 17 +- src/Umbraco.Core/Services/FileService.cs | 30 +- .../Services/LocalizationService.cs | 30 +- src/Umbraco.Core/Services/MacroService.cs | 10 +- src/Umbraco.Core/Services/MediaService.cs | 26 +- src/Umbraco.Core/Services/UserService.cs | 4 +- src/Umbraco.Core/Umbraco.Core.csproj | 4 +- .../Repositories/ContentRepositoryTest.cs | 44 +-- .../Repositories/ContentTypeRepositoryTest.cs | 20 +- .../Repositories/MediaRepositoryTest.cs | 32 +-- .../Repositories/MediaTypeRepositoryTest.cs | 20 +- .../RepositoryInstanceResolverTests.cs | 52 ---- .../Persistence/RepositoryResolverTests.cs | 256 +++--------------- .../Services/ContentServicePerformanceTest.cs | 8 +- .../Services/ContentServiceTests.cs | 2 +- .../TestHelpers/BaseDatabaseFactoryTest.cs | 6 +- src/Umbraco.Tests/Umbraco.Tests.csproj | 1 - src/Umbraco.Web.UI/Umbraco.Web.UI.csproj | 2 +- 28 files changed, 301 insertions(+), 703 deletions(-) rename src/Umbraco.Core/Persistence/{RepositoryInstanceFactory.cs => RepositoryFactory.cs} (70%) delete mode 100644 src/Umbraco.Core/Persistence/RepositoryInstanceResolver.cs delete mode 100644 src/Umbraco.Core/Persistence/RepositoryInstanceTypeAttribute.cs delete mode 100644 src/Umbraco.Tests/Persistence/RepositoryInstanceResolverTests.cs diff --git a/src/Umbraco.Core/CoreBootManager.cs b/src/Umbraco.Core/CoreBootManager.cs index 0ac6d18cd7..8480fbf51c 100644 --- a/src/Umbraco.Core/CoreBootManager.cs +++ b/src/Umbraco.Core/CoreBootManager.cs @@ -97,8 +97,8 @@ namespace Umbraco.Core /// protected virtual void InitializeResolvers() { - RepositoryInstanceResolver.Current = new RepositoryInstanceResolver( - new RepositoryInstanceFactory()); + RepositoryResolver.Current = new RepositoryResolver( + new RepositoryFactory()); CacheRefreshersResolver.Current = new CacheRefreshersResolver( PluginManager.Current.ResolveCacheRefreshers()); diff --git a/src/Umbraco.Core/Models/ContentExtensions.cs b/src/Umbraco.Core/Models/ContentExtensions.cs index 9792503862..fa5b470979 100644 --- a/src/Umbraco.Core/Models/ContentExtensions.cs +++ b/src/Umbraco.Core/Models/ContentExtensions.cs @@ -3,6 +3,7 @@ using System.Linq; using Umbraco.Core.Models.Membership; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.Repositories; +using Umbraco.Core.Persistence.UnitOfWork; namespace Umbraco.Core.Models { @@ -49,7 +50,8 @@ namespace Umbraco.Core.Models /// public static IProfile GetCreatorProfile(this IContent content) { - var repository = RepositoryResolver.ResolveByType(null); + var repository = RepositoryResolver.Current.Factory.CreateUserRepository( + new PetaPocoUnitOfWork()); return repository.GetProfileById(content.CreatorId); } @@ -58,7 +60,8 @@ namespace Umbraco.Core.Models /// public static IProfile GetWriterProfile(this IContent content) { - var repository = RepositoryResolver.ResolveByType(null); + var repository = RepositoryResolver.Current.Factory.CreateUserRepository( + new PetaPocoUnitOfWork()); return repository.GetProfileById(content.WriterId); } } diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IDictionaryRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IDictionaryRepository.cs index 08e2de5cc1..b74dd08477 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IDictionaryRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IDictionaryRepository.cs @@ -2,7 +2,7 @@ namespace Umbraco.Core.Persistence.Repositories { - internal interface IDictionaryRepository : IRepositoryQueryable + public interface IDictionaryRepository : IRepositoryQueryable { } diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IRepository.cs index d4a277a761..e3400d18d1 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IRepository.cs @@ -3,13 +3,16 @@ using Umbraco.Core.Persistence.UnitOfWork; namespace Umbraco.Core.Persistence.Repositories { + /// + /// Defines the base implementation of a Repository + /// + /// + /// Currently this interface is empty but it is useful for flagging a repository without having generic parameters, it also might + /// come in handy if we need to add anything to the base/non-generic repository interface. + /// public interface IRepository { - /// - /// Sets the Unit Of Work for the Repository - /// - /// - void SetUnitOfWork(IUnitOfWork work); + } /// diff --git a/src/Umbraco.Core/Persistence/RepositoryInstanceFactory.cs b/src/Umbraco.Core/Persistence/RepositoryFactory.cs similarity index 70% rename from src/Umbraco.Core/Persistence/RepositoryInstanceFactory.cs rename to src/Umbraco.Core/Persistence/RepositoryFactory.cs index 6f8212bc4b..0255841d80 100644 --- a/src/Umbraco.Core/Persistence/RepositoryInstanceFactory.cs +++ b/src/Umbraco.Core/Persistence/RepositoryFactory.cs @@ -7,10 +7,9 @@ namespace Umbraco.Core.Persistence /// /// Used to instantiate each repository type /// - public class RepositoryInstanceFactory + public class RepositoryFactory { - [RepositoryInstanceType(typeof(IUserTypeRepository))] internal virtual IUserTypeRepository CreateUserTypeRepository(IUnitOfWork uow) { return new UserTypeRepository( @@ -19,7 +18,6 @@ namespace Umbraco.Core.Persistence } - [RepositoryInstanceType(typeof(IUserRepository))] internal virtual IUserRepository CreateUserRepository(IUnitOfWork uow) { return new UserRepository( @@ -29,7 +27,6 @@ namespace Umbraco.Core.Persistence } - [RepositoryInstanceType(typeof(IContentRepository))] public virtual IContentRepository CreateContentRepository(IUnitOfWork uow) { return new ContentRepository( @@ -39,7 +36,6 @@ namespace Umbraco.Core.Persistence CreateTemplateRepository(uow)); } - [RepositoryInstanceType(typeof(IContentTypeRepository))] public virtual IContentTypeRepository CreateContentTypeRepository(IUnitOfWork uow) { return new ContentTypeRepository( @@ -48,7 +44,6 @@ namespace Umbraco.Core.Persistence new TemplateRepository(uow, NullCacheProvider.Current)); } - [RepositoryInstanceType(typeof(IDataTypeDefinitionRepository))] public virtual IDataTypeDefinitionRepository CreateDataTypeDefinitionRepository(IUnitOfWork uow) { return new DataTypeDefinitionRepository( @@ -56,9 +51,7 @@ namespace Umbraco.Core.Persistence NullCacheProvider.Current); } - //TODO: Shouldn't IDictionaryRepository be public? - [RepositoryInstanceType(typeof(IDictionaryRepository))] - internal virtual IDictionaryRepository CreateDictionaryRepository(IUnitOfWork uow) + public virtual IDictionaryRepository CreateDictionaryRepository(IUnitOfWork uow) { return new DictionaryRepository( uow, @@ -66,7 +59,6 @@ namespace Umbraco.Core.Persistence CreateLanguageRepository(uow)); } - [RepositoryInstanceType(typeof(ILanguageRepository))] public virtual ILanguageRepository CreateLanguageRepository(IUnitOfWork uow) { return new LanguageRepository( @@ -74,8 +66,6 @@ namespace Umbraco.Core.Persistence InMemoryCacheProvider.Current); } - //TODO: Shouldn't IMacroRepository be public? - [RepositoryInstanceType(typeof(IMacroRepository))] internal virtual IMacroRepository CreateMacroRepository(IUnitOfWork uow) { return new MacroRepository( @@ -83,7 +73,6 @@ namespace Umbraco.Core.Persistence InMemoryCacheProvider.Current); } - [RepositoryInstanceType(typeof(IMediaRepository))] public virtual IMediaRepository CreateMediaRepository(IUnitOfWork uow) { return new MediaRepository( @@ -92,7 +81,6 @@ namespace Umbraco.Core.Persistence CreateMediaTypeRepository(uow)); } - [RepositoryInstanceType(typeof(IMediaTypeRepository))] public virtual IMediaTypeRepository CreateMediaTypeRepository(IUnitOfWork uow) { return new MediaTypeRepository( @@ -100,7 +88,6 @@ namespace Umbraco.Core.Persistence InMemoryCacheProvider.Current); } - [RepositoryInstanceType(typeof(IRelationRepository))] public virtual IRelationRepository CreateRelationRepository(IUnitOfWork uow) { return new RelationRepository( @@ -109,7 +96,6 @@ namespace Umbraco.Core.Persistence CreateRelationTypeRepository(uow)); } - [RepositoryInstanceType(typeof(IRelationTypeRepository))] public virtual IRelationTypeRepository CreateRelationTypeRepository(IUnitOfWork uow) { return new RelationTypeRepository( @@ -117,19 +103,16 @@ namespace Umbraco.Core.Persistence NullCacheProvider.Current); } - [RepositoryInstanceType(typeof(IScriptRepository))] public virtual IScriptRepository CreateScriptRepository(IUnitOfWork uow) { return new ScriptRepository(uow); } - [RepositoryInstanceType(typeof(IStylesheetRepository))] public virtual IStylesheetRepository CreateStylesheetRepository(IUnitOfWork uow) { return new StylesheetRepository(uow); } - [RepositoryInstanceType(typeof(ITemplateRepository))] public virtual ITemplateRepository CreateTemplateRepository(IUnitOfWork uow) { return new TemplateRepository(uow, NullCacheProvider.Current); diff --git a/src/Umbraco.Core/Persistence/RepositoryInstanceResolver.cs b/src/Umbraco.Core/Persistence/RepositoryInstanceResolver.cs deleted file mode 100644 index 647abc00b9..0000000000 --- a/src/Umbraco.Core/Persistence/RepositoryInstanceResolver.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; -using System.Linq; -using System.Reflection; -using Umbraco.Core.ObjectResolution; -using Umbraco.Core.Persistence.UnitOfWork; - -namespace Umbraco.Core.Persistence -{ - /// - /// A resolver used to return the current implementation of the RepositoryInstanceFactory - /// - internal class RepositoryInstanceResolver : SingleObjectResolverBase - { - internal RepositoryInstanceResolver(RepositoryInstanceFactory registrar) - : base(registrar) - { - } - - /// - /// Can be used by developers at runtime to set their own RepositoryInstanceFactory at app startup - /// - /// - public void SetRepositoryInstanceFactory(RepositoryInstanceFactory factory) - { - Value = factory; - } - - /// - /// Return the repository based on the type - /// - /// - /// - /// - internal TRepository ResolveByType(IUnitOfWork unitOfWork) - { - //TODO: REMOVE all of these binding flags once the IDictionaryRepository, IMacroRepository are public! As this probably - // wont work in medium trust! - var createMethod = this.Value.GetType().GetMethods(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public) - .First(x => x.GetCustomAttributes(true).OfType() - .Any(instance => instance.InterfaceType.IsType())); - if (createMethod.GetParameters().Count() != 1 - || !createMethod.GetParameters().Single().ParameterType.IsType()) - { - throw new FormatException("The method " + createMethod.Name + " must only contain one parameter of type " + typeof(IUnitOfWork).FullName); - } - if (!createMethod.ReturnType.IsType()) - { - throw new FormatException("The method " + createMethod.Name + " must return the type " + typeof(TRepository).FullName); - } - - return (TRepository) createMethod.Invoke(this.Value, new object[] {unitOfWork}); - } - - } -} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/RepositoryInstanceTypeAttribute.cs b/src/Umbraco.Core/Persistence/RepositoryInstanceTypeAttribute.cs deleted file mode 100644 index 4dc7fddcf1..0000000000 --- a/src/Umbraco.Core/Persistence/RepositoryInstanceTypeAttribute.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; - -namespace Umbraco.Core.Persistence -{ - /// - /// Used to decorate each method of the class RepositoryInstanceFactory (or derived classes) to inform the system of what - /// type of Repository the method will be returning. - /// - /// - /// The reason for this attribute is because the RepositoryInstanceFactory (or derived classes) might contain methods multiple - /// methods that return the interface repository being asked for so we cannot simply rely on the return type of the methods. - /// - [AttributeUsage(AttributeTargets.Method)] - public class RepositoryInstanceTypeAttribute : Attribute - { - public Type InterfaceType { get; private set; } - - public RepositoryInstanceTypeAttribute(Type interfaceType) - { - InterfaceType = interfaceType; - } - } -} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/RepositoryResolver.cs b/src/Umbraco.Core/Persistence/RepositoryResolver.cs index 0e465e06a8..a6dd431652 100644 --- a/src/Umbraco.Core/Persistence/RepositoryResolver.cs +++ b/src/Umbraco.Core/Persistence/RepositoryResolver.cs @@ -1,184 +1,65 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; +using System; using System.Linq; using System.Reflection; -using Umbraco.Core.Configuration.InfrastructureSettings; -using Umbraco.Core.Persistence.Caching; +using Umbraco.Core.ObjectResolution; using Umbraco.Core.Persistence.Repositories; using Umbraco.Core.Persistence.UnitOfWork; namespace Umbraco.Core.Persistence { - internal class RepositoryResolver - { - private static readonly ConcurrentDictionary Repositories = new ConcurrentDictionary(); + /// + /// A resolver used to return the current implementation of the RepositoryInstanceFactory + /// + internal class RepositoryResolver : SingleObjectResolverBase + { + internal RepositoryResolver(RepositoryFactory registrar) + : base(registrar) + { + } - //GetRepository based on Repository Interface and Model Entity. - //Check if Dictionary contains the interface name of the Repository, ea. IContentRepository - //- If it does return the repository from the dictionary and set the new UnitOfWork object - //Otherwise look for the full type for the repository in config - //- If type exists check depedencies, create new object, add it to dictionary and return it - //Otherwise look for an entity type in the config - //- If type exists check dependencies, create new object, add it to dictionary and return it - //If we have come this far the correct types wasn't found and we throw an exception - internal static TRepository ResolveByType(IUnitOfWork unitOfWork) - where TRepository : class, IRepository - { - //Initialize the provider's default value - var repository = default(TRepository); + /// + /// Can be used by developers at runtime to set their own RepositoryInstanceFactory at app startup + /// + /// + public void SetRepositoryInstanceFactory(RepositoryFactory factory) + { + Value = factory; + } - var interfaceShortName = typeof(TRepository).Name; - //string entityTypeName = typeof(TEntity).Name; + /// + /// Returns the RepositoryInstanceFactory object + /// + internal RepositoryFactory Factory + { + get { return Value; } + } - //Check if the repository has already been created and is in the cache - //SD: Changed to TryGetValue as this will be a bit quicker since if we do a ContainsKey and then resolve, - // the underlying ConcurrentDictionary does this twice and thus does two locks. - object repositoryObject; - if (Repositories.TryGetValue(interfaceShortName, out repositoryObject)) + /// + /// Return the repository based on the type + /// + /// + /// + /// + internal TRepository ResolveByType(IUnitOfWork unitOfWork) + where TRepository : class, IRepository + { + //TODO: REMOVE all of these binding flags once the IDictionaryRepository, IMacroRepository are public! As this probably + // wont work in medium trust! + var createMethod = this.Value.GetType().GetMethods() + .First(x => x.Name == "Create" + typeof (TRepository).Name.Substring(1)); + + if (createMethod.GetParameters().Count() != 1 + || !createMethod.GetParameters().Single().ParameterType.IsType()) { - repository = (TRepository)repositoryObject; - if (unitOfWork != null) - { - repository.SetUnitOfWork(unitOfWork); - } - return repository; + throw new FormatException("The method " + createMethod.Name + " must only contain one parameter of type " + typeof(IUnitOfWork).FullName); + } + if (!createMethod.ReturnType.IsType()) + { + throw new FormatException("The method " + createMethod.Name + " must return the type " + typeof(TRepository).FullName); } - repository = RepositoryInstanceResolver.Current.ResolveByType(unitOfWork); + return (TRepository) createMethod.Invoke(this.Value, new object[] {unitOfWork}); + } - //var settings = Infrastructure.Instance.Repositories; - - //Type repositoryType = null; - - ////Check if a valid interfaceShortName was passed in - //if (settings.Repository.ContainsKey(interfaceShortName)) - //{ - // repositoryType = Type.GetType(settings.Repository[interfaceShortName].RepositoryFullTypeName); - //} - //else - //{ - // foreach (Repository element in settings.Repository) - // { - // if (element.InterfaceShortTypeName.Contains(entityTypeName)) - // { - // repositoryType = Type.GetType(settings.Repository[element.InterfaceShortTypeName].RepositoryFullTypeName); - // break; - // } - // } - //} - - ////If the repository type is null we should stop and throw an exception - //if (repositoryType == null) - //{ - // throw new Exception(string.Format("No repository matching the Repository interface '{0}' or Entity type '{1}' could be resolved", - // interfaceShortName, entityTypeName)); - //} - - ////Resolve the repository with its constructor dependencies - //repository = Resolve(repositoryType, unitOfWork, interfaceShortName) as TRepository; - - //Add the new repository instance to the cache - Repositories.AddOrUpdate(interfaceShortName, repository, (x, y) => repository); - - return repository; - } - - //Recursive create and dependency check - private static object Resolve(Type repositoryType, IUnitOfWork unitOfWork, string interfaceShortName) - { - var constructors = repositoryType.GetConstructors(); - var constructor = constructors.LastOrDefault(); - if (constructor == null) - { - throw new Exception(string.Format("No public constructor was found on {0}", repositoryType.FullName)); - } - - var constructorArgs = new List(); - var settings = Infrastructure.Instance.Repositories; - - var parameters = constructor.GetParameters(); - foreach (var parameter in parameters) - { - if (parameter.ParameterType.Name.Equals("IUnitOfWork")) - { - constructorArgs.Add(unitOfWork); - } - else if (Repositories.ContainsKey(parameter.ParameterType.Name)) - { - var repo = Repositories[parameter.ParameterType.Name]; - constructorArgs.Add(repo); - } - else if(parameter.ParameterType.Name.Equals(typeof(IRepositoryCacheProvider).Name)) - { - //Get the Type of the cache provider and activate the singleton instance - var cacheType = Type.GetType(settings.Repository[interfaceShortName].CacheProviderFullTypeName); - if (cacheType == null) - throw new Exception(string.Format("Unable to get the type of cache provider '{0}' from configuration while creating an instance of {1}", - settings.Repository[parameter.ParameterType.Name]. - CacheProviderFullTypeName, - parameter.ParameterType.Name)); - - var cacheProvider = cacheType.InvokeMember("Current", BindingFlags.GetProperty, null, cacheType, new object[0]); - constructorArgs.Add(cacheProvider); - } - else - { - if (settings.Repository.ContainsKey(parameter.ParameterType.Name)) - { - //Get the Type of the repository and resolve the object - var repoType = Type.GetType(settings.Repository[parameter.ParameterType.Name].RepositoryFullTypeName); - var repo = Resolve(repoType, unitOfWork, parameter.ParameterType.Name); - - // Add the new repository instance to the cache - Repositories.AddOrUpdate(parameter.ParameterType.Name, repo, (x, y) => repo); - - //Add the new repository to the constructor - constructorArgs.Add(repo); - } - else - { - throw new Exception("Cannot create the Repository. There was one or more invalid repository configuration settings."); - } - } - } - - if (parameters.Count() != constructorArgs.Count) - throw new Exception( - string.Format( - "The amount of expected parameters is different from the amount of constructed parameters, which is confusing! Repository of type '{0}' could not be created.", - repositoryType.FullName)); - - var repositoryObj = Activator.CreateInstance(repositoryType, constructorArgs.ToArray()); - return repositoryObj; - } - - /// - /// Register all repositories by interating the configuration and adding the repositories to the internal cache (Dictionary) - /// - internal static void RegisterRepositories() - { - var settings = Infrastructure.Instance.Repositories; - - foreach (Repository element in settings.Repository) - { - if (Repositories.ContainsKey(element.InterfaceShortTypeName)) continue; - - var repositoryType = Type.GetType(settings.Repository[element.InterfaceShortTypeName].RepositoryFullTypeName); - var repository = Resolve(repositoryType, null, element.InterfaceShortTypeName); - - //Add the new repository instance to the cache - Repositories.AddOrUpdate(element.InterfaceShortTypeName, repository, (x, y) => repository); - } - } - - /// - /// Returns the number of repositories that has been registered - /// - /// - internal static int RegisteredRepositories() - { - return Repositories.Count; - } - } + } } \ No newline at end of file diff --git a/src/Umbraco.Core/Services/ContentService.cs b/src/Umbraco.Core/Services/ContentService.cs index 1ce3949db4..3104bec51f 100644 --- a/src/Umbraco.Core/Services/ContentService.cs +++ b/src/Umbraco.Core/Services/ContentService.cs @@ -22,11 +22,15 @@ namespace Umbraco.Core.Services private readonly IUserService _userService; private readonly IUnitOfWork _unitOfWork; private HttpContextBase _httpContext; + private readonly IContentRepository _contentRepository; + private readonly IContentTypeRepository _contentTypeRepository; public ContentService(IUnitOfWorkProvider provider, IPublishingStrategy publishingStrategy) { _publishingStrategy = publishingStrategy; _unitOfWork = provider.GetUnitOfWork(); + _contentRepository = RepositoryResolver.Current.Factory.CreateContentRepository(_unitOfWork); + _contentTypeRepository = RepositoryResolver.Current.Factory.CreateContentTypeRepository(_unitOfWork); } internal ContentService(IUnitOfWorkProvider provider, IPublishingStrategy publishingStrategy, IUserService userService) @@ -34,6 +38,8 @@ namespace Umbraco.Core.Services _publishingStrategy = publishingStrategy; _userService = userService; _unitOfWork = provider.GetUnitOfWork(); + _contentRepository = RepositoryResolver.Current.Factory.CreateContentRepository(_unitOfWork); + _contentTypeRepository = RepositoryResolver.Current.Factory.CreateContentTypeRepository(_unitOfWork); } //TODO Add GetLatestUnpublishedVersions(int id){} @@ -48,7 +54,7 @@ namespace Umbraco.Core.Services /// public IContent CreateContent(int parentId, string contentTypeAlias, int userId = -1) { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _contentTypeRepository; var query = Query.Builder.Where(x => x.Alias == contentTypeAlias); var contentTypes = repository.GetByQuery(query); @@ -86,7 +92,7 @@ namespace Umbraco.Core.Services /// public IContent GetById(int id) { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _contentRepository; return repository.Get(id); } @@ -97,7 +103,7 @@ namespace Umbraco.Core.Services /// public IContent GetById(Guid key) { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _contentRepository; var query = Query.Builder.Where(x => x.Key == key); var contents = repository.GetByQuery(query); return contents.SingleOrDefault(); @@ -111,7 +117,7 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetContentOfContentType(int id) { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _contentRepository; var query = Query.Builder.Where(x => x.ContentTypeId == id); var contents = repository.GetByQuery(query); @@ -126,7 +132,7 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetByLevel(int level) { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _contentRepository; var query = Query.Builder.Where(x => x.Level == level); var contents = repository.GetByQuery(query); @@ -141,7 +147,7 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetChildren(int id) { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _contentRepository; var query = Query.Builder.Where(x => x.ParentId == id); var contents = repository.GetByQuery(query); @@ -156,7 +162,7 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetVersions(int id) { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _contentRepository; var versions = repository.GetAllVersions(id); return versions; } @@ -167,7 +173,7 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetRootContent() { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _contentRepository; var query = Query.Builder.Where(x => x.ParentId == -1); var contents = repository.GetByQuery(query); @@ -181,7 +187,7 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetContentForExpiration() { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _contentRepository; var query = Query.Builder.Where(x => x.Published == true && x.ExpireDate <= DateTime.UtcNow); var contents = repository.GetByQuery(query); @@ -195,7 +201,7 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetContentForRelease() { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _contentRepository; var query = Query.Builder.Where(x => x.Published == false && x.ReleaseDate <= DateTime.UtcNow); var contents = repository.GetByQuery(query); @@ -209,7 +215,7 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetContentInRecycleBin() { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _contentRepository; var query = Query.Builder.Where(x => x.ParentId == -20); var contents = repository.GetByQuery(query); @@ -224,7 +230,7 @@ namespace Umbraco.Core.Services /// True if publishing succeeded, otherwise False public bool RePublishAll(int userId = -1) { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _contentRepository; var list = new List(); @@ -280,7 +286,7 @@ namespace Umbraco.Core.Services /// True if publishing succeeded, otherwise False public bool PublishWithChildren(IContent content, int userId = -1) { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _contentRepository; //Check if parent is published (although not if its a root node) - if parent isn't published this Content cannot be published if (content.ParentId != -1 && content.ParentId != -20 && !GetById(content.ParentId).Published) @@ -336,7 +342,7 @@ namespace Umbraco.Core.Services /// True if unpublishing succeeded, otherwise False public bool UnPublish(IContent content, int userId = -1) { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _contentRepository; //Look for children and unpublish them if any exists, otherwise just unpublish the passed in Content. var children = GetChildrenDeep(content.Id); @@ -411,7 +417,7 @@ namespace Umbraco.Core.Services if (!e.Cancel) { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _contentRepository; //Check if parent is published (although not if its a root node) - if parent isn't published this Content cannot be published if (content.ParentId != -1 && content.ParentId != -20 && GetById(content.ParentId).Published == false) @@ -467,7 +473,7 @@ namespace Umbraco.Core.Services if (!e.Cancel) { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _contentRepository; SetWriter(content, userId); content.ChangePublishedState(false); @@ -490,7 +496,7 @@ namespace Umbraco.Core.Services /// Optional Id of the User saving the Content public void Save(IEnumerable contents, int userId = -1) { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _contentRepository; var containsNew = contents.Any(x => x.HasIdentity == false); var e = new SaveEventArgs(); @@ -538,7 +544,7 @@ namespace Umbraco.Core.Services /// Optional Id of the User saving the Content public void Save(IEnumerable> contents, int userId = -1) { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _contentRepository; var e = new SaveEventArgs(); if (Saving != null) @@ -565,7 +571,7 @@ namespace Umbraco.Core.Services /// Id of the public void DeleteContentOfType(int contentTypeId) { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _contentRepository; //NOTE What about content that has the contenttype as part of its composition? var query = Query.Builder.Where(x => x.ContentTypeId == contentTypeId); @@ -608,7 +614,7 @@ namespace Umbraco.Core.Services if (!e.Cancel) { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _contentRepository; SetWriter(content, userId); repository.Delete(content); _unitOfWork.Commit(); @@ -655,7 +661,7 @@ namespace Umbraco.Core.Services if (!e.Cancel) { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _contentRepository; repository.Delete(id, versionDate); if (Deleted != null) @@ -672,7 +678,7 @@ namespace Umbraco.Core.Services /// Optional Id of the User deleting versions of a Content object public void Delete(int id, Guid versionId, bool deletePriorVersions, int userId = -1) { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _contentRepository; if(deletePriorVersions) { @@ -703,7 +709,7 @@ namespace Umbraco.Core.Services { //TODO If content item has children those should also be moved to the recycle bin //TODO Unpublish deleted content + children - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _contentRepository; SetWriter(content, userId); content.ChangeTrashedState(true); repository.AddOrUpdate(content); @@ -761,7 +767,7 @@ namespace Umbraco.Core.Services /// public void EmptyRecycleBin() { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _contentRepository; var query = Query.Builder.Where(x => x.ParentId == -20); var contents = repository.GetByQuery(query); @@ -795,7 +801,7 @@ namespace Umbraco.Core.Services copy.ParentId = parentId; copy.Name = copy.Name + " (1)"; - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _contentRepository; SetWriter(content, userId); @@ -861,7 +867,7 @@ namespace Umbraco.Core.Services { var e = new RollbackEventArgs(); - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _contentRepository; var content = repository.GetByVersion(id, versionId); if (Rollingback != null) diff --git a/src/Umbraco.Core/Services/ContentTypeService.cs b/src/Umbraco.Core/Services/ContentTypeService.cs index a8a3d8cc8d..77c728d37b 100644 --- a/src/Umbraco.Core/Services/ContentTypeService.cs +++ b/src/Umbraco.Core/Services/ContentTypeService.cs @@ -20,6 +20,8 @@ namespace Umbraco.Core.Services private readonly IContentService _contentService; private readonly IMediaService _mediaService; private readonly IUnitOfWork _unitOfWork; + private readonly IContentTypeRepository _contentTypeRepository; + private readonly IMediaTypeRepository _mediaTypeRepository; public ContentTypeService(IContentService contentService, IMediaService mediaService) : this(contentService, mediaService, new PetaPocoUnitOfWorkProvider()) @@ -30,6 +32,8 @@ namespace Umbraco.Core.Services _contentService = contentService; _mediaService = mediaService; _unitOfWork = provider.GetUnitOfWork(); + _contentTypeRepository = RepositoryResolver.Current.Factory.CreateContentTypeRepository(_unitOfWork); + _mediaTypeRepository = RepositoryResolver.Current.Factory.CreateMediaTypeRepository(_unitOfWork); } /// @@ -39,7 +43,7 @@ namespace Umbraco.Core.Services /// public IContentType GetContentType(int id) { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _contentTypeRepository; return repository.Get(id); } @@ -50,7 +54,7 @@ namespace Umbraco.Core.Services /// public IContentType GetContentType(string alias) { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _contentTypeRepository; var query = Query.Builder.Where(x => x.Alias == alias); var contentTypes = repository.GetByQuery(query); @@ -65,7 +69,7 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetAllContentTypes(params int[] ids) { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _contentTypeRepository; return repository.GetAll(ids); } @@ -76,7 +80,7 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetContentTypeChildren(int id) { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _contentTypeRepository; var query = Query.Builder.Where(x => x.ParentId == id); var contentTypes = repository.GetByQuery(query); @@ -89,7 +93,7 @@ namespace Umbraco.Core.Services /// to save public void Save(IContentType contentType) { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _contentTypeRepository; repository.AddOrUpdate(contentType); _unitOfWork.Commit(); @@ -101,7 +105,7 @@ namespace Umbraco.Core.Services /// Collection of to save public void Save(IEnumerable contentTypes) { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _contentTypeRepository; foreach (var contentType in contentTypes) { @@ -121,7 +125,7 @@ namespace Umbraco.Core.Services /// Optional Id of the User saving the ContentTypes public void Save(IEnumerable> contentTypes, int userId = -1) { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _contentTypeRepository; foreach (var content in contentTypes) { content.Value.CreatorId = 0; @@ -141,7 +145,7 @@ namespace Umbraco.Core.Services { _contentService.DeleteContentOfType(contentType.Id); - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _contentTypeRepository; repository.Delete(contentType); _unitOfWork.Commit(); @@ -162,7 +166,7 @@ namespace Umbraco.Core.Services _contentService.DeleteContentOfType(contentType.Id); } - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _contentTypeRepository; foreach (var contentType in contentTypeList) { @@ -178,7 +182,7 @@ namespace Umbraco.Core.Services /// public IMediaType GetMediaType(int id) { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _mediaTypeRepository; return repository.Get(id); } @@ -189,7 +193,7 @@ namespace Umbraco.Core.Services /// public IMediaType GetMediaType(string alias) { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _mediaTypeRepository; var query = Query.Builder.Where(x => x.Alias == alias); var contentTypes = repository.GetByQuery(query); @@ -204,7 +208,7 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetAllMediaTypes(params int[] ids) { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _mediaTypeRepository; return repository.GetAll(ids); } @@ -215,7 +219,7 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetMediaTypeChildren(int id) { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _mediaTypeRepository; var query = Query.Builder.Where(x => x.ParentId == id); var contentTypes = repository.GetByQuery(query); @@ -228,7 +232,7 @@ namespace Umbraco.Core.Services /// to save public void Save(IMediaType mediaType) { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _mediaTypeRepository; repository.AddOrUpdate(mediaType); _unitOfWork.Commit(); @@ -240,7 +244,7 @@ namespace Umbraco.Core.Services /// Collection of to save public void Save(IEnumerable mediaTypes) { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _mediaTypeRepository; foreach (var mediaType in mediaTypes) { @@ -258,7 +262,7 @@ namespace Umbraco.Core.Services { _mediaService.DeleteMediaOfType(mediaType.Id); - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _mediaTypeRepository; repository.Delete(mediaType); _unitOfWork.Commit(); @@ -277,7 +281,7 @@ namespace Umbraco.Core.Services _mediaService.DeleteMediaOfType(mediaType.Id); } - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _mediaTypeRepository; foreach (var mediaType in mediaTypeList) { diff --git a/src/Umbraco.Core/Services/DataTypeService.cs b/src/Umbraco.Core/Services/DataTypeService.cs index 599e8f3803..cf9f68896e 100644 --- a/src/Umbraco.Core/Services/DataTypeService.cs +++ b/src/Umbraco.Core/Services/DataTypeService.cs @@ -16,6 +16,8 @@ namespace Umbraco.Core.Services public class DataTypeService : IDataTypeService { private readonly IUnitOfWork _unitOfWork; + private readonly IDataTypeDefinitionRepository _dataTypeService; + private readonly IContentTypeRepository _contentTypeRepository; public DataTypeService() : this(new PetaPocoUnitOfWorkProvider()) { @@ -24,6 +26,7 @@ namespace Umbraco.Core.Services public DataTypeService(IUnitOfWorkProvider provider) { _unitOfWork = provider.GetUnitOfWork(); + _dataTypeService = RepositoryResolver.Current.Factory.CreateDataTypeDefinitionRepository(_unitOfWork); } /// @@ -33,7 +36,7 @@ namespace Umbraco.Core.Services /// public IDataTypeDefinition GetDataTypeDefinitionById(int id) { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _dataTypeService; return repository.Get(id); } @@ -44,7 +47,7 @@ namespace Umbraco.Core.Services /// public IDataTypeDefinition GetDataTypeDefinitionById(Guid id) { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _dataTypeService; var query = Query.Builder.Where(x => x.Key == id); var definitions = repository.GetByQuery(query); @@ -59,7 +62,7 @@ namespace Umbraco.Core.Services /// Collection of objects with a matching contorl id public IEnumerable GetDataTypeDefinitionByControlId(Guid id) { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _dataTypeService; var query = Query.Builder.Where(x => x.ControlId == id); var definitions = repository.GetByQuery(query); @@ -74,7 +77,7 @@ namespace Umbraco.Core.Services /// An enumerable list of objects public IEnumerable GetAllDataTypeDefinitions(params int[] ids) { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _dataTypeService; return repository.GetAll(ids); } @@ -85,7 +88,7 @@ namespace Umbraco.Core.Services /// Id of the user issueing the save public void Save(IDataTypeDefinition dataTypeDefinition, int userId) { - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _dataTypeService; repository.AddOrUpdate(dataTypeDefinition); _unitOfWork.Commit(); } @@ -102,7 +105,7 @@ namespace Umbraco.Core.Services public void Delete(IDataTypeDefinition dataTypeDefinition, int userId) { //Find ContentTypes using this IDataTypeDefinition on a PropertyType - var contentTypeRepository = RepositoryResolver.ResolveByType(_unitOfWork); + var contentTypeRepository = _contentTypeRepository; var query = Query.Builder.Where(x => x.DataTypeId == dataTypeDefinition.Id); var contentTypes = contentTypeRepository.GetByQuery(query); @@ -123,7 +126,7 @@ namespace Umbraco.Core.Services contentTypeRepository.AddOrUpdate(contentType); } - var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var repository = _dataTypeService; repository.Delete(dataTypeDefinition); _unitOfWork.Commit(); } diff --git a/src/Umbraco.Core/Services/FileService.cs b/src/Umbraco.Core/Services/FileService.cs index e5da32a3fc..9695db5c11 100644 --- a/src/Umbraco.Core/Services/FileService.cs +++ b/src/Umbraco.Core/Services/FileService.cs @@ -13,6 +13,9 @@ namespace Umbraco.Core.Services { private readonly IUnitOfWork _fileUnitOfWork; private readonly IUnitOfWork _dataUnitOfWork; + private readonly IStylesheetRepository _stylesheetRepository; + private readonly IScriptRepository _scriptRepository; + private readonly ITemplateRepository _templateRepository; public FileService() : this(new FileUnitOfWorkProvider(), new PetaPocoUnitOfWorkProvider()) { @@ -22,6 +25,9 @@ namespace Umbraco.Core.Services { _fileUnitOfWork = fileProvider.GetUnitOfWork(); _dataUnitOfWork = dataProvider.GetUnitOfWork(); + _templateRepository = RepositoryResolver.Current.Factory.CreateTemplateRepository(_dataUnitOfWork); + _stylesheetRepository = RepositoryResolver.Current.Factory.CreateStylesheetRepository(_fileUnitOfWork); + _scriptRepository = RepositoryResolver.Current.Factory.CreateScriptRepository(_fileUnitOfWork); } /// @@ -30,7 +36,7 @@ namespace Umbraco.Core.Services /// An enumerable list of objects public IEnumerable GetStylesheets(params string[] names) { - var repository = RepositoryResolver.ResolveByType(_fileUnitOfWork); + var repository = _stylesheetRepository; return repository.GetAll(names); } @@ -41,7 +47,7 @@ namespace Umbraco.Core.Services /// A object public Stylesheet GetStylesheetByName(string name) { - var repository = RepositoryResolver.ResolveByType(_fileUnitOfWork); + var repository = _stylesheetRepository; return repository.Get(name); } @@ -51,7 +57,7 @@ namespace Umbraco.Core.Services /// to save public void SaveStylesheet(Stylesheet stylesheet) { - var repository = RepositoryResolver.ResolveByType(_fileUnitOfWork); + var repository = _stylesheetRepository; repository.AddOrUpdate(stylesheet); _fileUnitOfWork.Commit(); } @@ -62,7 +68,7 @@ namespace Umbraco.Core.Services /// Name incl. extension of the Stylesheet to delete public void DeleteStylesheet(string name) { - var repository = RepositoryResolver.ResolveByType(_fileUnitOfWork); + var repository = _stylesheetRepository; var stylesheet = repository.Get(name); repository.Delete(stylesheet); _fileUnitOfWork.Commit(); @@ -84,7 +90,7 @@ namespace Umbraco.Core.Services /// An enumerable list of objects public IEnumerable