我们已经实现了用户注册功能,现在想增加日志记录功能。具体来讲就是在用户注册前后,分别输出一条日志。我们当然可以修改原有的业务代码。

现在换个角度来问两个问题:
1. 团队开发中,我们很可能根本拿不到源代码,那又怎么去增加这个功能呢?
2. 这次需求是增加日志,以后再增加其他需求(比如异常处理),是不是仍然要改业务类呢?

总结一下:
我们要在不修改原有类业务代码的前提下,去做类的增强。我们的设计要符合面向对象的原则:对扩展开放,对修改封闭

都有哪些办法呢?我们尝试以下几种方法:

  • 使用装饰器模式做类的增强
  • 使用.Net代理模式做类的增强
  • 使用Castle做类的增强
  • 使用Unity做类的增强
  • 使用Unity做类的增强(续)
  • 使用Autofac做类的增强

原有业务类

业务模型

namespace testAopByDecorator
{public class User{public string Name { get; set; }public int Id { get; set; }}
}

接口设计

namespace testAopByDecorator
{public interface IUserProcessor{void RegisterUser(User user);}
}

业务实现

using System;namespace testAopByDecorator
{public class UserProcessor : IUserProcessor{public void RegisterUser(User user){if (user == null){return;}Console.WriteLine(string.Format("注册了一个用户{0}:{1}", user.Id, user.Name));}}
}

上层调用

using System;namespace testAopByDecorator
{class Program{private static User user = new User { Id = 1, Name = "滇红" };static void Main(string[] args){Register();Console.ReadKey();}private static void Register(){IUserProcessor processor = new UserProcessor();processor.RegisterUser(user);}}
}

使用Castle做类的增强

我们将使用第三方的Castle.Core来对原有的类做业务增强,首先使用NuGet安装。

业务增强实现

using System;
using Castle.DynamicProxy;namespace testAopByCastle
{public class UserProcessorCastle : IInterceptor{public void Intercept(IInvocation invocation){User user = invocation.Arguments[0] as User;before(user);invocation.Proceed();after(user);}private void after(User user){Console.WriteLine("注册用户后:" + user.Name);}private void before(User user){Console.WriteLine("注册用户前:" + user.Name);}}
}

需要原有业务类的方法声明为虚方法:virtual

using System;namespace testAopByCastle
{public class UserProcessor : IUserProcessor{public virtual void RegisterUser(User user){if (user == null){return;}Console.WriteLine(string.Format("注册了一个用户{0}:{1}", user.Id, user.Name));}}
}

上层调用

using Castle.DynamicProxy;
using System;namespace testAopByCastle
{class Program{private static User user = new User { Id = 1, Name = "滇红" };static void Main(string[] args){RegisterAndLog();Console.ReadKey();}private static void RegisterAndLog(){ProxyGenerator generator = new ProxyGenerator();UserProcessorCastle castle = new UserProcessorCastle();IUserProcessor proxy = generator.CreateClassProxy<UserProcessor>(castle);proxy.RegisterUser(user);}}
}

对比一下扩展前后的业务展现

这种方式修改了原有业务类的方法,需要显示定义为virtual,不是很符合对修改关闭原则。不过我们要根据实际项目情况灵活把握。

