6
6
// <summary>Exposes server-side DataPortal functionality</summary>
7
7
//-----------------------------------------------------------------------
8
8
9
+ using System . Runtime . Serialization ;
9
10
using System . Security . Principal ;
10
11
using Csla . Core ;
12
+ using Csla . Properties ;
11
13
using Csla . Serialization ;
12
14
using Csla . Serialization . Mobile ;
13
15
using Csla . Server ;
@@ -109,21 +111,19 @@ protected virtual async Task<ResponseMessage> RouteMessage(string operation, str
109
111
110
112
private async Task < ResponseMessage > InvokePortal ( string operation , ByteString requestData )
111
113
{
112
- var result = _applicationContext . CreateInstanceDI < DataPortalResponse > ( ) ;
113
- DataPortalErrorInfo ? errorData = null ;
114
+ var result = new DataPortalResponse ( ) ;
114
115
try
115
116
{
116
- var request = _applicationContext . GetRequiredService < ISerializationFormatter > ( ) . Deserialize ( requestData . ToByteArray ( ) ) ;
117
- result = await CallPortal ( operation , request ) ;
117
+ var request = Deserialize < object > ( requestData . ToByteArray ( ) ) ;
118
+ var callResult = await CallPortal ( operation , request ) ;
119
+ result . ObjectData = callResult . ObjectData ;
118
120
}
119
121
catch ( Exception ex )
120
122
{
121
- errorData = _applicationContext . CreateInstanceDI < DataPortalErrorInfo > ( ex ) ;
123
+ result . ErrorData = _applicationContext . CreateInstanceDI < DataPortalErrorInfo > ( ex ) ;
122
124
}
123
- var portalResult = _applicationContext . CreateInstanceDI < DataPortalResponse > ( ) ;
124
- portalResult . ErrorData = errorData ;
125
- portalResult . ObjectData = result . ObjectData ;
126
- var buffer = _applicationContext . GetRequiredService < ISerializationFormatter > ( ) . Serialize ( portalResult ) ;
125
+
126
+ var buffer = _applicationContext . GetRequiredService < ISerializationFormatter > ( ) . Serialize ( result ) ;
127
127
return new ResponseMessage { Body = ByteString . CopyFrom ( buffer ) } ;
128
128
}
129
129
@@ -149,25 +149,25 @@ public async Task<DataPortalResponse> Create(CriteriaRequest request)
149
149
if ( request is null )
150
150
throw new ArgumentNullException ( nameof ( request ) ) ;
151
151
152
- var result = _applicationContext . CreateInstanceDI < DataPortalResponse > ( ) ;
152
+ var result = new DataPortalResponse ( ) ;
153
153
try
154
154
{
155
155
request = ConvertRequest ( request ) ;
156
156
157
157
// unpack criteria data into object
158
- object ? criteria = GetCriteria ( _applicationContext , request . CriteriaData ) ;
158
+ object criteria = GetCriteria ( _applicationContext , request . CriteriaData ) ;
159
159
if ( criteria is DataPortalClient . PrimitiveCriteria primitiveCriteria )
160
160
{
161
161
criteria = primitiveCriteria . Value ;
162
162
}
163
163
164
- var objectType = Reflection . MethodCaller . GetType ( AssemblyNameTranslator . GetAssemblyQualifiedName ( request . TypeName ) , true ) ;
164
+ var objectType = Reflection . MethodCaller . GetType ( AssemblyNameTranslator . GetAssemblyQualifiedName ( request . TypeName ) ) ;
165
165
var context = new DataPortalContext (
166
- _applicationContext , ( IPrincipal ) _applicationContext . GetRequiredService < ISerializationFormatter > ( ) . Deserialize ( request . Principal ) ,
166
+ _applicationContext , Deserialize < IPrincipal > ( request . Principal ) ,
167
167
true ,
168
168
request . ClientCulture ,
169
169
request . ClientUICulture ,
170
- ( IContextDictionary ) _applicationContext . GetRequiredService < ISerializationFormatter > ( ) . Deserialize ( request . ClientContext ) ) ;
170
+ Deserialize < IContextDictionary > ( request . ClientContext ) ) ;
171
171
172
172
var dpr = await dataPortalServer . Create ( objectType , criteria , context , true ) ;
173
173
@@ -197,25 +197,25 @@ public async Task<DataPortalResponse> Fetch(CriteriaRequest request)
197
197
if ( request is null )
198
198
throw new ArgumentNullException ( nameof ( request ) ) ;
199
199
200
- var result = _applicationContext . CreateInstanceDI < DataPortalResponse > ( ) ;
200
+ var result = new DataPortalResponse ( ) ;
201
201
try
202
202
{
203
203
request = ConvertRequest ( request ) ;
204
204
205
205
// unpack criteria data into object
206
- object ? criteria = GetCriteria ( _applicationContext , request . CriteriaData ) ;
206
+ object criteria = GetCriteria ( _applicationContext , request . CriteriaData ) ;
207
207
if ( criteria is DataPortalClient . PrimitiveCriteria primitiveCriteria )
208
208
{
209
209
criteria = primitiveCriteria . Value ;
210
210
}
211
211
212
- var objectType = Reflection . MethodCaller . GetType ( AssemblyNameTranslator . GetAssemblyQualifiedName ( request . TypeName ) , true ) ;
212
+ var objectType = Reflection . MethodCaller . GetType ( AssemblyNameTranslator . GetAssemblyQualifiedName ( request . TypeName ) ) ;
213
213
var context = new DataPortalContext (
214
- _applicationContext , ( IPrincipal ) _applicationContext . GetRequiredService < ISerializationFormatter > ( ) . Deserialize ( request . Principal ) ,
214
+ _applicationContext , Deserialize < IPrincipal > ( request . Principal ) ,
215
215
true ,
216
216
request . ClientCulture ,
217
217
request . ClientUICulture ,
218
- ( IContextDictionary ) _applicationContext . GetRequiredService < ISerializationFormatter > ( ) . Deserialize ( request . ClientContext ) ) ;
218
+ Deserialize < IContextDictionary > ( request . ClientContext ) ) ;
219
219
220
220
var dpr = await dataPortalServer . Fetch ( objectType , criteria , context , true ) ;
221
221
@@ -245,19 +245,19 @@ public async Task<DataPortalResponse> Update(UpdateRequest request)
245
245
if ( request is null )
246
246
throw new ArgumentNullException ( nameof ( request ) ) ;
247
247
248
- var result = _applicationContext . CreateInstanceDI < DataPortalResponse > ( ) ;
248
+ var result = new DataPortalResponse ( ) ;
249
249
try
250
250
{
251
251
request = ConvertRequest ( request ) ;
252
252
// unpack object
253
- object ? obj = GetCriteria ( _applicationContext , request . ObjectData ) ;
253
+ object obj = GetCriteria ( _applicationContext , request . ObjectData ) ?? throw new InvalidOperationException ( Resources . ObjectToBeUpdatedCouldNotBeDeserialized ) ;
254
254
255
255
var context = new DataPortalContext (
256
- _applicationContext , ( IPrincipal ) _applicationContext . GetRequiredService < ISerializationFormatter > ( ) . Deserialize ( request . Principal ) ,
256
+ _applicationContext , Deserialize < IPrincipal > ( request . Principal ) ,
257
257
true ,
258
258
request . ClientCulture ,
259
259
request . ClientUICulture ,
260
- ( IContextDictionary ) _applicationContext . GetRequiredService < ISerializationFormatter > ( ) . Deserialize ( request . ClientContext ) ) ;
260
+ Deserialize < IContextDictionary > ( request . ClientContext ) ) ;
261
261
262
262
var dpr = await dataPortalServer . Update ( obj , context , true ) ;
263
263
@@ -288,25 +288,25 @@ public async Task<DataPortalResponse> Delete(CriteriaRequest request)
288
288
if ( request is null )
289
289
throw new ArgumentNullException ( nameof ( request ) ) ;
290
290
291
- var result = _applicationContext . CreateInstanceDI < DataPortalResponse > ( ) ;
291
+ var result = new DataPortalResponse ( ) ;
292
292
try
293
293
{
294
294
request = ConvertRequest ( request ) ;
295
295
296
296
// unpack criteria data into object
297
- object ? criteria = GetCriteria ( _applicationContext , request . CriteriaData ) ;
297
+ object criteria = GetCriteria ( _applicationContext , request . CriteriaData ) ;
298
298
if ( criteria is DataPortalClient . PrimitiveCriteria primitiveCriteria )
299
299
{
300
300
criteria = primitiveCriteria . Value ;
301
301
}
302
302
303
- var objectType = Reflection . MethodCaller . GetType ( AssemblyNameTranslator . GetAssemblyQualifiedName ( request . TypeName ) , true ) ;
303
+ var objectType = Reflection . MethodCaller . GetType ( AssemblyNameTranslator . GetAssemblyQualifiedName ( request . TypeName ) ) ;
304
304
var context = new DataPortalContext (
305
- _applicationContext , ( IPrincipal ) _applicationContext . GetRequiredService < ISerializationFormatter > ( ) . Deserialize ( request . Principal ) ,
305
+ _applicationContext , Deserialize < IPrincipal > ( request . Principal ) ,
306
306
true ,
307
307
request . ClientCulture ,
308
308
request . ClientUICulture ,
309
- ( IContextDictionary ) _applicationContext . GetRequiredService < ISerializationFormatter > ( ) . Deserialize ( request . ClientContext ) ) ;
309
+ Deserialize < IContextDictionary > ( request . ClientContext ) ) ;
310
310
311
311
var dpr = await dataPortalServer . Delete ( objectType , criteria , context , true ) ;
312
312
@@ -328,12 +328,9 @@ public async Task<DataPortalResponse> Delete(CriteriaRequest request)
328
328
329
329
#region Criteria
330
330
331
- private static object ? GetCriteria ( ApplicationContext applicationContext , byte [ ] ? criteriaData )
331
+ private static object GetCriteria ( ApplicationContext applicationContext , byte [ ] criteriaData )
332
332
{
333
- object ? criteria = null ;
334
- if ( criteriaData != null )
335
- criteria = applicationContext . GetRequiredService < ISerializationFormatter > ( ) . Deserialize ( criteriaData ) ;
336
- return criteria ;
333
+ return applicationContext . GetRequiredService < ISerializationFormatter > ( ) . Deserialize ( criteriaData ) ?? throw new SerializationException ( Resources . ServerSideDataPortalRequestDeserializationFailed ) ;
337
334
}
338
335
339
336
#endregion Criteria
@@ -371,5 +368,16 @@ protected virtual DataPortalResponse ConvertResponse(DataPortalResponse response
371
368
}
372
369
373
370
#endregion Extention Method for Requests
371
+
372
+ private T Deserialize < T > ( byte [ ] data )
373
+ {
374
+ var deserializedData = _applicationContext . GetRequiredService < ISerializationFormatter > ( ) . Deserialize ( data ) ?? throw new SerializationException ( Resources . ServerSideDataPortalRequestDeserializationFailed ) ;
375
+ if ( deserializedData is not T castedData )
376
+ {
377
+ throw new SerializationException ( string . Format ( Resources . DeserializationFailedDueToWrongData , typeof ( T ) . FullName ) ) ;
378
+ }
379
+
380
+ return castedData ;
381
+ }
374
382
}
375
383
}
0 commit comments