added samples
[windows-sources.git] / sdk / samples / WCFSamples / TechnologySamples / Extensibility / Instancing / Durable / CS / extensions / OperationInvoker.cs
blob0c3d4dbc2b0e0fb8317c2542571e08344fe17e2d
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using System.ServiceModel;
5 using System.ServiceModel.Dispatcher;
7 namespace Microsoft.ServiceModel.Samples
10 //This class contains the implementation of IOperationInvoker
11 //which is used to persist the service instance after invoking the
12 //operation.
13 class OperationInvoker : IOperationInvoker
15 IOperationInvoker innerOperationInvoker;
17 public OperationInvoker(IOperationInvoker innerOperationInvoker)
19 this.innerOperationInvoker = innerOperationInvoker;
22 public object[] AllocateInputs()
24 return innerOperationInvoker.AllocateInputs();
27 public object Invoke(object instance, object[] inputs, out object[] outputs)
29 // Invoke the operation using the inner operation
30 // invoker.
31 object result = innerOperationInvoker.Invoke(instance,
32 inputs, out outputs);
34 // Save the instance using the storage manager saved in the
35 // current InstanceContext.
36 InstanceContextExtension extension =
37 OperationContext.Current.InstanceContext.Extensions.Find<InstanceContextExtension>();
39 extension.StorageManager.SaveInstance(extension.ContextId, instance);
40 return result;
43 public IAsyncResult InvokeBegin(object instance, object[] inputs,
44 AsyncCallback callback, object state)
46 return innerOperationInvoker.InvokeBegin(instance, inputs, callback, state);
49 public object InvokeEnd(object instance, out object[] outputs, IAsyncResult asyncResult)
51 // Finish invoking the operation using the inner operation
52 // invoker.
53 object result = innerOperationInvoker.InvokeEnd(instance, out outputs, asyncResult);
55 // Save the instance using the storage manager saved in the
56 // current InstanceContext.
57 InstanceContextExtension extension =
58 OperationContext.Current.InstanceContext.Extensions.Find<InstanceContextExtension>();
60 extension.StorageManager.SaveInstance(extension.ContextId, instance);
61 return result;
64 public bool IsSynchronous
66 get { return innerOperationInvoker.IsSynchronous; }