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