@@ -67,60 +67,69 @@ public void BeforeRead<TResource>(ResourcePipeline pipeline, string stringId = n
67
67
public IEnumerable < TResource > BeforeUpdate < TResource > ( IEnumerable < TResource > resources , ResourcePipeline pipeline )
68
68
where TResource : class , IIdentifiable
69
69
{
70
- if ( GetHook ( ResourceHook . BeforeUpdate , resources , out IResourceHookContainer < TResource > container , out RootNode < TResource > node ) )
70
+ GetHookResult < TResource > result = GetHook ( ResourceHook . BeforeUpdate , resources ) ;
71
+
72
+ if ( result . Succeeded )
71
73
{
72
- RelationshipAttribute [ ] relationships = node . RelationshipsToNextLayer . Select ( proxy => proxy . Attribute ) . ToArray ( ) ;
73
- IEnumerable dbValues = LoadDbValues ( typeof ( TResource ) , ( IEnumerable < TResource > ) node . UniqueResources , ResourceHook . BeforeUpdate , relationships ) ;
74
- var diff = new DiffableResourceHashSet < TResource > ( node . UniqueResources , dbValues , node . LeftsToNextLayer ( ) , _targetedFields ) ;
75
- IEnumerable < TResource > updated = container . BeforeUpdate ( diff , pipeline ) ;
76
- node . UpdateUnique ( updated ) ;
77
- node . Reassign ( resources ) ;
74
+ RelationshipAttribute [ ] relationships = result . Node . RelationshipsToNextLayer . Select ( proxy => proxy . Attribute ) . ToArray ( ) ;
75
+
76
+ IEnumerable dbValues = LoadDbValues ( typeof ( TResource ) , ( IEnumerable < TResource > ) result . Node . UniqueResources , ResourceHook . BeforeUpdate ,
77
+ relationships ) ;
78
+
79
+ var diff = new DiffableResourceHashSet < TResource > ( result . Node . UniqueResources , dbValues , result . Node . LeftsToNextLayer ( ) , _targetedFields ) ;
80
+ IEnumerable < TResource > updated = result . Container . BeforeUpdate ( diff , pipeline ) ;
81
+ result . Node . UpdateUnique ( updated ) ;
82
+ result . Node . Reassign ( resources ) ;
78
83
}
79
84
80
- FireNestedBeforeUpdateHooks ( pipeline , _traversalHelper . CreateNextLayer ( node ) ) ;
85
+ FireNestedBeforeUpdateHooks ( pipeline , _traversalHelper . CreateNextLayer ( result . Node ) ) ;
81
86
return resources ;
82
87
}
83
88
84
89
/// <inheritdoc />
85
90
public IEnumerable < TResource > BeforeCreate < TResource > ( IEnumerable < TResource > resources , ResourcePipeline pipeline )
86
91
where TResource : class , IIdentifiable
87
92
{
88
- if ( GetHook ( ResourceHook . BeforeCreate , resources , out IResourceHookContainer < TResource > container , out RootNode < TResource > node ) )
93
+ GetHookResult < TResource > result = GetHook ( ResourceHook . BeforeCreate , resources ) ;
94
+
95
+ if ( result . Succeeded )
89
96
{
90
- var affected = new ResourceHashSet < TResource > ( ( HashSet < TResource > ) node . UniqueResources , node . LeftsToNextLayer ( ) ) ;
91
- IEnumerable < TResource > updated = container . BeforeCreate ( affected , pipeline ) ;
92
- node . UpdateUnique ( updated ) ;
93
- node . Reassign ( resources ) ;
97
+ var affected = new ResourceHashSet < TResource > ( ( HashSet < TResource > ) result . Node . UniqueResources , result . Node . LeftsToNextLayer ( ) ) ;
98
+ IEnumerable < TResource > updated = result . Container . BeforeCreate ( affected , pipeline ) ;
99
+ result . Node . UpdateUnique ( updated ) ;
100
+ result . Node . Reassign ( resources ) ;
94
101
}
95
102
96
- FireNestedBeforeUpdateHooks ( pipeline , _traversalHelper . CreateNextLayer ( node ) ) ;
103
+ FireNestedBeforeUpdateHooks ( pipeline , _traversalHelper . CreateNextLayer ( result . Node ) ) ;
97
104
return resources ;
98
105
}
99
106
100
107
/// <inheritdoc />
101
108
public IEnumerable < TResource > BeforeDelete < TResource > ( IEnumerable < TResource > resources , ResourcePipeline pipeline )
102
109
where TResource : class , IIdentifiable
103
110
{
104
- if ( GetHook ( ResourceHook . BeforeDelete , resources , out IResourceHookContainer < TResource > container , out RootNode < TResource > node ) )
111
+ GetHookResult < TResource > result = GetHook ( ResourceHook . BeforeDelete , resources ) ;
112
+
113
+ if ( result . Succeeded )
105
114
{
106
- RelationshipAttribute [ ] relationships = node . RelationshipsToNextLayer . Select ( proxy => proxy . Attribute ) . ToArray ( ) ;
115
+ RelationshipAttribute [ ] relationships = result . Node . RelationshipsToNextLayer . Select ( proxy => proxy . Attribute ) . ToArray ( ) ;
107
116
108
117
IEnumerable targetResources =
109
- LoadDbValues ( typeof ( TResource ) , ( IEnumerable < TResource > ) node . UniqueResources , ResourceHook . BeforeDelete , relationships ) ??
110
- node . UniqueResources ;
118
+ LoadDbValues ( typeof ( TResource ) , ( IEnumerable < TResource > ) result . Node . UniqueResources , ResourceHook . BeforeDelete , relationships ) ??
119
+ result . Node . UniqueResources ;
111
120
112
- var affected = new ResourceHashSet < TResource > ( targetResources , node . LeftsToNextLayer ( ) ) ;
121
+ var affected = new ResourceHashSet < TResource > ( targetResources , result . Node . LeftsToNextLayer ( ) ) ;
113
122
114
- IEnumerable < TResource > updated = container . BeforeDelete ( affected , pipeline ) ;
115
- node . UpdateUnique ( updated ) ;
116
- node . Reassign ( resources ) ;
123
+ IEnumerable < TResource > updated = result . Container . BeforeDelete ( affected , pipeline ) ;
124
+ result . Node . UpdateUnique ( updated ) ;
125
+ result . Node . Reassign ( resources ) ;
117
126
}
118
127
119
128
// If we're deleting an article, we're implicitly affected any owners related to it.
120
129
// Here we're loading all relations onto the to-be-deleted article
121
130
// if for that relation the BeforeImplicitUpdateHook is implemented,
122
131
// and this hook is then executed
123
- foreach ( KeyValuePair < Type , Dictionary < RelationshipAttribute , IEnumerable > > entry in node . LeftsToNextLayerByRelationships ( ) )
132
+ foreach ( KeyValuePair < Type , Dictionary < RelationshipAttribute , IEnumerable > > entry in result . Node . LeftsToNextLayerByRelationships ( ) )
124
133
{
125
134
Type rightType = entry . Key ;
126
135
Dictionary < RelationshipAttribute , IEnumerable > implicitTargets = entry . Value ;
@@ -134,15 +143,17 @@ public IEnumerable<TResource> BeforeDelete<TResource>(IEnumerable<TResource> res
134
143
public IEnumerable < TResource > OnReturn < TResource > ( IEnumerable < TResource > resources , ResourcePipeline pipeline )
135
144
where TResource : class , IIdentifiable
136
145
{
137
- if ( GetHook ( ResourceHook . OnReturn , resources , out IResourceHookContainer < TResource > container , out RootNode < TResource > node ) )
146
+ GetHookResult < TResource > result = GetHook ( ResourceHook . OnReturn , resources ) ;
147
+
148
+ if ( result . Succeeded )
138
149
{
139
- IEnumerable < TResource > updated = container . OnReturn ( ( HashSet < TResource > ) node . UniqueResources , pipeline ) ;
150
+ IEnumerable < TResource > updated = result . Container . OnReturn ( ( HashSet < TResource > ) result . Node . UniqueResources , pipeline ) ;
140
151
ValidateHookResponse ( updated ) ;
141
- node . UpdateUnique ( updated ) ;
142
- node . Reassign ( resources ) ;
152
+ result . Node . UpdateUnique ( updated ) ;
153
+ result . Node . Reassign ( resources ) ;
143
154
}
144
155
145
- Traverse ( _traversalHelper . CreateNextLayer ( node ) , ResourceHook . OnReturn , ( nextContainer , nextNode ) =>
156
+ Traverse ( _traversalHelper . CreateNextLayer ( result . Node ) , ResourceHook . OnReturn , ( nextContainer , nextNode ) =>
146
157
{
147
158
IEnumerable filteredUniqueSet = CallHook ( nextContainer , ResourceHook . OnReturn , ArrayFactory . Create < object > ( nextNode . UniqueResources , pipeline ) ) ;
148
159
nextNode . UpdateUnique ( filteredUniqueSet ) ;
@@ -156,12 +167,14 @@ public IEnumerable<TResource> OnReturn<TResource>(IEnumerable<TResource> resourc
156
167
public void AfterRead < TResource > ( IEnumerable < TResource > resources , ResourcePipeline pipeline )
157
168
where TResource : class , IIdentifiable
158
169
{
159
- if ( GetHook ( ResourceHook . AfterRead , resources , out IResourceHookContainer < TResource > container , out RootNode < TResource > node ) )
170
+ GetHookResult < TResource > result = GetHook ( ResourceHook . AfterRead , resources ) ;
171
+
172
+ if ( result . Succeeded )
160
173
{
161
- container . AfterRead ( ( HashSet < TResource > ) node . UniqueResources , pipeline ) ;
174
+ result . Container . AfterRead ( ( HashSet < TResource > ) result . Node . UniqueResources , pipeline ) ;
162
175
}
163
176
164
- Traverse ( _traversalHelper . CreateNextLayer ( node ) , ResourceHook . AfterRead , ( nextContainer , nextNode ) =>
177
+ Traverse ( _traversalHelper . CreateNextLayer ( result . Node ) , ResourceHook . AfterRead , ( nextContainer , nextNode ) =>
165
178
{
166
179
CallHook ( nextContainer , ResourceHook . AfterRead , ArrayFactory . Create < object > ( nextNode . UniqueResources , pipeline , true ) ) ;
167
180
} ) ;
@@ -171,35 +184,41 @@ public void AfterRead<TResource>(IEnumerable<TResource> resources, ResourcePipel
171
184
public void AfterCreate < TResource > ( IEnumerable < TResource > resources , ResourcePipeline pipeline )
172
185
where TResource : class , IIdentifiable
173
186
{
174
- if ( GetHook ( ResourceHook . AfterCreate , resources , out IResourceHookContainer < TResource > container , out RootNode < TResource > node ) )
187
+ GetHookResult < TResource > result = GetHook ( ResourceHook . AfterCreate , resources ) ;
188
+
189
+ if ( result . Succeeded )
175
190
{
176
- container . AfterCreate ( ( HashSet < TResource > ) node . UniqueResources , pipeline ) ;
191
+ result . Container . AfterCreate ( ( HashSet < TResource > ) result . Node . UniqueResources , pipeline ) ;
177
192
}
178
193
179
- Traverse ( _traversalHelper . CreateNextLayer ( node ) , ResourceHook . AfterUpdateRelationship ,
194
+ Traverse ( _traversalHelper . CreateNextLayer ( result . Node ) , ResourceHook . AfterUpdateRelationship ,
180
195
( nextContainer , nextNode ) => FireAfterUpdateRelationship ( nextContainer , nextNode , pipeline ) ) ;
181
196
}
182
197
183
198
/// <inheritdoc />
184
199
public void AfterUpdate < TResource > ( IEnumerable < TResource > resources , ResourcePipeline pipeline )
185
200
where TResource : class , IIdentifiable
186
201
{
187
- if ( GetHook ( ResourceHook . AfterUpdate , resources , out IResourceHookContainer < TResource > container , out RootNode < TResource > node ) )
202
+ GetHookResult < TResource > result = GetHook ( ResourceHook . AfterUpdate , resources ) ;
203
+
204
+ if ( result . Succeeded )
188
205
{
189
- container . AfterUpdate ( ( HashSet < TResource > ) node . UniqueResources , pipeline ) ;
206
+ result . Container . AfterUpdate ( ( HashSet < TResource > ) result . Node . UniqueResources , pipeline ) ;
190
207
}
191
208
192
- Traverse ( _traversalHelper . CreateNextLayer ( node ) , ResourceHook . AfterUpdateRelationship ,
209
+ Traverse ( _traversalHelper . CreateNextLayer ( result . Node ) , ResourceHook . AfterUpdateRelationship ,
193
210
( nextContainer , nextNode ) => FireAfterUpdateRelationship ( nextContainer , nextNode , pipeline ) ) ;
194
211
}
195
212
196
213
/// <inheritdoc />
197
214
public void AfterDelete < TResource > ( IEnumerable < TResource > resources , ResourcePipeline pipeline , bool succeeded )
198
215
where TResource : class , IIdentifiable
199
216
{
200
- if ( GetHook ( ResourceHook . AfterDelete , resources , out IResourceHookContainer < TResource > container , out RootNode < TResource > node ) )
217
+ GetHookResult < TResource > result = GetHook ( ResourceHook . AfterDelete , resources ) ;
218
+
219
+ if ( result . Succeeded )
201
220
{
202
- container . AfterDelete ( ( HashSet < TResource > ) node . UniqueResources , pipeline , succeeded ) ;
221
+ result . Container . AfterDelete ( ( HashSet < TResource > ) result . Node . UniqueResources , pipeline , succeeded ) ;
203
222
}
204
223
}
205
224
@@ -212,13 +231,13 @@ public void AfterDelete<TResource>(IEnumerable<TResource> resources, ResourcePip
212
231
/// <returns>
213
232
/// <c>true</c>, if hook was implemented, <c>false</c> otherwise.
214
233
/// </returns>
215
- private bool GetHook < TResource > ( ResourceHook target , IEnumerable < TResource > resources , out IResourceHookContainer < TResource > container ,
216
- out RootNode < TResource > node )
234
+ private GetHookResult < TResource > GetHook < TResource > ( ResourceHook target , IEnumerable < TResource > resources )
217
235
where TResource : class , IIdentifiable
218
236
{
219
- node = _traversalHelper . CreateRootNode ( resources ) ;
220
- container = _executorHelper . GetResourceHookContainer < TResource > ( target ) ;
221
- return container != null ;
237
+ RootNode < TResource > node = _traversalHelper . CreateRootNode ( resources ) ;
238
+ IResourceHookContainer < TResource > container = _executorHelper . GetResourceHookContainer < TResource > ( target ) ;
239
+
240
+ return new GetHookResult < TResource > ( container , node ) ;
222
241
}
223
242
224
243
/// <summary>
@@ -577,5 +596,20 @@ private HashSet<string> GetIds(IEnumerable resources)
577
596
{
578
597
return new HashSet < string > ( resources . Cast < IIdentifiable > ( ) . Select ( resource => resource . StringId ) ) ;
579
598
}
599
+
600
+ private sealed class GetHookResult < TResource >
601
+ where TResource : class , IIdentifiable
602
+ {
603
+ public IResourceHookContainer < TResource > Container { get ; }
604
+ public RootNode < TResource > Node { get ; }
605
+
606
+ public bool Succeeded => Container != null ;
607
+
608
+ public GetHookResult ( IResourceHookContainer < TResource > container , RootNode < TResource > node )
609
+ {
610
+ Container = container ;
611
+ Node = node ;
612
+ }
613
+ }
580
614
}
581
615
}
0 commit comments