`
Mr_Tank_
  • 浏览: 22596 次
  • 性别: 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、测试结果:


【敬请批评指正】


分享到:
评论

相关推荐

    利用C#实现AOP常见的几种方法详解

    有一些完整的AOP框架,如Spring.NET和NAspect,它们提供了一套完整的面向切面编程解决方案,包括切点表达式、通知(advice)、切面(aspect)等概念。这些框架使得AOP的使用更加标准化,但也增加了项目依赖。 在...

    动态方法拦截(AOP)的N种解决方案.docx

    在AOP中,可以通过IL Emit创建一个代理类,该类实现目标接口,并在代理类的方法中添加拦截逻辑。例如,对于实现了IFoobar接口的Foobar类,可以生成一个FoobarProxy代理类,该类同样实现IFoobar接口并在Invoke方法中...

    Spring.net实例

    在Spring.NET中,AOP通过代理机制实现,分为两种类型:静态代理和动态代理。静态代理通常在编译时创建,而动态代理则在运行时创建。 围绕通知是Spring.NET AOP中的一个重要概念,它是一种特殊的通知类型,可以在...

    MyAOP(AOP拓展实现小例子).zip

    本文将深入探讨如何在Unity中实现AOP,并基于"MyAOP(AOP拓展实现小例子).zip"的项目进行解析。 首先,我们需要理解Unity中的AOP基础。Unity本身并不内置对AOP的支持,但我们可以通过引入第三方库或自定义解决方案来...

    NET框架中AOP技术的研究与实现。

    在.NET框架中实现AOP技术,首先需要理解AOP的概念及其技术特点。AOP将软件开发中通用的服务功能与核心业务逻辑分离,通过引入交叉关注点的概念,开发者可以更好地封装和互操作程序。AOP的核心思想是将业务逻辑与非...

    Spring.NET-2.0.0-M2

    2. **Spring.Aop**: 实现了.NET平台上的面向切面编程,支持动态代理和静态代理两种方式。开发者可以定义切面,将通用行为如事务管理、日志记录等与业务逻辑分离。 3. **Spring.Data**: 提供了一种统一的数据库访问...

    Unity DLL注入,支持全平台,支持Mono和IL2CPP,支持注入引擎和用户DLL。可以实现AOP、装饰器等功能.zip

    DLL注入在Windows平台上相对常见,但在Unity中实现则需要特殊的技术手段。因为Unity的沙盒环境限制了对游戏进程的直接访问,所以通常会通过以下步骤实现: 1. **创建DLL**:首先,你需要编写一个C#库(DLL),包含...

    设计模式

    在.NET中,可以使用接口实现动态代理,例如AOP(面向切面编程)框架中的拦截器,用于添加日志、事务控制等功能。 5. 观察者模式:定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象...

    spring-zwz.zip

    本文将深入探讨标题"spring-zwz.zip"所提及的几个关键概念,包括第一个Spring程序、IOC(Inversion of Control,控制反转)、DI(Dependency Injection,依赖注入)、静态代理和动态代理,以及AOP(Aspect-Oriented ...

    设计模式源码 NET C#

    在.NET中,动态代理(如System.Reflection.Emit或System.Proxy)可以实现运行时创建代理类,用于拦截方法调用,实现AOP(面向切面编程)。 行为型模式中的策略模式允许在运行时选择算法或策略。通过定义一系列可...

    C#+3.0设计模式

    C#中的远程代理和虚拟代理可以通过.NET Remoting或WCF实现,而拦截器模式则可以使用AOP(面向切面编程)框架如PostSharp实现。 7. **命令模式**:将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;...

    JAVA程序员必读.7z

    9. **反射和动态代理**:反射允许程序在运行时检查和操作类、接口、字段和方法,动态代理则可以在运行时创建并实现接口的代理类,常用于AOP(面向切面编程)。 10. **设计模式**:设计模式是解决软件设计中常见问题...

    YIIHAW-开源

    YIIHAW 作为 .NET 平台上的静态跨语言方面编织器,为开发者提供了高效、无运行时开销的 AOP 解决方案。通过理解并应用 YIIHAW,开发人员可以更好地组织代码,提高软件的可维护性和可扩展性。开源特性使得 YIIHAW ...

    反射工具可查看类的很强大

    9. **动态代理**:通过反射可以创建动态代理,实现AOP(面向切面编程)或拦截器模式。 10. **序列化和反序列化**:在序列化和反序列化过程中,反射可以帮助我们处理非标准的序列化需求。 总的来说,反射工具提供了...

    CrossCutting:通用实用程序和其他内容,可在任何解决方案的任何层中使用

    C#中实现AOP的方式包括使用特性(Attributes)和动态代理,如Unity Container、Autofac等依赖注入容器支持的AOP特性。 "通用实用程序"通常包括各种辅助函数、工具类和静态类,它们提供了一些常见的功能,如字符串...

Global site tag (gtag.js) - Google Analytics