使用Castle做类的增强
我们已经实现了用户注册功能,现在想增加日志记录功能。具体来讲就是在用户注册前后,分别输出一条日志。我们当然可以修改原有的业务代码。
现在换个角度来问两个问题:
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做类的增强相关推荐
- 如何简单粗暴的提升NER效果?一文告诉你如何用词库来做NER数据增强
每天给你送来NLP技术干货! 来自:船长尼莫 点击这里进群->加入NLP交流群 在NLP的基础任务中,NER无疑很难做,但是做好了,会提升下游的很多效果.那么如何提升NER的效果呢?数据增强无疑 ...
- 使用CGLIB enhancer实现类的增强
今天在读spring源码的时候,比较深入如的研究了一下@Configuration注解.发现@Configurtion注解的类,实际实现了CGLIB动态代理,这个后续会写一篇博客专门说明.这里简单的记 ...
- 抖音小程序可做类目--资讯
抖音资讯类小程序如:电影资讯,娱乐资讯,历史,地理,汽车,魔术,日常小知识,以及知识类等等资讯和内容. 前一段时间上线了二个抖音资讯类小程序一个叫续看.一波三折,上线稍微显得有点困难,但是总算成功上线 ...
- ES 7.X 做类百度搜索,进行搜索自动补全和热搜词及拼音功能实现
文章目录 前言 一.如何使用ES做类似百度的检索? 二.全文检索自动补齐 1.创建索引 2.添加数据 3.高级检索 三 热搜词 1.思路 2.DSL语句 3.java代码实现 四 拼音补全 1.DSL ...
- 基于OpenCV做图像数据增强(平移、镜像、缩放、旋转、仿射)
前言: 基于OpenCV的基本使用,对图像的数据量进行数据增强,使得框架对神经网络进行训练,提高模型的鲁棒性以及准确性. 原图: 1.平移 平移通过自定义平移矩阵以及函数warpAffine实现: 代 ...
- tableau做类excel的业绩对比表
如何在tableau做类似excel中的这种表呢?? 下面就开始用tableau来制作这种表格啦. 数据准备 选取tableau中的"超市示例数据",目的就设定为查看各个城市下的利 ...
- 利用反射做类参数的校验
需求描述 业务需求描述:对webservice接口参数校验 代码实现 /*** 字符串长度校验* * @param str* @param len* @return 合法(true),不合法(fals ...
- java agent简介热部署SDK接入
思考: 我们在平时使用arthas的类方法监控,类增强,到底是怎么在应用启动后还能对类进行修改的呢,他到底是基于什么场景下孕育出来的呢,今天我们就来聊一聊java-agent,当了解完了agent机制 ...
- android sqlite 操作类封装,[Android] Sqlite 数据库操做 工具封装类
sqlite 数据库封装类html DatabaseUtil.java(封装的类)java packagecom.jack.androidbase.tools;importandroid.conten ...
最新文章
- 解决更新到os x10.11后openssl头文件无法找到的问题
- Latex字体加粗命令备忘
- polymer 绑定html元素,使用在Polymer元素内的light dom中定义的模板
- 算法录 之 复杂度分析。
- idea出现 Error:(1, 16) java: 非法字符: '\u0a0d'
- 浅析tornado协程运行原理
- 深入分析自定义表单验证与Cookies
- 集成极光推送和厂商通道相关总结
- CVPR2019 accepted papers查看 以及其他几个顶级会议的accepted papers查看
- 大学生静态HTML网页源码——佛山旅游景点介绍网页代码 家乡旅游网页制作模板 web前端期末大作业
- java使用POI识别excel的复选框插件
- 【金猿案例展】某大型股份制银行——指标的统一管理和分析平台
- SRB x-sign
- Vue实现简单的音乐播放器
- 后端学习 Java Web 上半部分(MySQL~RequestResponse)
- c++中关于二分查找的函数
- (自学java的第三天)JPI文档、变量、数据类型
- python数据可视化案例2017年6省gdp_吴裕雄 数据挖掘与分析案例实战(5)——python数据可视化...
- 详细讲解:RocketMQ的限时订单实战与RocketMQ的源码分析!
- 5-26 高位震荡中,明后天有调整需求
热门文章
- Linux脚本Shell命令
- axios取消请求_解决网站恶意频繁点击问题---axios工作笔记011
- Hive大数据-认识Hive知识结构_以及概念介绍---大数据之Hive工作笔记0001
- MQTT工作笔记0007---剩余长度
- 行业术语001--关键绩效指标KPI_NLP_ACL
- 人脸识别版本目前的问题
- visual studio 使用快捷方法2
- mac os cmake安装
- opencv 修改图像数值_【1】Introduction to OpenCV (2)使用VS生成OpenCV应用程序
- 随想录(再谈核心技术)