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);
    }
}

 

posted @ 2013-11-11 18:11  feidaochuanqing  阅读(349)  评论(0编辑  收藏  举报