asp.netMVC中使用aop进行关注点分离

 

资源地址:https://stackoverflow.com/questions/23244400/aspect-oriented-programming-in-asp-net-mvc

从页面复制过来的内容:

问题:

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

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

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

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

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

首先十分感谢!

-----------------------------------------------------

回答:

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

[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传递给上述方法的参数(例如访问请求变量

----------------------------------------------------end

 您最好查看原文,原文比较清晰更容易看懂。

 

====================================

文章:C# 实现AOP 的几种常见方式

第一种:静态织入,即:在编译时,就将各种涉及AOP拦截的代码注入到符合一定规则的类中,编译后的代码与我们直接在RealA调用属性或方法前后增加代码是相同的,只是这个工作交由编译器来完成。

PostSharp:PostSharp的Aspect是使用Attribute实现的,我们只需事先通过继承自OnMethodBoundaryAspect,然后重写几个常见的方法即可,如:OnEntry,OnExit等,最后只需要在需要进行AOP拦截的属性或方法上加上AOP拦截特性类即可。由于PostSharp是静态织入的,所以相比其它的通过反射或EMIT反射来说效率是最高的,但PostSharp是收费版本的,而且网上的教程比较多,我就不在此重复说明了,大家可以参见:使用PostSharp在.NET平台上实现AOP

第二种:EMIT反射,即:通过Emit反射动态生成代理类,如下Castle.DynamicProxy的AOP实现方式,代码也还是比较简单的,效率相对第一种要慢一点,但对于普通的反射来说又高一些,代码实现如下:

 

文章中,引用的微软给出的资料:使用 RealProxy 类进行面向方面的编程

一个架构良好的应用程序有不同的层,这样,不同的关注点不会进行不必要的交互。假设要设计松散耦合、可维护的应用程序,但在开发过程中,发现某些要求可能不适合体系结构,如:

  • 应用程序必须具有一个在进行任何查询或更新之前要使用的身份验证系统。
  • 在将数据写入数据库之前,必须对数据进行验证。
  • 应用程序必须具备审计和日志记录功能,以进行合理的操作。
  • 应用程序必须维护调试日志以检查操作是否正常。
  • 必须测量某些操作的性能,以便了解这些操作是否在要求的范围内。

所有这些要求都需要大量的工作以及代码重复。您必须在系统的很多部分添加相同的代码,这样就不符合“切勿重复”(DRY) 的原则,维护也更加困难。如果要求有任何变化,都会引起对程序的大量更改。如果我必须在应用程序中添加这类内容,我会想:“为什么编译器不能为我在多个位置添加这些重复代码?”,或者“我希望我可以‘向这个方法添加日志记录’”。

值得高兴的是,确实可以做到这一点:面向方面的编程 (AOP)。它从跨对象或层的边界的方面分离出常规代码。例如,应用程序日志不绑定到任何应用程序层。它应用于整个程序,应该无所不在。这称为“横切关注点”。

根据维基百科,AOP 是“旨在通过允许分离横切关注点来提高模块化程度的编程模式”。它处理发生在系统多个部分的功能,将这种功能与应用程序核心分开,从而改进关注点的分离,避免代码重复和耦合。

本文将介绍 AOP 基础知识,然后详细说明如何通过 Microsoft .NET Framework 类 RealProxy 使用动态代理来简化这一过程。

 

 

在 .NET Framework 中,最常用的方法是后处理和代码拦截。PostSharp (postsharp.net) 使用前一方法,Castle DynamicProxy (bit.ly/JzE631) 和 Unity (unity.codeplex.com) 等依赖关系注入容器使用后一方法。这些工具通常使用称为 Decorator 或 Proxy 的设计模式来执行代码拦截。

这篇文章很长,介绍了很多示例。

 ======================

文章:【.NET】AOP思想下的日志功能

只是asp.net中的。

=========================

文章:C#进阶系列——AOP?AOP!

使用了微软企业库的拦截组件进行了介绍。

 ====================

文章:.net中使用postsharp来实现aop

地址:https://blog.csdn.net/XuWei_XuWei/article/details/34103647

这里介绍了postsharp不过这个是收费的,不过有精简版免费使用;

 

posted on 2019-08-22 10:02  荆棘人  阅读(548)  评论(0编辑  收藏  举报

导航