From 070681888e9ae6aade4a0e6891eee5218a726d65 Mon Sep 17 00:00:00 2001 From: Gary Sharp Date: Thu, 4 Jul 2013 15:26:43 +1000 Subject: [PATCH] Update: Repository Monitor Deferred Actions Defer code in 'before commit' to run 'after commit' --- .../Repository/Monitor/RepositoryMonitor.cs | 7 ++++++ .../Monitor/RepositoryMonitorEvent.cs | 25 ++++++++++++++++--- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/Disco.Data/Repository/Monitor/RepositoryMonitor.cs b/Disco.Data/Repository/Monitor/RepositoryMonitor.cs index e165f9bd..fdcd6ff7 100644 --- a/Disco.Data/Repository/Monitor/RepositoryMonitor.cs +++ b/Disco.Data/Repository/Monitor/RepositoryMonitor.cs @@ -74,11 +74,18 @@ namespace Disco.Data.Repository.Monitor internal static void UpdateAfterEventFromEntryState(RepositoryMonitorEvent monitorEvent) { + monitorEvent.afterCommit = true; + if (monitorEvent.EventType == RepositoryMonitorEventType.Added) { // Update Entity Key for Added Events monitorEvent.EntityKey = DetermineEntityKey(monitorEvent.objectEntryState); } + + // Execute Deferred Actions + if (monitorEvent.executeAfterCommit != null) + foreach (var deferredAction in monitorEvent.executeAfterCommit) + deferredAction.Invoke(monitorEvent); } internal static RepositoryMonitorEvent EventFromEntryState(DiscoDataContext dbContext, DbEntityEntry entityEntry, ObjectStateEntry entryState) diff --git a/Disco.Data/Repository/Monitor/RepositoryMonitorEvent.cs b/Disco.Data/Repository/Monitor/RepositoryMonitorEvent.cs index 547d1338..467ff817 100644 --- a/Disco.Data/Repository/Monitor/RepositoryMonitorEvent.cs +++ b/Disco.Data/Repository/Monitor/RepositoryMonitorEvent.cs @@ -12,11 +12,13 @@ namespace Disco.Data.Repository.Monitor public class RepositoryMonitorEvent { [JsonIgnore] - internal ObjectStateEntry objectEntryState { get; set; } + internal ObjectStateEntry objectEntryState; [JsonIgnore] - internal DbEntityEntry dbEntityState { get; set; } + internal DbEntityEntry dbEntityState; [JsonIgnore] - internal bool afterCommit { get; set; } + internal bool afterCommit; + [JsonIgnore] + internal List> executeAfterCommit; [JsonIgnore] public DiscoDataContext dbContext { get; set; } @@ -44,7 +46,7 @@ namespace Disco.Data.Repository.Monitor public T GetPreviousPropertyValue(string PropertyName) { if (afterCommit) - throw new InvalidOperationException("Unable to determine property values after repository commit"); + throw new InvalidOperationException("Unable to determine property values after repository commit, use a deferred action instead"); else return (T)dbEntityState.OriginalValues[PropertyName]; } @@ -52,5 +54,20 @@ namespace Disco.Data.Repository.Monitor { return (T)dbEntityState.CurrentValues[PropertyName]; } + + public void ExecuteAfterCommit(Action action){ + if (afterCommit) + { + // Execute Immediately + action.Invoke(this); + } + else + { + // Defer Execution + if (executeAfterCommit == null) + executeAfterCommit = new List>(); + executeAfterCommit.Add(action); + } + } } }