走进AOP In .NET
2024-10-18 17:11:21
AOP是什么,有的译为面向方面编程,有的译为面向切面编程,我更加赞同后者。接下来,让我们一步步揭开AOP的面纱。
AOP衍生自 编程中出现了一些用OOP技术无法捕捉和解决的问题。跟其他开发工具和思想一样,AOP有他自己的一套东西包括语法什么的以此来描述它的特性。AOP存在的意义在于OOP的切面上,所谓切面也就是在整个系统的很多部分中都存在,我们将这部分独立出来放到一个类里然后在任何需要使用的地方apply刚才那个Aspect,我觉得现在的很多框架或者思想都是在追求一个解耦,当然完全解耦的程序是没有用处,我们往往需要在里面找到一个平衡点,比较典型的就是MVC。我们来看一个例子:
考虑这样一个场景,整个系统分为很多部分每个部分都有日志记录功能,这个功能在开发测试完后却被告知要修改,没有AOP我们只能去找出所有包含这段代码的地方然后去修改它(也许有的童鞋会说使用属性或者其他的方法,这里主要是介绍AOP不是说这个是唯一的方法),现在有了AOP我们把这部分独立出来,一旦要修改只需要修改写好的切面方法就可以,省去了很多麻烦。如下:
[LoggingAspect]
public void Accrue(RentalAgreetment rentalAgreetment)
{
if (rentalAgreetment == null)
throw new ArgumentNullException("rentalAgreetment"); try
{
using (var scope = new TransactionScope())
{
var retries = ;
var succeeded = false;
while (!succeeded)
{
try
{
var rentalTimeSpan = rentalAgreetment.EndTime.Subtract(rentalAgreetment.StartTime);
var numberOfDays = (Int32) Math.Floor(rentalTimeSpan.TotalDays);
var pointsPerDay = ;
if (rentalAgreetment.Vehicle.Size > Size.Luxury)
pointsPerDay = ;
var point = numberOfDays*pointsPerDay;
_loyaltyDataServices.AddPoints(rentalAgreetment.Customer.Id, point);
//Console.WriteLine("Accrue complete :{0}", DateTime.Now);
scope.Complete();
succeeded = true;
}
catch
{
if (retries > )
retries--;
else
{
throw;
}
}
}
}
}
catch
{
throw;
}
}
我们修改则只需要修改上面的LoggingAspect这个类就好了,这个类似于C#里面的属性,应该说看到这篇文章的都应该比较熟悉的。
AOP既然够功能这么强大,它是怎么工作或者是怎么来实现这个的呢,这里有一个概念 织入(WEAVING)同时分为静态织入与动态织入这个以后再仔细分析这两个的区别以及用处。
(未完待续)
最新文章
- 02-编写第一个C语言程序
- weave
- bootstrap初接触
- openVPN报错:All TAP-Windows adapters on this system are currently in use
- Android开发:彻底更改工程名
- 一款基于jQuery仿淘宝红色分类导航
- Java 内部类和匿名内部类
- TFS应用经验-大型项目数据仓库抽取导致的TFS应用无法访问
- C语言实验单片机串口发送int型数据
- 巨高兴,偶的文章 “如何在服务器上配置ODBC来访问本机DB2for Windows服务器”被推荐至CSDN博客首页
- __builtin_expect — 分支预测优化
- C# .NET 实体类转Dictionary
- mysql 开发进阶篇系列 10 锁问题 (相同索引键值或同一行或间隙锁的冲突)
- MySQL系列详解六:MySQL主从复制/半同步演示-技术流ken
- 在PL/SQL中调用存储过程--oracle
- 8年前,令我窒息的Java socket体验学习
- 【树状数组逆序对】USACO.2011JAN-Above the median
- 【转】浅谈https\ssl\数字证书
- iOS swift 常量 &;&; 宏定义
- 从零开始的全栈工程师——js篇2.2
热门文章
- Linux6系统安装
- chaep
- shell编程——内部变量
- linux服务器中Apache隐藏index.php失败
- vs2012 未找到与约束 ContractName Microsoft.VisualStudio.Utilities.IContentTy...
- ubuntu系统中出现mysql数据库无法启动报错2002该怎么处理,具体报错信息如正文所示
- 104. Maximum Depth of Binary Tree (Tree; DFS)
- PHP获取当前文件路径
- Android代码速查,写给新手的朋友们[转]
- qy Undefied index报错