使用Castle做类的增强相关推荐

  1. 如何简单粗暴的提升NER效果?一文告诉你如何用词库来做NER数据增强

    每天给你送来NLP技术干货! 来自:船长尼莫 点击这里进群->加入NLP交流群 在NLP的基础任务中,NER无疑很难做,但是做好了,会提升下游的很多效果.那么如何提升NER的效果呢?数据增强无疑 ...

  2. 使用CGLIB enhancer实现类的增强

    今天在读spring源码的时候,比较深入如的研究了一下@Configuration注解.发现@Configurtion注解的类,实际实现了CGLIB动态代理,这个后续会写一篇博客专门说明.这里简单的记 ...

  3. 抖音小程序可做类目--资讯

    抖音资讯类小程序如:电影资讯,娱乐资讯,历史,地理,汽车,魔术,日常小知识,以及知识类等等资讯和内容. 前一段时间上线了二个抖音资讯类小程序一个叫续看.一波三折,上线稍微显得有点困难,但是总算成功上线 ...

  4. ES 7.X 做类百度搜索,进行搜索自动补全和热搜词及拼音功能实现

    文章目录 前言 一.如何使用ES做类似百度的检索? 二.全文检索自动补齐 1.创建索引 2.添加数据 3.高级检索 三 热搜词 1.思路 2.DSL语句 3.java代码实现 四 拼音补全 1.DSL ...

  5. 基于OpenCV做图像数据增强(平移、镜像、缩放、旋转、仿射)

    前言: 基于OpenCV的基本使用,对图像的数据量进行数据增强,使得框架对神经网络进行训练,提高模型的鲁棒性以及准确性. 原图: 1.平移 平移通过自定义平移矩阵以及函数warpAffine实现: 代 ...

  6. tableau做类excel的业绩对比表

    如何在tableau做类似excel中的这种表呢?? 下面就开始用tableau来制作这种表格啦. 数据准备 选取tableau中的"超市示例数据",目的就设定为查看各个城市下的利 ...

  7. 利用反射做类参数的校验

    需求描述 业务需求描述:对webservice接口参数校验 代码实现 /*** 字符串长度校验* * @param str* @param len* @return 合法(true),不合法(fals ...

  8. java agent简介热部署SDK接入

    思考: 我们在平时使用arthas的类方法监控,类增强,到底是怎么在应用启动后还能对类进行修改的呢,他到底是基于什么场景下孕育出来的呢,今天我们就来聊一聊java-agent,当了解完了agent机制 ...

  9. android sqlite 操作类封装,[Android] Sqlite 数据库操做 工具封装类

    sqlite 数据库封装类html DatabaseUtil.java(封装的类)java packagecom.jack.androidbase.tools;importandroid.conten ...

最新文章

  1. 解决更新到os x10.11后openssl头文件无法找到的问题
  2. Latex字体加粗命令备忘
  3. polymer 绑定html元素,使用在Polymer元素内的light dom中定义的模板
  4. 算法录 之 复杂度分析。
  5. idea出现 Error:(1, 16) java: 非法字符: '\u0a0d'
  6. 浅析tornado协程运行原理
  7. 深入分析自定义表单验证与Cookies
  8. 集成极光推送和厂商通道相关总结
  9. CVPR2019 accepted papers查看 以及其他几个顶级会议的accepted papers查看
  10. 大学生静态HTML网页源码——佛山旅游景点介绍网页代码 家乡旅游网页制作模板 web前端期末大作业
  11. java使用POI识别excel的复选框插件
  12. 【金猿案例展】某大型股份制银行——指标的统一管理和分析平台
  13. SRB x-sign
  14. Vue实现简单的音乐播放器
  15. 后端学习 Java Web 上半部分(MySQL~RequestResponse)
  16. c++中关于二分查找的函数
  17. (自学java的第三天)JPI文档、变量、数据类型
  18. python数据可视化案例2017年6省gdp_吴裕雄 数据挖掘与分析案例实战(5)——python数据可视化...
  19. 详细讲解:RocketMQ的限时订单实战与RocketMQ的源码分析!
  20. 5-26 高位震荡中,明后天有调整需求

热门文章

  1. Linux脚本Shell命令
  2. axios取消请求_解决网站恶意频繁点击问题---axios工作笔记011
  3. Hive大数据-认识Hive知识结构_以及概念介绍---大数据之Hive工作笔记0001
  4. MQTT工作笔记0007---剩余长度
  5. 行业术语001--关键绩效指标KPI_NLP_ACL
  6. 人脸识别版本目前的问题
  7. visual studio 使用快捷方法2
  8. mac os cmake安装
  9. opencv 修改图像数值_【1】Introduction to OpenCV (2)使用VS生成OpenCV应用程序
  10. 随想录(再谈核心技术)