标签:属性 一个 lob sharp 必须 全局 模式 com color
资源地址: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中的。
=========================
使用了微软企业库的拦截组件进行了介绍。
====================
文章:.net中使用postsharp来实现aop
地址:https://blog.csdn.net/XuWei_XuWei/article/details/34103647
这里介绍了postsharp不过这个是收费的,不过有精简版免费使用;
标签:属性 一个 lob sharp 必须 全局 模式 com color
原文地址:https://www.cnblogs.com/Tpf386/p/11392730.html