From 1e41db6d69c848b4feaf8366880fcc14cef840dd Mon Sep 17 00:00:00 2001 From: Shannon Deminick Date: Wed, 12 Dec 2012 06:08:03 +0500 Subject: [PATCH] Removed any manual instantiation of PetaPocoUnitOfWork as this should generally always be done by the PetaPocoUnitOfWorkProvider to ensure that for a UOW it always uses a new database instance, not a shared one. --- src/Umbraco.Core/Models/ContentExtensions.cs | 16 ++++++++++------ .../Persistence/UnitOfWork/PetaPocoUnitOfWork.cs | 4 +++- .../UnitOfWork/PetaPocoUnitOfWorkProvider.cs | 10 ++++++++++ .../Persistence/RepositoryResolverTests.cs | 11 ++++++++--- .../Services/ContentServiceTests.cs | 4 ++-- 5 files changed, 33 insertions(+), 12 deletions(-) diff --git a/src/Umbraco.Core/Models/ContentExtensions.cs b/src/Umbraco.Core/Models/ContentExtensions.cs index 0639bfa86f..71e5df37ea 100644 --- a/src/Umbraco.Core/Models/ContentExtensions.cs +++ b/src/Umbraco.Core/Models/ContentExtensions.cs @@ -51,9 +51,11 @@ namespace Umbraco.Core.Models /// public static IProfile GetCreatorProfile(this IContent content) { - var repository = RepositoryResolver.Current.Factory.CreateUserRepository( - new PetaPocoUnitOfWork(DatabaseContext.Current.Database)); - return repository.GetProfileById(content.CreatorId); + using (var repository = RepositoryResolver.Current.Factory.CreateUserRepository( + PetaPocoUnitOfWorkProvider.CreateUnitOfWork())) + { + return repository.GetProfileById(content.CreatorId); + } } /// @@ -61,9 +63,11 @@ namespace Umbraco.Core.Models /// public static IProfile GetWriterProfile(this IContent content) { - var repository = RepositoryResolver.Current.Factory.CreateUserRepository( - new PetaPocoUnitOfWork(DatabaseContext.Current.Database)); - return repository.GetProfileById(content.WriterId); + using(var repository = RepositoryResolver.Current.Factory.CreateUserRepository( + PetaPocoUnitOfWorkProvider.CreateUnitOfWork())) + { + return repository.GetProfileById(content.WriterId); + } } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/UnitOfWork/PetaPocoUnitOfWork.cs b/src/Umbraco.Core/Persistence/UnitOfWork/PetaPocoUnitOfWork.cs index f9b6072692..36b52c9b16 100644 --- a/src/Umbraco.Core/Persistence/UnitOfWork/PetaPocoUnitOfWork.cs +++ b/src/Umbraco.Core/Persistence/UnitOfWork/PetaPocoUnitOfWork.cs @@ -25,10 +25,12 @@ namespace Umbraco.Core.Persistence.UnitOfWork /// /// /// + /// This should normally not be used directly and should be created with the UnitOfWorkProvider + /// /// The Database instance used for this unit of work should not be shared with other unit's of work, other repositories, etc... /// as it will get disposed of when this unit of work is disposed. /// - public PetaPocoUnitOfWork(UmbracoDatabase database) + internal PetaPocoUnitOfWork(UmbracoDatabase database) { Database = database; _key = Guid.NewGuid(); diff --git a/src/Umbraco.Core/Persistence/UnitOfWork/PetaPocoUnitOfWorkProvider.cs b/src/Umbraco.Core/Persistence/UnitOfWork/PetaPocoUnitOfWorkProvider.cs index ce635761db..9ab08c9497 100644 --- a/src/Umbraco.Core/Persistence/UnitOfWork/PetaPocoUnitOfWorkProvider.cs +++ b/src/Umbraco.Core/Persistence/UnitOfWork/PetaPocoUnitOfWorkProvider.cs @@ -30,5 +30,15 @@ namespace Umbraco.Core.Persistence.UnitOfWork } #endregion + + /// + /// Static helper method to return a new unit of work + /// + /// + internal static IDatabaseUnitOfWork CreateUnitOfWork() + { + var provider = new PetaPocoUnitOfWorkProvider(); + return provider.GetUnitOfWork(); + } } } \ No newline at end of file diff --git a/src/Umbraco.Tests/Persistence/RepositoryResolverTests.cs b/src/Umbraco.Tests/Persistence/RepositoryResolverTests.cs index 654e8f5e80..2cab761302 100644 --- a/src/Umbraco.Tests/Persistence/RepositoryResolverTests.cs +++ b/src/Umbraco.Tests/Persistence/RepositoryResolverTests.cs @@ -46,16 +46,17 @@ namespace Umbraco.Tests.Persistence { var method = typeof(RepositoryResolver).GetMethod("ResolveByType", BindingFlags.NonPublic | BindingFlags.Instance); var gMethod = method.MakeGenericMethod(repoType); - var repo = gMethod.Invoke(RepositoryResolver.Current, new object[] { new PetaPocoUnitOfWork(DatabaseContext.Current.Database) }); + var repo = gMethod.Invoke(RepositoryResolver.Current, new object[] { PetaPocoUnitOfWorkProvider.CreateUnitOfWork() }); Assert.IsNotNull(repo); Assert.IsTrue(TypeHelper.IsTypeAssignableFrom(repoType, repo.GetType())); + repo.DisposeIfDisposable(); } [Test] public void Can_Verify_UOW_In_Repository() { // Arrange - var uow = new PetaPocoUnitOfWork(DatabaseContext.Current.Database); + var uow = PetaPocoUnitOfWorkProvider.CreateUnitOfWork(); // Act var repository = RepositoryResolver.Current.ResolveByType(uow); @@ -63,6 +64,8 @@ namespace Umbraco.Tests.Persistence // Assert Assert.That(repository, Is.Not.Null); Assert.That(uow.Key, Is.EqualTo(((RepositoryBase)repository).UnitKey)); + + repository.Dispose(); } [Test] @@ -75,12 +78,14 @@ namespace Umbraco.Tests.Persistence Assert.That(isSubclassOf, Is.False); Assert.That(isAssignableFrom, Is.True); - var uow = new PetaPocoUnitOfWork(DatabaseContext.Current.Database); + var uow = PetaPocoUnitOfWorkProvider.CreateUnitOfWork(); var repository = RepositoryResolver.Current.ResolveByType(uow); bool subclassOf = repository.GetType().IsSubclassOf(typeof (IRepository)); Assert.That(subclassOf, Is.False); Assert.That((typeof(IRepository).IsInstanceOfType(repository)), Is.True); + + repository.Dispose(); } } } \ No newline at end of file diff --git a/src/Umbraco.Tests/Services/ContentServiceTests.cs b/src/Umbraco.Tests/Services/ContentServiceTests.cs index 3de365b22c..c113514469 100644 --- a/src/Umbraco.Tests/Services/ContentServiceTests.cs +++ b/src/Umbraco.Tests/Services/ContentServiceTests.cs @@ -667,8 +667,8 @@ namespace Umbraco.Tests.Services [Test] public void Can_Save_Lazy_Content() - { - var unitOfWork = new PetaPocoUnitOfWork(Umbraco.Core.DatabaseContext.Current.Database); + { + var unitOfWork = PetaPocoUnitOfWorkProvider.CreateUnitOfWork(); var contentType = ServiceContext.ContentTypeService.GetContentType("umbTextpage"); var root = ServiceContext.ContentService.GetById(1046);