public class FacadeOperationInvoker : IOperationInvoker
{
private IOperationInvoker invoker;
private OperationDescription operationDescription;
public FacadeOperationInvoker(IOperationInvoker invok, OperationDescription opDescription)
this.invoker = invok;
this.operationDescription = opDescription;
}
#region IOperationInvoker Members
public object[] AllocateInputs()
return invoker.AllocateInputs();
public object Invoke(object instance, object[] inputs, out object[] outputs)
object returnedValue = invoker.Invoke(instance, inputs, out outputs);
if (returnedValue != null)
if (operationDescription.Name.StartsWith("Add"))
return Convert.ToInt32(returnedValue) + 10000;
return returnedValue;
public IAsyncResult InvokeBegin(object instance, object[] inputs, AsyncCallback callback, object state)
return invoker.InvokeBegin(instance, inputs, callback, state);
public object InvokeEnd(object instance, out object[] outputs, IAsyncResult result)
return invoker.InvokeEnd(instance, out outputs, result);
public bool IsSynchronous
get { return invoker.IsSynchronous; }
#endregion
public class FacadeOperationBehavior : Attribute, IOperationBehavior
#region IOperationBehavior Members
public void AddBindingParameters(OperationDescription operationDescription,
System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
return;
public void ApplyClientBehavior(OperationDescription operationDescription,
System.ServiceModel.Dispatcher.ClientOperation clientOperation)
throw new NotImplementedException();
public void ApplyDispatchBehavior(OperationDescription operationDescription,
System.ServiceModel.Dispatcher.DispatchOperation dispatchOperation)
IOperationInvoker invoker = dispatchOperation.Invoker;
// Override default Behavior
dispatchOperation.Invoker = new FacadeOperationInvoker(invoker, operationDescription);
public void Validate(OperationDescription operationDescription)
[ServiceContract()]
public interface IService1
[OperationContract(Name = "Add2")]
[THB.Sample.ServiceModel.Extensions.FacadeOperationBehavior()]
int Add(int i, int j, int k, int l);
[OperationContract(Name = "Add1")]
int Add(int i, int j, int k);
[OperationContract()]
int Add(int i, int j);
int AddWithConstant(int i);
int Div(int i, int j);
int Minus(int i, int j);
int Mult(int i, int j);