【.NET中AOP的实现方案】静态代理

来源:互联网 发布:独立域名 二级域名 编辑:程序博客网 时间:2024/05/18 17:28

Spring AOP 应该是比较出名的了,今天说的是C#里的AOP,C#的AOP实现的方式有很多种,现在就先介绍静态代理的实现方案;

模拟场景:我们在删除用户,或者更新用户的时候进行数据原始备份,这样的话需要在删除操作进行之前进行一些数据相应的操作,但是我们又不想在删除操作里面做一些与删除无关的操作,这样使用AOP就解决这个问题了;更新操作也一样。

下面是示例代码(省略引用):

1、首先是实体类

namespace AOP_Test1{    //实体类    public class User    {        public int id { get; set; }        public String name { get; set; }        public String password { get; set; }        //重写方法        public override string ToString()        {            return "id:" + id + ";name:" + name + ";password:" + password;        }    }}

2、数据操作接口

namespace AOP_Test1{    //接口,数据操作    public interface IUser    {        void delete(User user);        void update(User user);    }}

3、接口实现

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace AOP_Test1{    //IUser接口实现    public class IUserImpl:IUser    {        public void delete(User user) {            System.Console.WriteLine("删除用户");        }        public void update(User user) {            System.Console.WriteLine("更新用户");        }    }}

4、对IUser进行装饰

namespace AOP_Test1{    //IUser装饰类    public class IUserDecorator : IUser    {        public IUser iuser { get; set; }        public IUserDecorator(IUserImpl iUserImpl)        {            iuser = iUserImpl;        }        //删除        public void delete(User user)        {            beforeDelete(user);            iuser.delete(user);            afterDelete();        }        protected void beforeDelete(User user)        {            Console.WriteLine(DateTime.Now + ":删除之前进行数据备份:");            Console.WriteLine("备份数据:" + user.ToString());        }        protected void afterDelete()        {            Console.WriteLine("删除操作完成.");        }        //更新        public void update(User user)        {            beforeUpdate(user);            user.name = "TanWeijie";            iuser.update(user);            afterUpdate(user);        }        protected void beforeUpdate(User user)        {            Console.WriteLine(DateTime.Now + ":更新之前进行数据备份:");            Console.WriteLine("更新前数据:" + user.ToString());        }        protected void afterUpdate(User user)        {            Console.WriteLine("更新操作完成.");            Console.WriteLine("更新后数据:" + user.ToString());        }    }}

5、测试:

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace AOP_Test1{    class Program    {        static void Main(string[] args)        {            User user = new User();            user.id = 1;            user.name = "Tan";            user.password = "123456";            IUser iuser = new IUserDecorator(new IUserImpl());            iuser.delete(user);            Console.WriteLine();            iuser.update(user);        }    }}

6、测试结果:


【敬请批评指正】


原创粉丝点击