1. 程式人生 > >AOP面向切面編程

AOP面向切面編程

文件 library 執行方法 color ise cati 字符 arm ado

首先是下載準備好三個dll類庫

Microsoft.Practices.EnterpriseLibrary.PolicyInjection.dll

Microsoft.Practices.Unity.dll

Microsoft.Practices.Unity.Interception.dll

第二步、將三個dll文件,包含進項目的DLL類庫文件夾,然後在項目中引用它們三個。

第三步、定義一個Handler類

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Practices.Unity.InterceptionExtension; namespace Aop { public class Handler : ICallHandler { public int Order { get; set; } public string MethodName { get; set; }
// input是方法的參數,getNext是要執行的方法
public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) { Console.WriteLine(
"攔截方法前的邏輯" + MethodName); var inputs = input.Inputs; if (inputs.Count > 0) { for (int i = 0; i < inputs.Count; i++) { Console.WriteLine("參數:" + Serializer.ToJson(inputs[i])); } }
var returnmsg = getNext()(input, getNext); return returnmsg; } } }

2)頂一個一個HandlerAttr.cs類

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Practices.Unity.InterceptionExtension;
using Microsoft.Practices.Unity;

namespace Aop
{
    public class HandlerAttr : HandlerAttribute
    {
        public string MethodName { get; set; }

        public override ICallHandler CreateHandler(IUnityContainer container)
        {
            return new Handler() { MethodName = this.MethodName };
        }
    }
}

3)一個其他的幫助類,提前已經準備好了。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace Aop
{
    /// <summary>
    /// 強類型JSON序列化幫助類
    /// </summary>
    public class Serializer
    {
        /// <summary>
        /// 序列化目標對象
        /// </summary>
        /// <typeparam name="T">對象類型</typeparam>
        /// <param name="obj">對象實例</param>
        /// <returns>Json字符串</returns>
        public static string ToJson<T>(T obj)
        {
            if (obj == null) return string.Empty;
            System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(obj.GetType());
            MemoryStream ms = new MemoryStream();
            serializer.WriteObject(ms, obj);
            string retVal = System.Text.Encoding.UTF8.GetString(ms.ToArray());
            ms.Dispose();
            return retVal;
        }

        /// <summary>
        /// 反序列化json字符為對象實例
        /// </summary>
        /// <typeparam name="T">目標對象類型</typeparam>
        /// <param name="json">json字符串</param>
        /// <returns>對象實例</returns>
        public static T ToObject<T>(string json)
        {
            T obj = Activator.CreateInstance<T>();
            MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json));
            System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(obj.GetType());
            obj = (T)serializer.ReadObject(ms);
            ms.Close();
            ms.Dispose();
            return obj;
        }
    }
}

4)給一個方法標記上特性

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Aop
{
    public class Parm {
        public string Key { get; set; }
    }

    public interface ITest
    {
        void Method(string str);
        void Method2(Parm p);
    }

    public class Test : MarshalByRefObject, ITest
    {
        [HandlerAttr(MethodName = "Method註解")]
        public void Method(string str)
        {
            Console.WriteLine(string.Format("這是Method(),參數是:{0}", str));
        }

        [HandlerAttr(MethodName = "Method2註解")]
        public void Method2(Parm p)
        {
            Console.WriteLine("這是Method2()");
        }
    }
}

5)調用執行方法,查看切面代碼是否執行。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Practices.EnterpriseLibrary.PolicyInjection;

namespace Aop
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Test test = PolicyInjection.Create<Test>();
                test.Method("A");

                test.Method2(new Parm() { Key = "A" });
            }
            catch (Exception ex)
            {
            }
            finally
            {
                Console.ReadLine();
            }
        }
    }
}

AOP面向切面編程