using System.Collections.Generic; using Umbraco.Core.Events; using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Persistence.Repositories; using Umbraco.Core.Persistence.Repositories.Implement; using Umbraco.Core.Scoping; namespace Umbraco.Core.Services.Implement { public class MemberGroupService : RepositoryService, IMemberGroupService { private readonly IMemberGroupRepository _memberGroupRepository; public MemberGroupService(IScopeProvider provider, ILogger logger, IEventMessagesFactory eventMessagesFactory, IMemberGroupRepository memberGroupRepository) : base(provider, logger, eventMessagesFactory) { _memberGroupRepository = memberGroupRepository; //Proxy events! MemberGroupRepository.SavedMemberGroup += MemberGroupRepository_SavedMemberGroup; MemberGroupRepository.SavingMemberGroup += MemberGroupRepository_SavingMemberGroup; } #region Proxied event handlers void MemberGroupRepository_SavingMemberGroup(IMemberGroupRepository sender, SaveEventArgs e) { // fixme - wtf? // why is the repository triggering these events? // and, the events are *dispatched* by the repository so it makes no sense dispatching them again! // v7.6 //using (var scope = UowProvider.ScopeProvider.CreateScope()) //{ // scope.Complete(); // always // if (scope.Events.DispatchCancelable(Saving, this, new SaveEventArgs(e.SavedEntities))) // e.Cancel = true; //} // v8 if (Saving.IsRaisedEventCancelled(new SaveEventArgs(e.SavedEntities), this)) e.Cancel = true; } void MemberGroupRepository_SavedMemberGroup(IMemberGroupRepository sender, SaveEventArgs e) { // same as above! Saved.RaiseEvent(new SaveEventArgs(e.SavedEntities, false), this); } #endregion public IEnumerable GetAll() { using (var scope = ScopeProvider.CreateScope(autoComplete: true)) { return _memberGroupRepository.GetMany(); } } public IMemberGroup GetById(int id) { using (var scope = ScopeProvider.CreateScope(autoComplete: true)) { return _memberGroupRepository.Get(id); } } public IMemberGroup GetByName(string name) { using (var scope = ScopeProvider.CreateScope(autoComplete: true)) { return _memberGroupRepository.GetByName(name); } } public void Save(IMemberGroup memberGroup, bool raiseEvents = true) { using (var scope = ScopeProvider.CreateScope()) { var saveEventArgs = new SaveEventArgs(memberGroup); if (raiseEvents && scope.Events.DispatchCancelable(Saving, this, saveEventArgs)) { scope.Complete(); return; } _memberGroupRepository.Save(memberGroup); scope.Complete(); if (raiseEvents) { saveEventArgs.CanCancel = false; scope.Events.Dispatch(Saved, this, saveEventArgs); } } } public void Delete(IMemberGroup memberGroup) { using (var scope = ScopeProvider.CreateScope()) { var deleteEventArgs = new DeleteEventArgs(memberGroup); if (scope.Events.DispatchCancelable(Deleting, this, deleteEventArgs)) { scope.Complete(); return; } _memberGroupRepository.Delete(memberGroup); scope.Complete(); deleteEventArgs.CanCancel = false; scope.Events.Dispatch(Deleted, this, deleteEventArgs); } } /// /// Occurs before Delete of a member group /// public static event TypedEventHandler> Deleting; /// /// Occurs after Delete of a member group /// public static event TypedEventHandler> Deleted; /// /// Occurs before Save of a member group /// /// /// We need to proxy these events because the events need to take place at the repo level /// public static event TypedEventHandler> Saving; /// /// Occurs after Save of a member group /// /// /// We need to proxy these events because the events need to take place at the repo level /// public static event TypedEventHandler> Saved; } }