`

castle动态代理的使用

阅读更多

动态代理的原理


原理其实很简单,就是在运行时生成新的对象,姑且叫做T,并使T继承自需要代理的原对象,调用过程实际是调用了新的对象T.

通过对T中方法或属性等,添加些自定义的操作,从而实现对原对象访问的封装.

 

动态代理实现(利用castle)

 

castle的动态代理需要下面几步

  1. 自定义一个拦截器,必须实现 IInterceptor 接口
  2. 使用 ProxyGenerator 对象创建代理对象,对象中包含很多方法
  3. 对原对象的所有操作,都使用代理对象代替
  4. 在拦截器的方法中,加入自定义的操作,比如 记录参数调用日志,异常记录等.

 

 简单拦截器实现代码:  SampleInterceptor.cs

 

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using Castle.Core.Interceptor;
using System.Reflection;

/// <summary>
/// 拦截器示例
/// </summary>
public class SampleInterceptor : IInterceptor
{
	public SampleInterceptor()
	{
		//
		//TODO: 在此处添加构造函数逻辑
		//
	}

    public void Intercept(IInvocation invocation)
    {

        output("开始进入拦截器");

        MethodInfo concreteMethod = invocation.GetConcreteMethod();

        
        if (!invocation.MethodInvocationTarget.IsAbstract)
        {
            output("开始执行 " + concreteMethod.Name);

            //执行原对象中的方法
            invocation.Proceed();

            output("执行结果 " + invocation.ReturnValue);
        }

        output("执行完毕");
    }

    private void output(string Message)
    {
        HttpContext.Current.Response.Write(Message + "<br>");
    }
}

 

 示例中使用的接口 : IPerson.cs

 

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;

/// <summary>
///IPerson 的摘要说明
/// </summary>
public interface IPerson
{
    /// <summary>
    /// 姓名
    /// </summary>
    string Name { get; }

    /// <summary>
    /// 地址
    /// </summary>
    string Address { get; }

    /// <summary>
    /// 正在做什么
    /// </summary>
    /// <returns></returns>
    string Doing();
}

 

对接口的实现:Person.cs

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;

/// <summary>
///Person 的摘要说明
/// </summary>
public class Person : IPerson
{
	public Person()
	{
		//
		//TODO: 在此处添加构造函数逻辑
		//
	}

    #region IPerson 成员

    public string Name
    {
        get { return "我是花生米"; }
    }

    public string Address
    {
        get { return "我住在 http://pignut-wang.iteye.com/ "; }
    }

    public string Doing()
    {
        return "我正在写blog";
    }

    #endregion
}

 

所有要使用到的对象都准备好了,下面就是调用的代码

using System;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using Castle.DynamicProxy;

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //创建拦截器对象
        SampleInterceptor Interceptor = new SampleInterceptor();
        
        //给person类生成代理
        ProxyGenerator Generator = new ProxyGenerator();
        IPerson p = Generator.CreateInterfaceProxyWithTarget<IPerson>(new Person(), Interceptor);

        //执行方法看效果
        p.Doing();
    }
}

 

执行的效果就是在页面上输出4句话,如下

 

开始进入拦截器
开始执行 Doing
执行结果 我正在写blog
执行完毕

 

动态代理的应用

 

这个我就不罗唆说了,随便搜一下,大把的,只说一句.

主要用于和业务无关几乎每个方法都要用到的操作,如权限验证,日志记录,自动事务控制....反正很多了.

 

 

2
1
分享到:
评论

相关推荐

    castle IOC AOP动态代理应用

    总的来说,结合使用Castle IOC和AOP动态代理,开发者可以构建出松散耦合、模块化的系统,提高代码的复用性和可测试性,同时还能优雅地处理系统中的横切关注点。在处理如WebService这样的远程服务时,这种能力尤为...

    Castle Dynamic Proxy代理使用

    Castle Dynamic Proxy代理使用 Castle Dynamic Proxy是.NET平台下的一个动态代理库,提供了一个灵活的方式来生成代理类。它可以动态生成透明代理类型,不需要实体类继承MarshalByRef或ContextBoundObject。 Castle...

    castle.net AOP教程

    Castle动态代理是实现AOP的关键组件,它允许在运行时创建代理对象,这些代理可以在调用实际对象方法之前和之后插入额外的行为。动态代理有两种主要类型:基于接口的代理(InterfaceProxy)和基于类型的代理(Castle....

    Castle AOP例子

    在这个"Castle AOP例子"中,我们将探讨如何利用Castle动态代理库来实现AOP概念。 首先,让我们理解什么是AOP。面向切面编程是一种编程范式,旨在提高软件的可维护性和可扩展性,通过将关注点(如日志、事务管理、...

    Castle需要用的引用文件

    Castle.NET 是一个强大的开源框架,它为.NET开发者提供了多种功能,包括动态代理、依赖注入(DI)和控制反转(IoC)容器、AOP(面向切面编程)以及元数据等。在“Castle需要用的引用文件”这个主题下,我们主要关注...

    Winform使用Castle

    总结,通过在VS2010的Winform应用中使用Castle,你可以实现更高效、可维护的代码结构,降低组件间的耦合度,并提供更强大的功能,如依赖注入和动态代理。文件列表中的`CastleManagerTool.sln`和`CastleManagerTool....

    winform上的mvvm框架--升级版(动态代理)

    标题“winform上的mvvm框架--升级版(动态代理)”揭示了我们将在WinForm环境中实现一个基于MVVM模式的框架,并且这个升级版的关键特点是使用了Castle动态代理技术。 首先,MVVM(Model-View-ViewModel)是一种设计...

    代理模式及动态代理资料和源代码

    Spring AOP使用动态代理来实现切面功能。它可以基于JDK动态代理(如果目标类实现了接口)或CGLIB(如果目标类没有接口)。Spring AOP代理可以在方法调用前后自动插入切面逻辑,如事务管理、性能监控等。 5. **代理...

    Castle动态代理拦截器可跟踪模型更改和触发规则

    首先,`Castle Dynamic Proxy` 是一个开源库,它是.NET平台上广泛使用的动态代理实现之一。它提供了创建接口或类的代理对象的能力,这些代理对象可以在调用原始方法之前或之后插入自定义的行为。这对于实现AOP(面向...

    IBatisNet+Castle项目实例

    IBatisNet是.NET平台上的一个轻量级持久层框架,而Castle则是.NET开发中的一个全面的工具集,包含了如动态代理、依赖注入和微容器等功能。 首先,让我们深入理解这两个核心组件: 1. **IBatisNet**:这是一个SQL...

    Castle 源码 源代码

    4. **Castle.Core**:这是Castle项目的基础库,提供了许多核心服务和设施,如事件发布/订阅、动态代理(用于AOP)、线程池等。Castle.Core也是其他组件如Windsor和ActiveRecord的依赖。 5. **Castle源码分析**:...

    Castle.Core.3.1.0.zip

    动态代理是Castle.Core的一个重要组成部分,它允许在运行时生成代理类,这些代理类可以拦截并扩展原对象的方法调用。这在实现AOP、事务管理、日志记录等方面非常有用。例如,通过Castle.DynamicProxy,我们可以轻松...

    castle资料

    "castle资料"这一主题主要涉及的是Castle项目,它是一个开源的.NET框架,旨在提供一系列强大的设计模式实现,如依赖注入(DI)、面向切面编程(AOP)以及动态代理等。下面将详细介绍 Castle 项目的核心知识点及其...

    Castle最新源码

    Castle是.NET平台上一个开源项目,它提供了一系列强大的工具和库,包括动态代理、依赖注入容器(Windsor)以及AOP(面向切面编程)框架。这个“Castle最新源码”压缩包包含了该项目的最新开发版本,对于.NET开发者,...

    Castle 的 IOC 容器

    **Dynamic Proxy** 是 Castle 项目中的一个关键组件,它利用 .NET 的 Emit 技术实现了动态代理。Dynamic Proxy 在 AOP、NHibernate 和 IBatis 等技术中都有广泛应用。对于 .NET 开发者而言,理解和掌握 Dynamic ...

    Castle框架

    2. **Castle Dynamic Proxy**: 这个组件允许动态创建代理类,可以用于实现AOP(面向切面编程),例如日志记录、性能监控、事务管理等功能。通过动态代理,可以在不修改原有代码的情况下添加额外的行为。 3. **...

    Castle简单实例

    Castle的核心组件包括Castle Windsor,一个全面的依赖注入容器,以及Castle Dynamic Proxy,一个用于创建代理对象的强大工具。 **Castle Windsor容器** Castle Windsor是Castle项目中的关键部分,它是一个功能丰富...

    .NET动态代理介绍

    另一种方式是使用`System.Proxy`命名空间中的`ProxyGenerator`类,它提供了对.NET接口的默认动态代理实现,即` Castle.DynamicProxy`库。 ### 方案一:手动编写代理解决 1. 首先,我们定义一个接口`ICalculator`,...

    Castle3.0卷1

    本卷会深入讲解如何创建和使用动态代理,并提供实际示例。 4. **持久化(Persistence)**:Castle ActiveRecord是Castle3.0提供的ORM(对象关系映射)框架,它简化了.NET应用程序与数据库之间的交互。本卷将介绍...

Global site tag (gtag.js) - Google Analytics