`
Mr_Tank_
  • 浏览: 21195 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

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

 
阅读更多

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、测试结果:


【敬请批评指正】


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics