diff --git a/src/Umbraco.Core/CoreRuntimeComponent.cs b/src/Umbraco.Core/CoreRuntimeComponent.cs index 68ed71f484..df8d42527e 100644 --- a/src/Umbraco.Core/CoreRuntimeComponent.cs +++ b/src/Umbraco.Core/CoreRuntimeComponent.cs @@ -37,6 +37,10 @@ namespace Umbraco.Core composition.Container.RegisterFrom(); composition.Container.RegisterFrom(); + // register database builder + // *not* a singleton, don't want to keep it around + composition.Container.Register(); + //TODO: Don't think we'll need this when the resolvers are all container resolvers composition.Container.RegisterSingleton(); @@ -117,8 +121,7 @@ namespace Umbraco.Core composition.Container.RegisterSingleton(); } - internal void Initialize( - IEnumerable modelMapperConfigurations) + internal void Initialize(IEnumerable modelMapperConfigurations) { //TODO: Remove these for v8! LegacyPropertyEditorIdToAliasConverter.CreateMappingsForCoreEditors(); diff --git a/src/Umbraco.Core/Persistence/Repositories/EntityRepository.cs b/src/Umbraco.Core/Persistence/Repositories/EntityRepository.cs index 4977363510..3354fc3f96 100644 --- a/src/Umbraco.Core/Persistence/Repositories/EntityRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/EntityRepository.cs @@ -19,12 +19,9 @@ namespace Umbraco.Core.Persistence.Repositories /// internal class EntityRepository : DisposableObject, IEntityRepository { - private readonly IQueryFactory _queryFactory; - - public EntityRepository(IDatabaseUnitOfWork work, IQueryFactory queryFactory) + public EntityRepository(IDatabaseUnitOfWork work) { UnitOfWork = work; - _queryFactory = queryFactory; } /// @@ -34,7 +31,7 @@ namespace Umbraco.Core.Persistence.Repositories #region Query Methods - public IQuery Query => _queryFactory.Create(); + public IQuery Query => UnitOfWork.DatabaseContext.Query(); public Sql Sql() { return UnitOfWork.Database.Sql();} diff --git a/src/Umbraco.Core/Persistence/UnitOfWork/IDatabaseUnitOfWorkProvider.cs b/src/Umbraco.Core/Persistence/UnitOfWork/IDatabaseUnitOfWorkProvider.cs index 2c1a261faa..0daf0d229c 100644 --- a/src/Umbraco.Core/Persistence/UnitOfWork/IDatabaseUnitOfWorkProvider.cs +++ b/src/Umbraco.Core/Persistence/UnitOfWork/IDatabaseUnitOfWorkProvider.cs @@ -5,6 +5,11 @@ namespace Umbraco.Core.Persistence.UnitOfWork /// public interface IDatabaseUnitOfWorkProvider { + /// + /// Gets the database context. + /// + DatabaseContext DatabaseContext { get; } + /// /// Creates a unit of work. /// diff --git a/src/Umbraco.Core/Persistence/UnitOfWork/NPocoUnitOfWorkProvider.cs b/src/Umbraco.Core/Persistence/UnitOfWork/NPocoUnitOfWorkProvider.cs index b2d61a12d9..65187440e0 100644 --- a/src/Umbraco.Core/Persistence/UnitOfWork/NPocoUnitOfWorkProvider.cs +++ b/src/Umbraco.Core/Persistence/UnitOfWork/NPocoUnitOfWorkProvider.cs @@ -23,13 +23,10 @@ namespace Umbraco.Core.Persistence.UnitOfWork _repositoryFactory = repositoryFactory; } - #region Implement IUnitOfWorkProvider + /// + public DatabaseContext DatabaseContext => Current.DatabaseContext; // fixme inject! - /// - /// Creates a unit of work around a database obtained from the database factory. - /// - /// A unit of work. - /// The unit of work will execute on the database returned by the database factory. + /// public IDatabaseUnitOfWork CreateUnitOfWork() { // get a database from the factory - might be the "ambient" database eg @@ -39,7 +36,5 @@ namespace Umbraco.Core.Persistence.UnitOfWork var databaseContext = Current.DatabaseContext; // fixme - inject! return new NPocoUnitOfWork(databaseContext, database, _repositoryFactory); } - - #endregion } } \ No newline at end of file diff --git a/src/Umbraco.Core/Services/ContentService.cs b/src/Umbraco.Core/Services/ContentService.cs index 4c21b643c3..d0e40307ec 100644 --- a/src/Umbraco.Core/Services/ContentService.cs +++ b/src/Umbraco.Core/Services/ContentService.cs @@ -21,6 +21,7 @@ namespace Umbraco.Core.Services public class ContentService : RepositoryService, IContentService, IContentServiceOperations { private readonly MediaFileSystem _mediaFileSystem; + private IQuery _queryNotTrashed; #region Constructors @@ -28,19 +29,19 @@ namespace Umbraco.Core.Services IDatabaseUnitOfWorkProvider provider, ILogger logger, IEventMessagesFactory eventMessagesFactory, - IQueryFactory queryFactory, MediaFileSystem mediaFileSystem) : base(provider, logger, eventMessagesFactory) { _mediaFileSystem = mediaFileSystem; - _notTrashedQuery = queryFactory.Create().Where(x => x.Trashed == false); } #endregion - #region Static Queries + #region Static queries - private readonly IQuery _notTrashedQuery; + // lazy-constructed because when the ctor runs, the query factory may not be ready + + private IQuery QueryNotTrashed => _queryNotTrashed ?? (_queryNotTrashed = UowProvider.DatabaseContext.Query().Where(x => x.Trashed == false)); #endregion @@ -834,7 +835,7 @@ namespace Umbraco.Core.Services { uow.ReadLock(Constants.Locks.ContentTree); var repository = uow.CreateRepository(); - var content = repository.GetByPublishedVersion(_notTrashedQuery); + var content = repository.GetByPublishedVersion(QueryNotTrashed); uow.Complete(); return content; } diff --git a/src/Umbraco.Core/Services/EntityService.cs b/src/Umbraco.Core/Services/EntityService.cs index 4f94b0b051..dffe6a60fe 100644 --- a/src/Umbraco.Core/Services/EntityService.cs +++ b/src/Umbraco.Core/Services/EntityService.cs @@ -20,18 +20,17 @@ namespace Umbraco.Core.Services { private readonly IRuntimeCacheProvider _runtimeCache; private readonly Dictionary>> _supportedObjectTypes; + private IQuery _queryRootEntity; public EntityService(IDatabaseUnitOfWorkProvider provider, ILogger logger, IEventMessagesFactory eventMessagesFactory, IContentService contentService, IContentTypeService contentTypeService, IMediaService mediaService, IMediaTypeService mediaTypeService, IDataTypeService dataTypeService, IMemberService memberService, IMemberTypeService memberTypeService, - IQueryFactory queryFactory, IRuntimeCacheProvider runtimeCache) : base(provider, logger, eventMessagesFactory) { _runtimeCache = runtimeCache; - _rootEntityQuery = queryFactory.Create().Where(x => x.ParentId == -1); _supportedObjectTypes = new Dictionary>> { @@ -69,7 +68,9 @@ namespace Umbraco.Core.Services #region Static Queries - private readonly IQuery _rootEntityQuery; + // lazy-constructed because when the ctor runs, the query factory may not be ready + + private IQuery QueryRootEntity => _queryRootEntity ?? (_queryRootEntity = UowProvider.DatabaseContext.Query().Where(x => x.ParentId == -1)); #endregion @@ -442,7 +443,7 @@ namespace Umbraco.Core.Services using (var uow = UowProvider.CreateUnitOfWork()) { var repository = uow.CreateRepository(); - var entities = repository.GetByQuery(_rootEntityQuery, objectTypeId); + var entities = repository.GetByQuery(QueryRootEntity, objectTypeId); uow.Complete(); return entities; } diff --git a/src/Umbraco.Tests/TestHelpers/TestObjects.cs b/src/Umbraco.Tests/TestHelpers/TestObjects.cs index 08acfa85d2..70218ba2ec 100644 --- a/src/Umbraco.Tests/TestHelpers/TestObjects.cs +++ b/src/Umbraco.Tests/TestHelpers/TestObjects.cs @@ -150,7 +150,7 @@ namespace Umbraco.Tests.TestHelpers var userService = GetLazyService(container, () => new UserService(provider, logger, eventMessagesFactory)); var dataTypeService = GetLazyService(container, () => new DataTypeService(provider, logger, eventMessagesFactory)); - var contentService = GetLazyService(container, () => new ContentService(provider, logger, eventMessagesFactory, queryFactory, mediaFileSystem)); + var contentService = GetLazyService(container, () => new ContentService(provider, logger, eventMessagesFactory, mediaFileSystem)); var notificationService = GetLazyService(container, () => new NotificationService(provider, userService.Value, contentService.Value, logger)); var serverRegistrationService = GetLazyService(container, () => new ServerRegistrationService(provider, logger, eventMessagesFactory)); var memberGroupService = GetLazyService(container, () => new MemberGroupService(provider, logger, eventMessagesFactory)); @@ -165,7 +165,6 @@ namespace Umbraco.Tests.TestHelpers var entityService = GetLazyService(container, () => new EntityService( provider, logger, eventMessagesFactory, contentService.Value, contentTypeService.Value, mediaService.Value, mediaTypeService.Value, dataTypeService.Value, memberService.Value, memberTypeService.Value, - queryFactory, //TODO: Consider making this an isolated cache instead of using the global one cache.RuntimeCache));