AOP面向切面编程

 

 

首先是下载准备好三个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();
            }
        }
    }
}
复制代码

 

  

 

posted on   荆棘人  阅读(148)  评论(0编辑  收藏  举报

编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示