3、IL编织
  静态织入的方式博主打算使用PostSharp来说明,一来这个使用起来简单,二来项目中用过这种方式。
  Postsharp从2.0版本开始收费了。为了说明AOP的功能,博主下载了一个免费版本的安装包,使用PostSharp与其它框架不太一样的是一定要下载安装包安装,只引用类库是不行的,因为上文说过,AOP框架需要为编译器或运行时添加扩展。使用步骤如下:
  (1)下载Postsharp安装包,安装。
  (2)在需要使用AOP的项目中添加PostSharp.dll 这个dll的引用。
  (3)定义拦截的方法:
  [Serializable]
  public class TestAop : PostSharp.Aspects.OnMethodBoundaryAspect
  {
  //发生异常时进入此方法
  public override void OnException(MethodExecutionArgs args)
  {
  base.OnException(args);
  }
  //执行方法前执行此方法
  public override void OnEntry(MethodExecutionArgs args)
  {
  base.OnEntry(args);
  }
  //执行方法后执行此方法
  public override void OnExit(MethodExecutionArgs args)
  {
  base.OnExit(args);
  }
  }
  注意这里的TestAop这个类必须要是可序列化的,所以要加上[Serializable]特性
  (4)在需要拦截功能的地方使用。
  在类上面加特性拦截,此类下面的所有的方法都会具有拦截功能。
[TestAop]public class Impc_TM_PLANT : Ifc_TM_PLANT
{
///
/// 获取或设置服务接口。
///
private Ic_TM_PLANTService service { get; set; }
public IList Find()
{
DTO_TM_PLANT otest = null;
otest.NAME_C = "test";
//异常,会进入OnException方法
return service.FindAll();      }  }
方法上面加特性拦截,只会拦截此方法。
[TestAop]
public IList Find()
{
DTO_TM_PLANT otest = null;
otest.NAME_C = "test";
return service.FindAll();
}
  有没有感觉很简单,很强大,其实这一简单应用,解决我们常见的日志、异常、权限验证等功能简直太小菜一碟了。当然Postsharp可能还有许多更加高级的功能,有兴趣可以深究下。
  4、MVC里面的Filter
public class AOPFilterAttribute : ActionFilterAttribute, IExceptionFilter
{
public void OnException(ExceptionContext filterContext)
{
throw new System.NotImplementedException();
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
}
}
  在controller里面使用该特性:
  [AOPFilter]
  public JsonResult GetEditModel(string strType)
  {
  var lstRes = new List>();
  var lstResPage = new List();
  //.........todo
  return Json(new { lstDataAttr = lstRes, PageAttr = lstResPage, lstJsConnections = lstJsPlumbLines }, JsonRequestBehavior.AllowGet);
  }
  调试可知,在执行GetEditModel(string strType)方法之前,会先执行OnActionExecuting()方法,GetEditModel(string strType)之后,又会执行OnActionExecuted()方法。这在我们MVC里面权限验证、错误页导向、日志记录等常用功能都可以方便解决。