From b4286a7d4edfcb9f24f65224862a130a7de371af Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 28 Apr 2014 17:38:24 +1000 Subject: [PATCH] works on U4-4769 - removing circular refs from media service --- src/Umbraco.Core/Services/MediaService.cs | 42 ++++++++++++++------- src/Umbraco.Core/Services/ServiceContext.cs | 2 +- 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/src/Umbraco.Core/Services/MediaService.cs b/src/Umbraco.Core/Services/MediaService.cs index 865a8416cc..1e8f0c5380 100644 --- a/src/Umbraco.Core/Services/MediaService.cs +++ b/src/Umbraco.Core/Services/MediaService.cs @@ -26,6 +26,8 @@ namespace Umbraco.Core.Services //Support recursive locks because some of the methods that require locking call other methods that require locking. //for example, the Move method needs to be locked but this calls the Save method which also needs to be locked. private static readonly ReaderWriterLockSlim Locker = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion); + private readonly EntityXmlSerializer _entitySerializer = new EntityXmlSerializer(); + private readonly IDataTypeService _dataTypeService; public MediaService(RepositoryFactory repositoryFactory) : this(new PetaPocoUnitOfWorkProvider(), repositoryFactory) @@ -36,6 +38,14 @@ namespace Umbraco.Core.Services { _uowProvider = provider; _repositoryFactory = repositoryFactory; + _dataTypeService = new DataTypeService(provider, repositoryFactory); + } + + public MediaService(IDatabaseUnitOfWorkProvider provider, RepositoryFactory repositoryFactory, IDataTypeService dataTypeService) + { + _uowProvider = provider; + _repositoryFactory = repositoryFactory; + _dataTypeService = dataTypeService; } /// @@ -148,7 +158,7 @@ namespace Umbraco.Core.Services repository.AddOrUpdate(media); uow.Commit(); - var xml = media.ToXml(); + var xml = _entitySerializer.Serialize(this, _dataTypeService, media); CreateAndSaveMediaXml(xml, media.Id, uow.Database); } } @@ -203,7 +213,7 @@ namespace Umbraco.Core.Services repository.AddOrUpdate(media); uow.Commit(); - var xml = media.ToXml(); + var xml = _entitySerializer.Serialize(this, _dataTypeService, media); CreateAndSaveMediaXml(xml, media.Id, uow.Database); } } @@ -801,7 +811,7 @@ namespace Umbraco.Core.Services repository.AddOrUpdate(media); uow.Commit(); - var xml = media.ToXml(); + var xml = _entitySerializer.Serialize(this, _dataTypeService, media); CreateAndSaveMediaXml(xml, media.Id, uow.Database); } } @@ -820,17 +830,20 @@ namespace Umbraco.Core.Services /// Optional boolean indicating whether or not to raise events. public void Save(IEnumerable medias, int userId = 0, bool raiseEvents = true) { + var asArray = medias.ToArray(); + if (raiseEvents) { - if (Saving.IsRaisedEventCancelled(new SaveEventArgs(medias), this)) + if (Saving.IsRaisedEventCancelled(new SaveEventArgs(asArray), this)) return; } + using (new WriteLock(Locker)) { var uow = _uowProvider.GetUnitOfWork(); using (var repository = _repositoryFactory.CreateMediaRepository(uow)) { - foreach (var media in medias) + foreach (var media in asArray) { media.CreatorId = userId; repository.AddOrUpdate(media); @@ -839,14 +852,15 @@ namespace Umbraco.Core.Services //commit the whole lot in one go uow.Commit(); - foreach (var media in medias) + foreach (var media in asArray) { - CreateAndSaveMediaXml(media.ToXml(), media.Id, uow.Database); + var xml = _entitySerializer.Serialize(this, _dataTypeService, media); + CreateAndSaveMediaXml(xml, media.Id, uow.Database); } } if (raiseEvents) - Saved.RaiseEvent(new SaveEventArgs(medias, false), this); + Saved.RaiseEvent(new SaveEventArgs(asArray, false), this); Audit.Add(AuditTypes.Save, "Save Media items performed by user", userId, -1); } @@ -862,9 +876,11 @@ namespace Umbraco.Core.Services /// True if sorting succeeded, otherwise False public bool Sort(IEnumerable items, int userId = 0, bool raiseEvents = true) { + var asArray = items.ToArray(); + if (raiseEvents) { - if (Saving.IsRaisedEventCancelled(new SaveEventArgs(items), this)) + if (Saving.IsRaisedEventCancelled(new SaveEventArgs(asArray), this)) return false; } @@ -876,7 +892,7 @@ namespace Umbraco.Core.Services using (var repository = _repositoryFactory.CreateMediaRepository(uow)) { int i = 0; - foreach (var media in items) + foreach (var media in asArray) { //If the current sort order equals that of the media //we don't need to update it, so just increment the sort order @@ -899,14 +915,14 @@ namespace Umbraco.Core.Services foreach (var content in shouldBeCached) { //Create and Save ContentXml DTO - var xml = content.ToXml(); + var xml = _entitySerializer.Serialize(this, _dataTypeService, content); CreateAndSaveMediaXml(xml, content.Id, uow.Database); } } } if (raiseEvents) - Saved.RaiseEvent(new SaveEventArgs(items, false), this); + Saved.RaiseEvent(new SaveEventArgs(asArray, false), this); Audit.Add(AuditTypes.Sort, "Sorting Media performed by user", userId, 0); @@ -950,7 +966,7 @@ namespace Umbraco.Core.Services var xmlItems = new List(); foreach (var c in list) { - var xml = c.ToXml(); + var xml = _entitySerializer.Serialize(this, _dataTypeService, c); xmlItems.Add(new ContentXmlDto { NodeId = c.Id, Xml = xml.ToString(SaveOptions.None) }); } diff --git a/src/Umbraco.Core/Services/ServiceContext.cs b/src/Umbraco.Core/Services/ServiceContext.cs index e185c4bda4..2fc2224d94 100644 --- a/src/Umbraco.Core/Services/ServiceContext.cs +++ b/src/Umbraco.Core/Services/ServiceContext.cs @@ -127,7 +127,7 @@ namespace Umbraco.Core.Services _contentService = new Lazy(() => new ContentService(provider, repositoryFactory.Value, publishingStrategy, DataTypeService)); if (_mediaService == null) - _mediaService = new Lazy(() => new MediaService(provider, repositoryFactory.Value)); + _mediaService = new Lazy(() => new MediaService(provider, repositoryFactory.Value, DataTypeService)); if (_contentTypeService == null) _contentTypeService = new Lazy(() => new ContentTypeService(provider, repositoryFactory.Value, _contentService.Value, _mediaService.Value));