【问题标题】:Aspect Oriented Programming in ASP.NET MVCASP.NET MVC 中的面向切面编程
【发布时间】:2014-04-23 12:33:14
【问题描述】:

我目前正在 ASP.NET 中开发一个 MVC 应用程序,并且我正在尝试分离关注点,以便最终得到更清晰、更易于维护的代码。

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

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

有没有集成的方法来做到这一点? ASP.NET MVC 能否像 Java 中的 AspectJ 一样与切面文件一起使用?

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

提前非常感谢!

【问题讨论】:

    标签: c# asp.net asp.net-mvc logging aop


    【解决方案1】:

    您可以使用属性以面向方面的方式实现功能。你想用你的功能包围的动作方法只需要用你的属性装饰:

    [CustomLogger]
    public ActionResult Index()
    {
        // Doing something here ...
        return View();
    }
    

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

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

    public class CustomLoggerAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            base.OnActionExecuted(filterContext);
    
            // Here goes your logic
        }
    
        // ...
    }
    

    ActionFilterAttribute 类允许您覆盖几个方法,以便您可以挂钩到 ASP.NET MVC 的操作执行管道:

    • OnActionExecuting
    • OnActionExecuted
    • OnResultExecuting
    • OnResultExecuted

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

    【讨论】:

    • 这个很有意思,可以在Controller级别使用吗?我的意思是,对类进行注释,使其自动应用于该控制器的所有操作。即使是这样,我也不喜欢注释我的控制器的想法,我正在考虑一种更透明的方式,以便控制器和日志记录方面完全独立。控制器不应该知道它是否被记录。
    • @MatiCicero 现在你比我快。 ;-) 是的,您可以将属性范围限定为单个操作方法、整个控制器或 ASP.NET MVC 应用程序中的每个控制器。这样,就不需要单个控制器知道该属性——只使用GlobalFilterCollection.Filters;此外,您不能忘记将属性应用于某个控制器,这对于身份验证/授权目的非常有用。
    • 好的,现在我们正在谈论@Marius Schulz!我喜欢这个想法,它可以用来不记录所有动作,而只记录满足某些签名的某些动作吗?我可能正在考虑使用反射,但如果有一种自动化的方式可以做到这一点,我会全力以赴!
    • @MatiCicero 有可能,是的。提供的filterContext 变量包含ActionDescriptor 类型的属性,它提供有关签名、参数等的信息。
    • @Mati Cicero,您最终使用这种方法感觉如何?您尝试过任何 AOP 库吗?您是否坚持使用这种方法或改变了主意?
    猜你喜欢
    • 2011-07-31
    • 2023-04-03
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 2010-09-23
    • 2010-09-18
    相关资源
    最近更新 更多