/
EntityChangeEventHelper.cs
130 lines (109 loc) · 4.7 KB
/
EntityChangeEventHelper.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Abp.Dependency;
using Abp.Domain.Uow;
namespace Abp.Events.Bus.Entities
{
/// <summary>
/// Used to trigger entity change events.
/// </summary>
public class EntityChangeEventHelper : ITransientDependency, IEntityChangeEventHelper
{
public IEventBus EventBus { get; set; }
private readonly IUnitOfWorkManager _unitOfWorkManager;
public EntityChangeEventHelper(IUnitOfWorkManager unitOfWorkManager)
{
_unitOfWorkManager = unitOfWorkManager;
EventBus = NullEventBus.Instance;
}
public virtual void TriggerEvents(EntityChangeReport changeReport)
{
TriggerEventsInternal(changeReport);
if (changeReport.IsEmpty() || _unitOfWorkManager.Current == null)
{
return;
}
_unitOfWorkManager.Current.SaveChanges();
}
public Task TriggerEventsAsync(EntityChangeReport changeReport)
{
TriggerEventsInternal(changeReport);
if (changeReport.IsEmpty() || _unitOfWorkManager.Current == null)
{
return Task.FromResult(0);
}
return _unitOfWorkManager.Current.SaveChangesAsync();
}
public virtual void TriggerEntityCreatingEvent(object entity)
{
TriggerEventWithEntity(typeof(EntityCreatingEventData<>), entity, true);
}
public virtual void TriggerEntityCreatedEventOnUowCompleted(object entity)
{
TriggerEventWithEntity(typeof(EntityCreatedEventData<>), entity, false);
}
public virtual void TriggerEntityUpdatingEvent(object entity)
{
TriggerEventWithEntity(typeof(EntityUpdatingEventData<>), entity, true);
}
public virtual void TriggerEntityUpdatedEventOnUowCompleted(object entity)
{
TriggerEventWithEntity(typeof(EntityUpdatedEventData<>), entity, false);
}
public virtual void TriggerEntityDeletingEvent(object entity)
{
TriggerEventWithEntity(typeof(EntityDeletingEventData<>), entity, true);
}
public virtual void TriggerEntityDeletedEventOnUowCompleted(object entity)
{
TriggerEventWithEntity(typeof(EntityDeletedEventData<>), entity, false);
}
public virtual void TriggerEventsInternal(EntityChangeReport changeReport)
{
TriggerEntityChangeEvents(changeReport.ChangedEntities);
TriggerDomainEvents(changeReport.DomainEvents);
}
protected virtual void TriggerEntityChangeEvents(List<EntityChangeEntry> changedEntities)
{
foreach (var changedEntity in changedEntities)
{
switch (changedEntity.ChangeType)
{
case EntityChangeType.Created:
TriggerEntityCreatingEvent(changedEntity.Entity);
TriggerEntityCreatedEventOnUowCompleted(changedEntity.Entity);
break;
case EntityChangeType.Updated:
TriggerEntityUpdatingEvent(changedEntity.Entity);
TriggerEntityUpdatedEventOnUowCompleted(changedEntity.Entity);
break;
case EntityChangeType.Deleted:
TriggerEntityDeletingEvent(changedEntity.Entity);
TriggerEntityDeletedEventOnUowCompleted(changedEntity.Entity);
break;
default:
throw new AbpException("Unknown EntityChangeType: " + changedEntity.ChangeType);
}
}
}
protected virtual void TriggerDomainEvents(List<DomainEventEntry> domainEvents)
{
foreach (var domainEvent in domainEvents)
{
EventBus.Trigger(domainEvent.EventData.GetType(), domainEvent.SourceEntity, domainEvent.EventData);
}
}
protected virtual void TriggerEventWithEntity(Type genericEventType, object entity, bool triggerInCurrentUnitOfWork)
{
var entityType = entity.GetType();
var eventType = genericEventType.MakeGenericType(entityType);
if (triggerInCurrentUnitOfWork || _unitOfWorkManager.Current == null)
{
EventBus.Trigger(eventType, (IEventData)Activator.CreateInstance(eventType, new[] { entity }));
return;
}
_unitOfWorkManager.Current.Completed += (sender, args) => EventBus.Trigger(eventType, (IEventData)Activator.CreateInstance(eventType, new[] { entity }));
}
}
}