面相切面编程AOP以及在Unity中的实现
一、AOP概念
AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。它是一种新的方法论,它是对传统OOP编程的一种补充。OOP是关注将需求功能划分为不同的并且相对独立,封装良好的类,并让它们有着属于自己的行为,依靠继承和多态等来定义彼此的关系;AOP是希望能够将通用需求功能从不相关的类当中分离出来,能够使得很多类共享一个行为,一旦发生变化,不必修改很多类,而只需要修改这个行为即可。AOP是使用切面(aspect)将横切关注点模块化,OOP是使用类将状态和行为模块化。在OOP的世界中,程序都是通过类和接口组织的,使用它们实现程序的核心业务逻辑是十分合适。但是对于实现横切关注点(跨越应用程序多个模块的功能需求)则十分吃力,比如日志记录,权限验证,异常拦截等。
设计的目的往往是对修改封闭,对扩展开放。也就是现有的功能不去修改,这样减少错误发生。AOP就是将公用功能提取出来,如果以后公用功能的需求发生变化,只需要改动公用的模块的代码即可,多个调用的地方则不需要改动。所谓面向切面,就是只关注通用功能,而不关注业务逻辑。实现方式一般是通过拦截。比如,我们随便一个Web项目基本都有的权限验证功能,进入每个页面前都会校验当前登录用户是否有权限查看该界面,我们不可能说在每个页面的初始化方法里面都去写这段验证的代码,这个时候我们的AOP就派上用场了,AOP的机制是预先定义一组特性,使它具有拦截方法的功能,可以让你在执行方法之前和之后做你想做的业务,而我们使用的时候只需要的对应的方法或者类定义上面加上某一个特性就好了。
二、使用AOP的优势
1、将通用功能从业务逻辑中抽离出来,可以省略大量重复代码,有利于代码的操作和维护。
2、在软件设计时,抽出通用功能(切面),有利于软件设计的模块化,降低软件架构的复杂度。也就是说通用的功能都是一个单独的模块,在项目的主业务里面是看不到这些通用功能的设计代码的。
上文引用自:https://www.cnblogs.com/lihuali/p/6288859.html
三、通过装饰器模式实现静态拦截
public class User
{
public int Id { get; set; }
public string Name { get; set; }
}
public interface IRegUser
{
void RegUser(User user);
}
public class RegService : IRegUser
{
public void RegUser(Models.User user)
{
Console.WriteLine("注册用户成功……");
}
}
/// <summary>
/// 装饰器
/// </summary>
public class RegServiceDecorator : IRegUser
{
IRegUser regUserService;
public RegServiceDecorator(IRegUser RegService)
{
regUserService = RegService;
} public void RegUser(Models.User user)
{
Validate(user); regUserService.RegUser(user); Log(user);
}
/// <summary>
/// 业务执行前的验证
/// </summary>
/// <param name="user"></param>
private void Validate(Models.User user) {
Console.WriteLine("验证模型");
}
/// <summary>
/// 业务执行后的日志
/// </summary>
/// <param name="user"></param>
private void Log(Models.User user) {
Console.WriteLine("写日志");
}
} class Program
{
public static void Main(string[] args)
{
IRegUser regService = new Contract.RegService();
regService = new RegServiceDecorator(regService);
regService.RegUser(new User() { Id = , Name = "lvcc" });
}
}
四、AOP在Unity中的实现
第一步,添加Unity及相关组件的引用

