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

一、Castle

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

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

然后安装,会自动的安装包Castle.Core

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

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();这一句。在这一句之前添加的代码肯定先于修饰的函数执行,在这之后的代码,晚于

修饰的函数执行。

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

  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);
        }
    }

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

然后创建客户端来调用服务端:


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表示可以在函数执行前,去修改函数的参数。

 

原文地址:https://www.cnblogs.com/jin-/p/9715820.html