.NET下集中实现AOP编程的框架

1、Castle数组

使用这个框架呢,首先是须要安装NuGet包。框架

先创建一个控制台项目,而后在NuGet中搜索Castle.Windsor,不出意外的话应该能找到以下的包函数

而后安装,会自动的安装包Castle.Corepost

建立一个类CastleWindsor,实现接口IInterceptor,这个接口呢就在Castle.Core.dll中了spa

class CastleWindsor : IInterceptor
    {
        public void Intercept(IInvocation invocation)
        {
            PreProceed(invocation);
            Console.WriteLine("ffff");
            invocation.Proceed();
            PostProceed(invocation);

        }
        public void PreProceed(IInvocation invocation) { Console.WriteLine("方法执行前"); }
        public void PostProceed(IInvocation invocation) { Console.WriteLine("方法执行后"); }

    }

类中的Intercept函数来自于接口IInterceptor。而函数IInterceptor和PostProceed并非必须的,能够没有这两个函数,主要仍是看Intercept函数中的invocation.Proceed();这一句。在这一句以前添加的代码确定先于修饰的函数执行,在这以后的代码,晚于3d

修饰的函数执行。code

而后定义服务端,就是完成业务功能的代码段。对象

  public interface IUserProcessor {
        void RegUser(string txt);
        void WriteMessage(string msg);
    }
    public class UserProcessor : IUserProcessor {
        public virtual void RegUser(string txt) {
            Console.WriteLine("用户已注册。Name:{0}", txt);
        }

        public virtual void WriteMessage(string msg)
        {
            Console.WriteLine(msg);
        }
    }

假设的是这个接口和类就是为了完成业务功能的地方。blog

而后建立客户端来调用服务端:接口

 
 

class CoreBusiness
{

  public void Work_5()

 { try { Castle.DynamicProxy.ProxyGenerator generator = new Castle.DynamicProxy.ProxyGenerator(); CastleWindsor interceptor = new CastleWindsor(); IUserProcessor userprocessor = generator.CreateClassProxy<UserProcessor>(interceptor); userprocessor.WriteMessage("555555555555"); userprocessor.RegUser("123123123123"); } catch (Exception ex) { throw ex; } }
}

注意看这个客户端的代码,这里有一个UserProcessor的对象userprocessor,可是却没有经过new关键字来建立,而是经过ProxyGenerator的CreateClassProxy函数来建立,从而将CastleWindsor类和UserProcessor类联系起来了。

在main函数中调用Work_5,执行结果:

从执行结果中能够看出来,每次调用服务端的函数,都会执行Intercept函数。

这个框架来实现AOP的话,若是是项目开发中就应用了这个框架还好,不然在开发完成后才来引入这个框架,那么势必要对原来的代码进行大量的修改。这一点上还不如筛选器和postsharp框架。

 固然这个框架也能够在函数执行前获取函数的参数值,在函数执行后,能获取函数的返回值。要注意的是,不能获取到函数的参数名

 经过如下方式来获取参数值和返回值

 

invocation.Method.Name:函数名

invocation.Arguments:参数值的数组。invocation.Arguments的类型是object[]

invocation.ReturnValue:函数返回值,注意这个必须是在invocation.Proceed()执行以后且函数有返回值的状况下才有值。类型是object

看看Intercept函数的参数类型。注意标红线的地方。ReturnValue不是只读的,那就是说能够在函数执行完成后,去修改函数的返回值。SetArgumentValue表示能够在函数执行前,去修改函数的参数。

 

相关文章
相关标签/搜索