public class User
{
public int Id { get; set; }
public string Name { get; set; }
} public interface IRegUser
{
[UserCheck]
void RegUser(User user);
} public class RegService : IRegUser
{
public void RegUser(Models.User user)
{
Console.WriteLine("注册用户成功……");
}
}
/// <summary>
/// 用于标记的属性
/// </summary>
public class UserCheckAttribute : HandlerAttribute
{
public override ICallHandler CreateHandler(IUnityContainer container)
{
return new UserCheckHandler() { };
}
}
/// <summary>
/// 将实际业务方法前后包一层的函数
/// </summary>
public class UserCheckHandler : ICallHandler
{
public int Order { get; set; } public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
{
#region 包在业务方法之前
User userModel = input.Inputs[] as User;
if (string.IsNullOrEmpty(userModel.Name))
{
//return input.CreateExceptionMethodReturn(new Exception("姓名不能为空"));
Console.WriteLine("姓名不能为空");
}
Console.WriteLine("model验证通过");
#endregion #region 调用接口自己的业务方法
IMethodReturn method = getNext()(input, getNext); #endregion #region 包在业务方法之后
Console.WriteLine("");
#endregion
return method;
}
}
class Program
{
public static void Main(string[] args)
{
IUnityContainer container = new UnityContainer();//生成Unity容器 container.AddNewExtension<Interception>();//添加拦截器
container.RegisterType<IRegUser, RegService>().Configure<Interception>()
.SetInterceptorFor<IRegUser>(new InterfaceInterceptor());//注册接口实现类、配置拦截器的类型、为具体接口设置拦截器
;
//调用
IRegUser regUserService = container.Resolve<IRegUser>(); regUserService.RegUser(new User() { Id = , Name = "lvcc" }); Console.ReadLine();
}
}
面相切面编程AOP以及在Unity中的实现的更多相关文章
- spring框架(2)— 面相切面编程AOP
spring框架(2)— 面相切面编程AOP AOP(Aspect Oriented Programming),即面向切面编程. 可以说是OOP(Object Oriented Programming ...
- AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题
AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子. 一 AOP的基本概念 (1)Asp ...
- 04 Spring:01.Spring框架简介&&02.程序间耦合&&03.Spring的 IOC 和 DI&&08.面向切面编程 AOP&&10.Spring中事务控制
spring共四天 第一天:spring框架的概述以及spring中基于XML的IOC配置 第二天:spring中基于注解的IOC和ioc的案例 第三天:spring中的aop和基于XML以及注解的A ...
- [译]如何在ASP.NET Core中实现面向切面编程(AOP)
原文地址:ASPECT ORIENTED PROGRAMMING USING PROXIES IN ASP.NET CORE 原文作者:ZANID HAYTAM 译文地址:如何在ASP.NET Cor ...
- Spring学习手札(二)面向切面编程AOP
AOP理解 Aspect Oriented Program面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 但是,这种说法有些片面,因为在软件工程中,AOP的价值体现的并 ...
- Spring学习笔记:面向切面编程AOP(Aspect Oriented Programming)
一.面向切面编程AOP 目标:让我们可以“专心做事”,避免繁杂重复的功能编码 原理:将复杂的需求分解出不同方面,将公共功能集中解决 *****所谓面向切面编程,是一种通过预编译方式和运行期动态代理实现 ...
- Spring框架学习笔记(2)——面向切面编程AOP
介绍 概念 面向切面编程AOP与面向对象编程OOP有所不同,AOP不是对OOP的替换,而是对OOP的一种补充,AOP增强了OOP. 假设我们有几个业务代码,都调用了某个方法,按照OOP的思想,我们就会 ...
- Spring之控制反转——IoC、面向切面编程——AOP
控制反转——IoC 提出IoC的目的 为了解决对象之间的耦合度过高的问题,提出了IoC理论,用来实现对象之间的解耦. 什么是IoC IoC是Inversion of Control的缩写,译为控制 ...
- Spring框架系列(4) - 深入浅出Spring核心之面向切面编程(AOP)
在Spring基础 - Spring简单例子引入Spring的核心中向你展示了AOP的基础含义,同时以此发散了一些AOP相关知识点; 本节将在此基础上进一步解读AOP的含义以及AOP的使用方式.@pd ...
随机推荐
- HTML的简单学习
<html>与</html>之间的部分用来描述网页. <body>与</body>之间是页面的可见的内容. <h1>与</h1> ...
- 如何更有效的消灭watchdogs挖矿病毒?华为云DCS Redis为您支招
漏洞概述 近日,互联网出现watchdogs挖矿病毒,攻击者可以利用Redis未授权访问漏洞入侵服务器,通过内外网扫描感染更多机器.被感染的主机出现 crontab 任务异常.系统文件被删除.CPU ...
- PHP引用是什么?
引用是什么 在 PHP 中引用意味着用不同的名字访问同一个变量内容.这并不像 C 的指针,替代的是,引用是符号表别名.注意在 PHP 中,变量名和变量内容是不一样的,因此同样的内容可以有不同的名字.最 ...
- 【iOS系列】-iOS开发常用库文件总结
这里是列举出得一部分,更多内容可参考https://github.com/darren90/Gather_iOS 码农周刊的总结 - 覆盖很广 调调的 - 很多开发相关内容都有体现 右滑返回的解决 - ...
- oracle多表关联多字段update
多表关联多字段update 有代码有J8: update spatial_references set( auth_name, auth_srid, falsex, falsey, xyunits, ...
- iOS开发——高级篇——多线程dispatch_apply
我们知道遍历数组是一个相对耗时的操作,而同时手机的核是越来越多,所以我们需要充分利用iOS多核的作用. 特别是在遍历操作中还有其他耗时操作.像我们平时直接遍历数组的操作 ,i< ,i++){ / ...
- ssh 无密码互通
节点n1 n2 n3 互通 第一步:n1->n2互通 admin@n1 > ssh-keygen -d
- ConfigParser模块用法
ConfigParser 是Python自带的模块, 用来读写配置文件, 用法及其简单. 直接上代码,不解释,不多说. 配置文件的格式是: []包含的叫section, section 下有op ...
- bzoj1933
背包dp 一道很早以前就见过的dp dp[i][j][k]表示选到第i本书,第一层宽度为j,第二层宽度为k的最小高度,我们先把书按高度排序,然后转移就很方便了,因为高度降序,所以后选的书不影响之前选的 ...
- hdu6035
树形dp 并没有想出来... 这个点分治很明显做不了,没办法批量处理信息,那么我们就只能考虑树形dp了,然后觉得用虚树什么的每个颜色单独考虑,GG 事实上我们可以这样考虑,我们对树进行dfs,每个节点 ...