Spring.NET教程(十二)面向切面编程(基础篇)

AOP即面向切面编程(ASPect Oriented Programming的缩写),是OOP(面向对象编程)的一种延续形式。是通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术,它从一个不同于OOP的角度来看待程序的结构:OOP将应用程序分解为一系列表现为继承关系的对象;AOP 则把程序分解为一系列方面(aspects)或者关注点(concerns)。AOP将诸如事务管理等本来横向分布在多个对象中的关注点进行了模块化处理(这些关注点也常称为横切(crosscutting)关注点)。在Spring.net中提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的完成业务逻辑仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。

下面我举个例子来说明这一切:

场景:业务类CompanyManager在调用Save方法的时候需要调用SecurityManager类判断权限是否足够(图1)。

 

 图1

准备条件:

public class CompanyDao

{

public void Save()

{

Console.WriteLine("保存数据");

}

}

 

public interface ICompanyManager

{

string UserName { get; set; }

void Save();

}

 

public interface ISecurityManager

{

bool IsPass(string userName);

}

SecurityManager

public class SecurityManager : ISecurityManager

{

/** <summary>

/// 判断权限

/// </summary>

/// <param name="userName"></param>

/// <returns></returns>

public bool IsPass(string userName)

{

return userName == "admin";

}

}

第一种实现方式,我们通常会这样做:直接在CompanyManager类中调用ISecurityManager接口的IsPass方法判断权限。

SimpleCompanyManager

public class SimpleCompanyManager : ICompanyManager

{

可通过外部注入的属性#region 可通过外部注入的属性

public string UserName { get; set; }

public CompanyDao Dao { get; set; }

#endregion

public void Save()

{

//判断权限

ISecurityManager security = new SecurityManager();

if (security.IsPass(UserName))

{

//执行业务方法

//.

//调用DAO层方法

Dao.Save();

}

else

{

//执行其它业务方法

Console.WriteLine("您没有该权限");

}

}

}

这样CompanyManager类与ISecurityManager或SecurityManager会发生业务性耦合。聪明的朋友会发现在GOF(设计模式)中有一种模式(代理模式)可以解除这种耦合。

第二种实现方式,代理模式(Proxy Pattern):什么是代理模式?是给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某些情况下,客户不想或者不能够直接引用一个对象,代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨不出代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象,而仅仅持有一个被代理对象的接口,这时候代理对象不能够创建被代理对象,被代理对象必须有系统的其他角色代为创建并传入(图2)。

 

 图2

CompanyManager

public class CompanyManager : ICompanyManager

{

可通过外部注入的属性#region 可通过外部注入的属性

public string UserName { get; set; }

public CompanyDao Dao { get; set; }

#endregion

public void Save()

{

//执行业务方法

//.

//调用DAO层方法

Dao.Save();

}

}

 CompanyProxyManager

public class CompanyProxyManager : ICompanyManager

{

public string UserName { get; set; }

private ICompanyManager target = new CompanyManager();

public void Save()

{

//判断权限

ISecurityManager security = new SecurityManager();

if (security.IsPass(UserName))

{

//调用目标对象Save方法

target.Save();

}

else

{

Console.WriteLine("您没有该权限");

}

}

}

这样,CompanyManager类就不必与判断权限的类SecurityManager耦合,但是这种方式实现起来比较麻烦。

第三种实现方式,Spring.net提供的AOP:AopAlliance.Intercept.IMethodInterceptor接口和ProxyFactory类的组合。

AroundAdvice

public class AroundAdvice : IMethodInterceptor

{

//权限系统类(可外部注入)

private ISecurityManager manager = new Service.SecurityManager();

public object Invoke(IMethodInvocation invocation)

{

//拦截Save方法

if (invocation.Method.Name == "Save")

{

ICompanyManager target = (ICompanyManager)invocation.Target;

return manager.IsPass(target.UserName) ? invocation.Proceed() : null;

}

else

{

return invocation.Proceed();

}

}

}

Program

class Program

{

static void Main(string[] args)

{

ICompanyManager target = new CompanyManager() { Dao = new CompanyDao(), UserName = "admin" };

ProxyFactory factory = new ProxyFactory(target);

factory.AddAdvice(new AroundAdvice());

ICompanyManager manager = (ICompanyManager)factory.GetProxy();

manager.Save();

Console.ReadLine();

}

}

输出:保存数据

Spring.NET利用System.Reflection.Emit命名空间下的类在运行时动态创建IL代码来生成AOP代理。这使得代理(的创建)非常高效,并且不受任何继承层次的限制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
课程通过实际项目融入常用开发技术架构,讲授风格独特,提供详细上课日志及答疑,赠送配套的项目架构源码注释详细清晰且表达通俗,均能直接在实际项目中应用,正真的物超所值,价格实惠任务作业:综合运用《C#/.Net企业级系统架构设计实战精讲教程》课程所学知识技能设计一个学生成绩管理系统的架构。要求:1.系统基于MVC的三层架构,各层单独建不同的解决方案文件夹。2.采用Model First开发方式,设计架构时只需要设计学生表(TbStudent)和课程表(TbCourse)。学生表必须有的字段是ID、stuName、age;课程表必须有的字段是ID、courseName、content。3.数据访问层采用Entity Framework或NHibernate来实现,必须封装对上述表的增删改查方法。4.必须依赖接口编程,也就是必须要有数据访问层的接口层、业务逻辑层的接口层等接口层。层层之间必须减少依赖,可以通过简单工厂或抽象工厂。5.至少采用简单工厂、抽象工厂、Spring.Net等技术中的2种来减少层与层之间的依赖等。6.封装出DbSession类,让它拥有所有Dal层实例和SaveChanges方法。7.设计出数据访问层及业务逻辑层主要类的T4模板,以便实体增加时自动生成相应的类。8.表现层要设计相关的控制器和视图来验证设计的系统架构代码的正确性,必须含有验证增删改查的方法。9.开发平台一定要是Visual Studio平台,采用C#开发语言,数据库为SQL Server。10.提交整个系统架构的源文件及生成的数据库文件。(注意: 作业需写在CSDN博客中,请把作业链接贴在评论区,老师会定期逐个批改~~)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lzhdim

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值