wcf-aop
1.扩展OperationBehavior
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel.Description; using System.ServiceModel.Dispatcher; namespace Extend2 { [AttributeUsage(AttributeTargets.Method)] public class MyOperationBehavior:Attribute,IOperationBehavior { private string _functionID; public MyOperationBehavior(string functionid) { _functionID = functionid; } public string FunctionID { get { return _functionID; } set { _functionID = value; } } #region IOperationBehavior 成员 public void AddBindingParameters(OperationDescription operationDescription, System.ServiceModel.Channels.BindingParameterCollection bindingParameters) { } public void ApplyClientBehavior(OperationDescription operationDescription, System.ServiceModel.Dispatcher.ClientOperation clientOperation) { } public void ApplyDispatchBehavior(OperationDescription operationDescription, System.ServiceModel.Dispatcher.DispatchOperation dispatchOperation) { IOperationInvoker oldInvoker = dispatchOperation.Invoker; dispatchOperation.Invoker = new MyOperationInvoker(oldInvoker,this._functionID); } public void Validate(OperationDescription operationDescription) { } #endregion } }
2.OperationInvoker
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel.Dispatcher; namespace Extend2 { class MyOperationInvoker:IOperationInvoker { IOperationInvoker oldInvoker; private string functionid; public MyOperationInvoker(IOperationInvoker oldInvoker,string functionid) { this.oldInvoker = oldInvoker; this.functionid = functionid; } #region IOperationInvoker 成员 public object[] AllocateInputs() { return oldInvoker.AllocateInputs(); } public object Invoke(object instance, object[] inputs, out object[] outputs) { this.BeginInvoke(); var returnValue = oldInvoker.Invoke(instance, inputs, out outputs); this.EndInvoke(); return returnValue; } public IAsyncResult InvokeBegin(object instance, object[] inputs, AsyncCallback callback, object state) { return null; } public object InvokeEnd(object instance, out object[] outputs, IAsyncResult result) { outputs = null; return null; } public bool IsSynchronous { get { return oldInvoker.IsSynchronous; } } #endregion private void BeginInvoke() { Console.WriteLine("begin invoke"); Console.WriteLine("functionid i s .." + this.functionid); } private void EndInvoke() { Console.WriteLine("end invoke"); } } }
3.ServiceBehavior
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; using System.ServiceModel.Description; namespace Extend2 { /// <summary> /// 服务拦截属性 /// </summary> [AttributeUsage(AttributeTargets.Class)] public class MyServiceInterceptorAttribute:Attribute,IServiceBehavior { #region IServiceBehavior 成员 public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, System.ServiceModel.Channels.BindingParameterCollection bindingParameters) { } public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { foreach (var endPoint in serviceDescription.Endpoints) { foreach (var operation in endPoint.Contract.Operations) { bool isExsit = false; foreach (var behavior in operation.Behaviors) { if (behavior is MyOperationBehavior) { isExsit = true; break; } } if (!isExsit) { operation.Behaviors.Add(new MyOperationBehavior("")); } } } } public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { } #endregion } }
4.Service
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Extend2; namespace Service { [MyServiceInterceptor] public class CalculateService:ICalculate { #region ICalculate 成员 [MyOperationBehavior("F_0000")] public int Add(int a, int b) { return a + b; } #endregion } }
5.IContract
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; namespace Service { [ServiceContract] public interface ICalculate { [OperationContract] int Add(int a, int b); } }