zoukankan      html  css  js  c++  java
  • 【.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、测试结果:


    【敬请批评指正】


  • 相关阅读:
    查询URL字符串参数
    location 对象
    css3 文字特效
    functionDo
    css3 渐变
    [LeetCode][Java]Peeking Iterator
    [LeetCode][JavaScript]Expression Add Operators
    [LeetCode][JavaScript]Different Ways to Add Parentheses
    [LeetCode][JavaScript]Move Zeroes
    [LeetCode][JavaScript]Binary Tree Postorder Traversal
  • 原文地址:https://www.cnblogs.com/james1207/p/3253579.html
Copyright © 2011-2022 走看看