diff --git a/src/Umbraco.Core/Persistence/RepositoryFactory.cs b/src/Umbraco.Core/Persistence/RepositoryFactory.cs index 085a5cd87b..f23f6c65a4 100644 --- a/src/Umbraco.Core/Persistence/RepositoryFactory.cs +++ b/src/Umbraco.Core/Persistence/RepositoryFactory.cs @@ -24,7 +24,7 @@ namespace Umbraco.Core.Persistence CreateUserTypeRepository(uow)); } - public virtual IContentRepository CreateContentRepository(IDatabaseUnitOfWork uow) + internal virtual IContentRepository CreateContentRepository(IDatabaseUnitOfWork uow) { return new ContentRepository( uow, @@ -33,7 +33,7 @@ namespace Umbraco.Core.Persistence CreateTemplateRepository(uow)); } - public virtual IContentTypeRepository CreateContentTypeRepository(IDatabaseUnitOfWork uow) + internal virtual IContentTypeRepository CreateContentTypeRepository(IDatabaseUnitOfWork uow) { return new ContentTypeRepository( uow, @@ -41,14 +41,14 @@ namespace Umbraco.Core.Persistence new TemplateRepository(uow, NullCacheProvider.Current)); } - public virtual IDataTypeDefinitionRepository CreateDataTypeDefinitionRepository(IDatabaseUnitOfWork uow) + internal virtual IDataTypeDefinitionRepository CreateDataTypeDefinitionRepository(IDatabaseUnitOfWork uow) { return new DataTypeDefinitionRepository( uow, NullCacheProvider.Current); } - public virtual IDictionaryRepository CreateDictionaryRepository(IDatabaseUnitOfWork uow) + internal virtual IDictionaryRepository CreateDictionaryRepository(IDatabaseUnitOfWork uow) { return new DictionaryRepository( uow, @@ -56,7 +56,7 @@ namespace Umbraco.Core.Persistence CreateLanguageRepository(uow)); } - public virtual ILanguageRepository CreateLanguageRepository(IDatabaseUnitOfWork uow) + internal virtual ILanguageRepository CreateLanguageRepository(IDatabaseUnitOfWork uow) { return new LanguageRepository( uow, @@ -70,7 +70,7 @@ namespace Umbraco.Core.Persistence InMemoryCacheProvider.Current); } - public virtual IMediaRepository CreateMediaRepository(IDatabaseUnitOfWork uow) + internal virtual IMediaRepository CreateMediaRepository(IDatabaseUnitOfWork uow) { return new MediaRepository( uow, @@ -78,14 +78,14 @@ namespace Umbraco.Core.Persistence CreateMediaTypeRepository(uow)); } - public virtual IMediaTypeRepository CreateMediaTypeRepository(IDatabaseUnitOfWork uow) + internal virtual IMediaTypeRepository CreateMediaTypeRepository(IDatabaseUnitOfWork uow) { return new MediaTypeRepository( uow, InMemoryCacheProvider.Current); } - public virtual IRelationRepository CreateRelationRepository(IDatabaseUnitOfWork uow) + internal virtual IRelationRepository CreateRelationRepository(IDatabaseUnitOfWork uow) { return new RelationRepository( uow, @@ -93,24 +93,24 @@ namespace Umbraco.Core.Persistence CreateRelationTypeRepository(uow)); } - public virtual IRelationTypeRepository CreateRelationTypeRepository(IDatabaseUnitOfWork uow) + internal virtual IRelationTypeRepository CreateRelationTypeRepository(IDatabaseUnitOfWork uow) { return new RelationTypeRepository( uow, NullCacheProvider.Current); } - public virtual IScriptRepository CreateScriptRepository(IUnitOfWork uow) + internal virtual IScriptRepository CreateScriptRepository(IUnitOfWork uow) { return new ScriptRepository(uow); } - public virtual IStylesheetRepository CreateStylesheetRepository(IUnitOfWork uow) + internal virtual IStylesheetRepository CreateStylesheetRepository(IUnitOfWork uow) { return new StylesheetRepository(uow); } - public virtual ITemplateRepository CreateTemplateRepository(IDatabaseUnitOfWork uow) + internal virtual ITemplateRepository CreateTemplateRepository(IDatabaseUnitOfWork uow) { return new TemplateRepository(uow, NullCacheProvider.Current); } diff --git a/src/Umbraco.Core/Persistence/RepositoryResolver.cs b/src/Umbraco.Core/Persistence/RepositoryResolver.cs index 80affde02c..558a3aaee7 100644 --- a/src/Umbraco.Core/Persistence/RepositoryResolver.cs +++ b/src/Umbraco.Core/Persistence/RepositoryResolver.cs @@ -43,7 +43,7 @@ namespace Umbraco.Core.Persistence internal TRepository ResolveByType(IUnitOfWork unitOfWork) where TRepository : class, IRepository { - var createMethod = this.Value.GetType().GetMethods() + var createMethod = this.Value.GetType().GetMethods(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public) .First(x => x.Name == "Create" + typeof (TRepository).Name.Substring(1)); if (createMethod.GetParameters().Count() != 1 diff --git a/src/Umbraco.Core/Services/ContentService.cs b/src/Umbraco.Core/Services/ContentService.cs index 76b7e4ebee..7ea11b8d71 100644 --- a/src/Umbraco.Core/Services/ContentService.cs +++ b/src/Umbraco.Core/Services/ContentService.cs @@ -21,22 +21,26 @@ namespace Umbraco.Core.Services private readonly IDatabaseUnitOfWorkProvider _uowProvider; private readonly IPublishingStrategy _publishingStrategy; private readonly IUserService _userService; + private readonly RepositoryFactory _repositoryFactory; private HttpContextBase _httpContext; - public ContentService(IDatabaseUnitOfWorkProvider provider) : this(provider, new PublishingStrategy()) + public ContentService(IDatabaseUnitOfWorkProvider provider, RepositoryFactory repositoryFactory) + : this(provider, new PublishingStrategy(), repositoryFactory) {} - internal ContentService(IDatabaseUnitOfWorkProvider provider, IPublishingStrategy publishingStrategy) + internal ContentService(IDatabaseUnitOfWorkProvider provider, IPublishingStrategy publishingStrategy, RepositoryFactory repositoryFactory) { _uowProvider = provider; _publishingStrategy = publishingStrategy; + _repositoryFactory = repositoryFactory; } - internal ContentService(IDatabaseUnitOfWorkProvider provider, IPublishingStrategy publishingStrategy, IUserService userService) + internal ContentService(IDatabaseUnitOfWorkProvider provider, IPublishingStrategy publishingStrategy, IUserService userService, RepositoryFactory repositoryFactory) { + _uowProvider = provider; _publishingStrategy = publishingStrategy; _userService = userService; - _uowProvider = provider; + _repositoryFactory = repositoryFactory; } /// @@ -50,7 +54,7 @@ namespace Umbraco.Core.Services public IContent CreateContent(int parentId, string contentTypeAlias, int userId = -1) { var uow = _uowProvider.GetUnitOfWork(); - using (var repository = RepositoryResolver.Current.Factory.CreateContentTypeRepository(uow)) + using (var repository = _repositoryFactory.CreateContentTypeRepository(uow)) { var query = Query.Builder.Where(x => x.Alias == contentTypeAlias); var contentTypes = repository.GetByQuery(query); @@ -92,7 +96,7 @@ namespace Umbraco.Core.Services /// public IContent GetById(int id) { - using (var repository = RepositoryResolver.Current.Factory.CreateContentRepository(_uowProvider.GetUnitOfWork())) + using (var repository = _repositoryFactory.CreateContentRepository(_uowProvider.GetUnitOfWork())) { return repository.Get(id); } @@ -106,7 +110,7 @@ namespace Umbraco.Core.Services /// public IContent GetById(Guid key) { - using (var repository = RepositoryResolver.Current.Factory.CreateContentRepository(_uowProvider.GetUnitOfWork())) + using (var repository = _repositoryFactory.CreateContentRepository(_uowProvider.GetUnitOfWork())) { var query = Query.Builder.Where(x => x.Key == key); var contents = repository.GetByQuery(query); @@ -122,7 +126,7 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetContentOfContentType(int id) { - using (var repository = RepositoryResolver.Current.Factory.CreateContentRepository(_uowProvider.GetUnitOfWork())) + using (var repository = _repositoryFactory.CreateContentRepository(_uowProvider.GetUnitOfWork())) { var query = Query.Builder.Where(x => x.ContentTypeId == id); var contents = repository.GetByQuery(query); @@ -138,7 +142,7 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetByLevel(int level) { - using (var repository = RepositoryResolver.Current.Factory.CreateContentRepository(_uowProvider.GetUnitOfWork())) + using (var repository = _repositoryFactory.CreateContentRepository(_uowProvider.GetUnitOfWork())) { var query = Query.Builder.Where(x => x.Level == level); var contents = repository.GetByQuery(query); @@ -154,7 +158,7 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetChildren(int id) { - using (var repository = RepositoryResolver.Current.Factory.CreateContentRepository(_uowProvider.GetUnitOfWork())) + using (var repository = _repositoryFactory.CreateContentRepository(_uowProvider.GetUnitOfWork())) { var query = Query.Builder.Where(x => x.ParentId == id); var contents = repository.GetByQuery(query); @@ -170,7 +174,7 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetVersions(int id) { - using (var repository = RepositoryResolver.Current.Factory.CreateContentRepository(_uowProvider.GetUnitOfWork())) + using (var repository = _repositoryFactory.CreateContentRepository(_uowProvider.GetUnitOfWork())) { var versions = repository.GetAllVersions(id); return versions; @@ -184,7 +188,7 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetRootContent() { - using (var repository = RepositoryResolver.Current.Factory.CreateContentRepository(_uowProvider.GetUnitOfWork())) + using (var repository = _repositoryFactory.CreateContentRepository(_uowProvider.GetUnitOfWork())) { var query = Query.Builder.Where(x => x.ParentId == -1); var contents = repository.GetByQuery(query); @@ -199,7 +203,7 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetContentForExpiration() { - using (var repository = RepositoryResolver.Current.Factory.CreateContentRepository(_uowProvider.GetUnitOfWork())) + using (var repository = _repositoryFactory.CreateContentRepository(_uowProvider.GetUnitOfWork())) { var query = Query.Builder.Where(x => x.Published == true && x.ExpireDate <= DateTime.UtcNow); var contents = repository.GetByQuery(query); @@ -214,7 +218,7 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetContentForRelease() { - using (var repository = RepositoryResolver.Current.Factory.CreateContentRepository(_uowProvider.GetUnitOfWork())) + using (var repository = _repositoryFactory.CreateContentRepository(_uowProvider.GetUnitOfWork())) { var query = Query.Builder.Where(x => x.Published == false && x.ReleaseDate <= DateTime.UtcNow); var contents = repository.GetByQuery(query); @@ -229,7 +233,7 @@ namespace Umbraco.Core.Services /// An Enumerable list of objects public IEnumerable GetContentInRecycleBin() { - using (var repository = RepositoryResolver.Current.Factory.CreateContentRepository(_uowProvider.GetUnitOfWork())) + using (var repository = _repositoryFactory.CreateContentRepository(_uowProvider.GetUnitOfWork())) { var query = Query.Builder.Where(x => x.ParentId == -20); var contents = repository.GetByQuery(query); @@ -246,7 +250,7 @@ namespace Umbraco.Core.Services public bool RePublishAll(int userId = -1) { var uow = _uowProvider.GetUnitOfWork(); - using (var repository = RepositoryResolver.Current.Factory.CreateContentRepository(uow)) + using (var repository = _repositoryFactory.CreateContentRepository(uow)) { var list = new List(); @@ -306,7 +310,7 @@ namespace Umbraco.Core.Services public bool PublishWithChildren(IContent content, int userId = -1) { var uow = _uowProvider.GetUnitOfWork(); - using (var repository = RepositoryResolver.Current.Factory.CreateContentRepository(uow)) + using (var repository = _repositoryFactory.CreateContentRepository(uow)) { //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) @@ -366,7 +370,7 @@ namespace Umbraco.Core.Services public bool UnPublish(IContent content, int userId = -1) { var uow = _uowProvider.GetUnitOfWork(); - using (var repository = RepositoryResolver.Current.Factory.CreateContentRepository(uow)) + using (var repository = _repositoryFactory.CreateContentRepository(uow)) { //Look for children and unpublish them if any exists, otherwise just unpublish the passed in Content. var children = GetChildrenDeep(content.Id); @@ -439,7 +443,7 @@ namespace Umbraco.Core.Services public bool SaveAndPublish(IContent content, int userId = -1) { var uow = _uowProvider.GetUnitOfWork(); - using (var repository = RepositoryResolver.Current.Factory.CreateContentRepository(uow)) + using (var repository = _repositoryFactory.CreateContentRepository(uow)) { var e = new SaveEventArgs(); if (Saving != null) @@ -501,7 +505,7 @@ namespace Umbraco.Core.Services public void Save(IContent content, int userId = -1) { var uow = _uowProvider.GetUnitOfWork(); - using (var repository = RepositoryResolver.Current.Factory.CreateContentRepository(uow)) + using (var repository = _repositoryFactory.CreateContentRepository(uow)) { var e = new SaveEventArgs(); if (Saving != null) @@ -535,7 +539,7 @@ namespace Umbraco.Core.Services public void Save(IEnumerable contents, int userId = -1) { var uow = _uowProvider.GetUnitOfWork(); - using (var repository = RepositoryResolver.Current.Factory.CreateContentRepository(uow)) + using (var repository = _repositoryFactory.CreateContentRepository(uow)) { var containsNew = contents.Any(x => x.HasIdentity == false); @@ -588,7 +592,7 @@ namespace Umbraco.Core.Services public void Save(IEnumerable> contents, int userId = -1) { var uow = _uowProvider.GetUnitOfWork(); - using (var repository = RepositoryResolver.Current.Factory.CreateContentRepository(uow)) + using (var repository = _repositoryFactory.CreateContentRepository(uow)) { var e = new SaveEventArgs(); if (Saving != null) @@ -621,7 +625,7 @@ namespace Umbraco.Core.Services public void DeleteContentOfType(int contentTypeId, int userId = -1) { var uow = _uowProvider.GetUnitOfWork(); - using (var repository = RepositoryResolver.Current.Factory.CreateContentRepository(uow)) + using (var repository = _repositoryFactory.CreateContentRepository(uow)) { //NOTE What about content that has the contenttype as part of its composition? var query = Query.Builder.Where(x => x.ContentTypeId == contentTypeId); @@ -668,7 +672,7 @@ namespace Umbraco.Core.Services if (!e.Cancel) { var uow = _uowProvider.GetUnitOfWork(); - using (var repository = RepositoryResolver.Current.Factory.CreateContentRepository(uow)) + using (var repository = _repositoryFactory.CreateContentRepository(uow)) { SetWriter(content, userId); repository.Delete(content); @@ -720,7 +724,7 @@ namespace Umbraco.Core.Services if (!e.Cancel) { - using (var repository = RepositoryResolver.Current.Factory.CreateContentRepository(_uowProvider.GetUnitOfWork())) + using (var repository = _repositoryFactory.CreateContentRepository(_uowProvider.GetUnitOfWork())) { repository.Delete(id, versionDate); @@ -742,7 +746,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) { - using (var repository = RepositoryResolver.Current.Factory.CreateContentRepository(_uowProvider.GetUnitOfWork())) + using (var repository = _repositoryFactory.CreateContentRepository(_uowProvider.GetUnitOfWork())) { if (deletePriorVersions) { @@ -777,7 +781,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 uow = _uowProvider.GetUnitOfWork(); - using (var repository = RepositoryResolver.Current.Factory.CreateContentRepository(uow)) + using (var repository = _repositoryFactory.CreateContentRepository(uow)) { var e = new MoveEventArgs { ParentId = -20 }; @@ -853,7 +857,7 @@ namespace Umbraco.Core.Services public void EmptyRecycleBin() { var uow = _uowProvider.GetUnitOfWork(); - using (var repository = RepositoryResolver.Current.Factory.CreateContentRepository(uow)) + using (var repository = _repositoryFactory.CreateContentRepository(uow)) { var query = Query.Builder.Where(x => x.ParentId == -20); var contents = repository.GetByQuery(query); @@ -890,7 +894,7 @@ namespace Umbraco.Core.Services copy.Name = copy.Name + " (1)"; var uow = _uowProvider.GetUnitOfWork(); - using (var repository = RepositoryResolver.Current.Factory.CreateContentRepository(uow)) + using (var repository = _repositoryFactory.CreateContentRepository(uow)) { SetWriter(content, userId); @@ -962,7 +966,7 @@ namespace Umbraco.Core.Services var e = new RollbackEventArgs(); var uow = _uowProvider.GetUnitOfWork(); - using (var repository = RepositoryResolver.Current.Factory.CreateContentRepository(uow)) + using (var repository = _repositoryFactory.CreateContentRepository(uow)) { var content = repository.GetByVersion(id, versionId); diff --git a/src/Umbraco.Core/Services/ServiceContext.cs b/src/Umbraco.Core/Services/ServiceContext.cs index 47fdf8a558..5bb1e096ca 100644 --- a/src/Umbraco.Core/Services/ServiceContext.cs +++ b/src/Umbraco.Core/Services/ServiceContext.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Concurrent; +using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.Publishing; @@ -59,7 +60,7 @@ namespace Umbraco.Core.Services _userService = new UserService(provider); if (_contentService == null) - _contentService = new ContentService(provider, publishingStrategy, _userService); + _contentService = new ContentService(provider, publishingStrategy, _userService, RepositoryResolver.Current.Factory); if(_mediaService == null) _mediaService = new MediaService(provider); diff --git a/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs index 906a1909ff..0f9d10cdc5 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs @@ -2,9 +2,7 @@ using System.Linq; using NUnit.Framework; using Umbraco.Core.Models; -using Umbraco.Core.Models.Membership; using Umbraco.Core.Persistence; -using Umbraco.Core.Persistence.Caching; using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Persistence.Repositories; using Umbraco.Core.Persistence.UnitOfWork;