ASP.NET MVC中面向方面的编程

Mat*_*ero 8 c# asp.net asp.net-mvc logging aop

我目前正在ASP.NET中开发一个MVC应用程序,我正在尝试分离问题,以便最终得到更清晰,更可维护的代码.

所以,作为一个起点,我正在考虑一个日志方面.我的想法是记录(最初)每个控制器中每个方法的调用和返回.我将这个逻辑放在一个专门用于记录的单独的类上,所以我不会在任何地方使用日志语句来破坏我的代码.

我还需要访问Http请求,以便获取客户端信息.

有没有综合的方法来做到这一点?ASP.NET MVC可以像AspectJ一样在Java中使用方面文件吗?

此外,它以后可以配置为记录满足某些条件的方法吗?(如签名,返回值,异常抛出等)

首先十分感谢!

Mar*_*ulz 12

您可以使用属性以面向方面的方式实现功能.您希望使用您的功能包围的操作方法只需要使用您的属性进行修饰:

[CustomLogger]
public ActionResult Index()
{
    // Doing something here ...
    return View();
}
Run Code Online (Sandbox Code Playgroud)

您可以使用属性,整个控制器来装饰单个操作方法,甚至可以通过ASP.NET MVC全局应用该属性GlobalFilterCollection.

以下是您声明属性的方式:

public class CustomLoggerAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        base.OnActionExecuted(filterContext);

        // Here goes your logic
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

ActionFilterAttribute级允许你覆盖了几个方法,所以你可以挂接到ASP.NET MVC的行动执行流水线:

  • OnActionExecuting
  • OnActionExecuted
  • OnResultExecuting
  • OnResultExecuted

您可以通过ActionExecutedContext传递给上述方法的参数(例如)访问请求变量.

  • @MatiCicero现在你比我快.;-)是的,您可以将属性范围限定为ASP.NET MVC应用程序中的单个操作方法,整个控制器或每个控制器.这样,没有一个控制器需要知道属性 - 只使用`GlobalFilterCollection.Filters`; 此外,您不能忘记将属性应用于某个控制器,这对于身份验证/授权非常有用. (2认同)