一、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("");
userprocessor.RegUser("");
}
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表示可以在函数执行前,去修改函数的参数。

最新文章

  1. 错误 You are trying to run the Python 2 version of Beautiful Soup under Python 3. This will not work
  2. JAVA 1.7 流程控制语句 续
  3. Disruptor 极速体验
  4. SQL Server代理(4/12):配置数据库邮件
  5. iOS监听键盘事件
  6. WPF翻转动画
  7. 用linux的shell脚本把目录下面的所有文件的文件内容中的小写字母改成大写字母
  8. 【NOIP2002】矩形覆盖 DFS
  9. MPMoviePlayerController
  10. 安卓服务Service详解
  11. VS code 中的各种变量 ${file},${fileBasename}
  12. Map.putAll方法
  13. Delphi 10.2.3
  14. BZOJ3590 SNOI2013Quare(状压dp)
  15. [HihoCoder1369]网络流一&#183;Ford-Fulkerson算法
  16. subprocess.Popen模块
  17. hdu 4920
  18. [fixed] 解决 slf4j + log4j eclipse 可以打印日志,而在云服务器上不能打印
  19. [Done]ftp使用小结
  20. Java泛型的协变

热门文章

  1. 【转】 一张图看懂开源许可协议,开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别
  2. Firefox下td用display控制页面导致页面变形
  3. Unity Critter地图导出到server配置
  4. linux系统编程:线程同步-相互排斥量(mutex)
  5. oracle的日期蛋
  6. C项目实践--图书管理系统(4)
  7. method.invoke()使用
  8. 解决安装YII2 速度慢 失败等问题
  9. 六:多线程--自定义NSOperation
  10. BZOJ3160【万径人踪灭】 【FFT】