面相切面编程AOP以及在Unity中的实现
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了面相切面编程AOP以及在Unity中的实现,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3820字,纯文字阅读大概需要6分钟。
内容图文
一、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; } publicstring Name { get; set; } } publicinterface IRegUser { void RegUser(User user); } publicclass RegService : IRegUser { publicvoid RegUser(Models.User user) { Console.WriteLine("注册用户成功……"); }
} ///<summary>/// 装饰器 ///</summary>publicclass RegServiceDecorator : IRegUser { IRegUser regUserService; public RegServiceDecorator(IRegUser RegService) { regUserService = RegService; } publicvoid RegUser(Models.User user) { Validate(user); regUserService.RegUser(user); Log(user); } ///<summary>/// 业务执行前的验证 ///</summary>///<param name="user"></param>privatevoid Validate(Models.User user) { Console.WriteLine("验证模型"); } ///<summary>/// 业务执行后的日志 ///</summary>///<param name="user"></param>privatevoid Log(Models.User user) { Console.WriteLine("写日志"); } } class Program { publicstaticvoid Main(string[] args) { IRegUser regService = new Contract.RegService(); regService = new RegServiceDecorator(regService); regService.RegUser(new User() { Id = 1, Name = "lvcc" }); } }
四、AOP在Unity中的实现
第一步,添加Unity及相关组件的引用
public class User { public int Id { get; set; } publicstring Name { get; set; } } publicinterface IRegUser { [UserCheck] void RegUser(User user); } publicclass RegService : IRegUser { publicvoid RegUser(Models.User user) { Console.WriteLine("注册用户成功……"); } } ///<summary>/// 用于标记的属性 ///</summary>publicclass UserCheckAttribute : HandlerAttribute { publicoverride ICallHandler CreateHandler(IUnityContainer container) { returnnew UserCheckHandler() { }; } } ///<summary>/// 将实际业务方法前后包一层的函数 ///</summary>publicclass UserCheckHandler : ICallHandler { publicint Order { get; set; } public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) { #region 包在业务方法之前 User userModel = input.Inputs[0] 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(""); #endregionreturn method; } } class Program { publicstaticvoid 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 = 1, Name = "lvcc" }); Console.ReadLine(); } }
原文:https://www.cnblogs.com/chenxizhaolu/p/9497550.html
内容总结
以上是互联网集市为您收集整理的面相切面编程AOP以及在Unity中的实现全部内容,希望文章能够帮你解决面相切面编程AOP以及在Unity中的实现所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。