资源地址: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不过这个是收费的,不过有精简版免费使用;

asp.netMVC中使用aop进行关注点分离的更多相关文章

  1. asp.netMVC中,视图层和控制器层的传值

    Asp.Net Mvc 控制器与视图的数据传递 摘要:本文将讨论asp.net mvc框架中的数据传递. 数据传递也就是控制器和视图之间的交互,比如在视图中提交的数据,在控制器怎么获取,或者控制器从业 ...

  2. Asp.netMVC中地址后缀使用.html,jsp等404错误解决

    asp.net mvc 默认的地址路径url都是没有后缀的比如 www.a.com/aa/bb 等 如果要是www.a.com/aa/bb.html需要专门写路由. 根据我之前的经验,mvc的路由是相 ...

  3. ASP.NET-MVC中Entity和Model之间的关系

    Entity 与 Model之间的关系图 ViewModel类是MVC中与浏览器交互的,Entity是后台与数据库交互的,这两者可以在MVC中的model类中转换 MVC基础框架 来自为知笔记(Wiz ...

  4. Asp.netMVC中Html.Partial,RenderPartial,Action,RenderAction区别和用法

    https://www.2cto.com/kf/201702/602449.html Partial 和RenderPartial: 这两个的性质都是一样, 只指把一个个View给镶入进来, 只是回传 ...

  5. asp.netMVC中权限控制论

    这里设想了一个简单的思路,如果用户登录了,也就是session中有值才可以在控制器中操作,这样先添加一个控制器,如下代码: public class AuthController : Controll ...

  6. asp.netMVC中实现分页方法

    方法一:使用传统的sql语句实现分页,    public class UserprintDao如下 /// <summary> /// 取得用户申请记录列表(按分页) /// </ ...

  7. asp.netMVC中配置automap

    第一.新建类库,以解决方案名XXX为例,建立子类库名为  XXX.AutoMapper. 第二. XXX.AutoMapper类库中,添加对automap的引用. 第三.创建映射文件类 ModelPr ...

  8. C# Asp.net中的AOP框架 Microsoft.CCI, Mono.Cecil, Typemock Open-AOP API, PostSharp -摘自网络 (可以利用反射 Attribute 进行面向切面编程 可以用在记录整个方法的Log方面)

    Both Microsoft.CCI and Mono.Cecil are low-level, and don't validate produced assemblies. It takes lo ...

  9. Asp.netMVC中Ajax.BeginForm上传文件

    做一个上传并解压的功能,解压完了回调,解压多少文件.搞了半天用Ajax.BeginForm.各种坑,后来直接放弃 @using (Ajax.BeginForm("UploadFile&quo ...

随机推荐

  1. Tools - Tcpdump

    Tcpdump homepage - tcpdump wiki - tcpdump 常用格式 tcpdump -i eth<网卡号> port <端口号> -s0 -w < ...

  2. 超详细的RNN代码实现(tensorflow)

    一.学习单步的RNN:RNNCell 如果要学习TensorFlow中的RNN,第一站应该就是去了解“RNNCell”,它是TensorFlow中实现RNN的基本单元,每个RNNCell都有一个cal ...

  3. 粒子系统与雨的效果 (DirectX11 with Windows SDK)

    前言 最近在学粒子系统,看这之前的<<3D图形编程基础 基于DirectX 11 >>是基于Direct SDK的,而DXSDK微软已经很久没有更新过了并且我学的DX11是用W ...

  4. (二)MVC项目+c3p0连接池

    一.项目架构 注:删除了原有的数据库工具,添加了c3p0数据库工具类,添加了c3p0的配置文件,修改了Dao类以及servlet类 二.修改或添加的类 1.C3p0Helper(暂时不了解事务回滚之类 ...

  5. Spring jsp 验证 form:errors标签

    1 在model层添加验证规则 @NotNull @Size(min=2,max =30,message="姓名在2-30个字符之间") private String userna ...

  6. Haystack--基于Django的全文检索框架

    好文章转载自:https://suguangti.cnblogs.com/p/11167097.html 阅读目录 1.什么是Haystack 2.安装 3.配置 4.处理数据 创建索引 5.设置视图 ...

  7. 6年DotNet码农的盲目经历

    前言   第一篇没有选择记录与技术相关的文档,是考虑到有必要给查阅这篇文档的伙伴们“自我介绍”一下,大佬们看了求带或指导,我很愿意学习,初学者们看了千万不要重复走我之前的“学习之路”:我老家贵州,再过 ...

  8. python 脚本bak文件还原mssql数据库

    # -*- coding=utf-8 -*- import pyodbc from datetime import datetime import pymssql import decimal cla ...

  9. PAT甲级 二叉查找树 相关题_C++题解

    二叉查找树 PAT (Advanced Level) Practice 二叉查找树 相关题 目录 <算法笔记> 重点摘要 1099 Build A Binary Search Tree ( ...

  10. PAT(B) 1014 福尔摩斯的约会(Java)

    题目链接:1014 福尔摩斯的约会 注意 三个字眼:"第1对","第2对","第1对",因此如果你用了循环,别忘了break,因为后面也可能 ...