.NET下集中实现AOP编程的框架
一、Castle
使用这个框架呢,首先是需要安装NuGet包。
先建立一个控制台项目,然后在NuGet中搜索Castle.Windsor,不出意外的话应该能找到如下的包
然后安装,会自动的安装包Castle.Core
创建一个类CastleWindsor,实现接口IInterceptor,这个接口呢就在Castle.Core.dll中了
class CastleWindsor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
PreProceed(invocation);
Console.WriteLine("ffff");
invocation.Proceed();
PostProceed(invocation); }
public void PreProceed(IInvocation invocation) { Console.WriteLine("方法执行前"); }
public void PostProceed(IInvocation invocation) { Console.WriteLine("方法执行后"); } }
类中的Intercept函数来自于接口IInterceptor。而函数IInterceptor和PostProceed并不是必须的,可以没有这两个函数,主要还是看Intercept函数中的invocation.Proceed();这一句。在这一句之前添加的代码肯定先于修饰的函数执行,在这之后的代码,晚于
修饰的函数执行。
然后定义服务端,就是完成业务功能的代码段。
public interface IUserProcessor {
void RegUser(string txt);
void WriteMessage(string msg);
}
public class UserProcessor : IUserProcessor {
public virtual void RegUser(string txt) {
Console.WriteLine("用户已注册。Name:{0}", txt);
} public virtual void WriteMessage(string msg)
{
Console.WriteLine(msg);
}
}
假设的是这个接口和类就是为了完成业务功能的地方。
然后创建客户端来调用服务端:
class CoreBusiness
{
public void Work_5()
{
try {
Castle.DynamicProxy.ProxyGenerator generator = new Castle.DynamicProxy.ProxyGenerator();
CastleWindsor interceptor = new CastleWindsor();
IUserProcessor userprocessor = generator.CreateClassProxy<UserProcessor>(interceptor); userprocessor.WriteMessage("");
userprocessor.RegUser("");
}
catch (Exception ex)
{ throw ex; }
}
}
注意看这个客户端的代码,这里有一个UserProcessor的对象userprocessor,但是却没有通过new关键字来创建,而是通过ProxyGenerator的CreateClassProxy函数来创建,从而将CastleWindsor类和UserProcessor类联系起来了。
在main函数中调用Work_5,执行结果:
从执行结果中可以看出来,每次调用服务端的函数,都会执行Intercept函数。
这个框架来实现AOP的话,如果是项目开发中就应用了这个框架还好,否则在开发完成后才来引入这个框架,那么势必要对原来的代码进行大量的修改。这一点上还不如筛选器和postsharp框架。
当然这个框架也可以在函数执行前获取函数的参数值,在函数执行后,能获取函数的返回值。要注意的是,不能获取到函数的参数名。
通过以下方式来获取参数值和返回值
invocation.Method.Name:函数名
invocation.Arguments:参数值的数组。invocation.Arguments的类型是object[]
invocation.ReturnValue:函数返回值,注意这个必须是在invocation.Proceed()执行之后且函数有返回值的情况下才有值。类型是object
看看Intercept函数的参数类型。注意标红线的地方。ReturnValue不是只读的,那就是说可以在函数执行完成后,去修改函数的返回值。SetArgumentValue表示可以在函数执行前,去修改函数的参数。
.NET下集中实现AOP编程的框架的更多相关文章
- .NET Core中实现AOP编程
AOP全称Aspect Oriented Progarmming(面向切面编程),其实AOP对ASP.NET程序员来说一点都不神秘,你也许早就通过Filter来完成一些通用的功能,例如你使用Autho ...
- (转).NET Core中实现AOP编程
原文地址:https://www.cnblogs.com/xiandnc/p/10088159.html AOP全称Aspect Oriented Progarmming(面向切面编程),其实AOP对 ...
- 聊Javascript中的AOP编程
Duck punch 我们先不谈AOP编程,先从duck punch编程谈起. 如果你去wikipedia中查找duck punch,你查阅到的应该是monkey patch这个词条.根据解释,Mon ...
- 聊聊Javascript中的AOP编程
Duck punch 我们先不谈AOP编程,先从duck punch编程谈起. 如果你去wikipedia中查找duck punch,你查阅到的应该是monkey patch这个词条.根据解释,Mon ...
- JavaEE开发之Spring中的依赖注入与AOP编程
上篇博客我们系统的聊了<JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建>,并在之前的博客中我们聊了依赖注入的相关东西,并且使用Objective-C的R ...
- Aop编程--注解与xml的实现
一.注解方式 1.首先引入spring对于aop编程的jar支持包,spring框架没有的包请自行在网上下载. aopalliance-alpha1.jar aspectjrt.jar aspectj ...
- Spring入门3.AOP编程
Spring入门3.AOP编程 代码下载: 链接: http://pan.baidu.com/s/11mYEO 密码: x7wa 前言: 前面学习的知识是Spring在Java项目中的IoC或DJ,这 ...
- 在.NET Core中三种实现“可插拔”AOP编程方式(附源码)
一看标题肯定会联想到使用动态编织的方式实现AOP编程,不过这不是作者本文讨论的重点. 本文讨论另外三种在netcore中可实现的方式,Filter(过滤器,严格意义上它算是AOP方式),Dynamic ...
- 利用多态,实现一般处理程序(ashx)中的AOP(切面编程)
本文是对工作中的项目进行代码优化(完善登陆验证的AOP切面编程)时,所遇到的各种解决方案思考过程. 项目背景:由ashx+nvelocity构建的简单B/S问卷系统,现需要优化登录验证环节(时隔若干个 ...
随机推荐
- 【深度探索C++对象模型】data语义学
class X{}; class Y :public virtual X{}; class Z :public virtual X{}; class A :public Y, public Z{}; ...
- 【Nginx】Hello world程序
模块如何在运行中生效 配置文件中的location块决定了匹配某种URL的请求将会由相应的HTTP模块处理,因此,运行时HTTP框架会在接收完毕HTTP请求的头部后,将请求的URL与配置文件中的所有l ...
- hdu 4599 Dice
数学能力已经彻底降低到了小学水平,真是惨啊惨... 首先G(M)很容易确定,G(M) = 6 * M; H(N) = 6 * F(N),于是推出来H(N)就可以了,昨天请教了一下别人,直接数学公式搞定 ...
- Hibernate复习之Hibernate基本介绍
众所周知.眼下流行的面向对象的对象关系映射的Java持久层框架有MyBatis和Hibernate.他们都是对象关系映射ORM. 解决的主要问题就是对象-关系的映射.域模型和关系模型都分别建立在概念模 ...
- 有多个git项目要用多个秘钥
在~/.ssh文件夹下新建文件config,格式例如以下 Host "authmanage" HostName "code.csdn.net" User &qu ...
- CentOS 6.x Radius
CentOS 6.x Radius 一. 实现环境: 1.系统:CentOS release 6.6 (Final) 2.需要软件包: 1) freeradius-2.1.12-6.e16.x ...
- CASE函数 sql server——分组查询(方法和思想) ref和out 一般处理程序结合反射技术统一执行客户端请求 遍历查询结果集,update数据 HBuilder设置APP状态栏
CASE函数 作用: 可以将查询结果集的某一列的字段值进行替换 它可以生成一个新列 相当于switch...case和 if..else 使用语法: case 表达式/字段 when 值 then ...
- jquery验证后ajax提交,返回消息怎样统一显示的问题
/* jquery验证后ajax提交.返回消息怎样跟jquery验证体系统一显示的问题,网上查了非常多资料.都没有找到明白的答案,通过数小时的尝试,最终攻克了,现举一个简单的样例,给须要的人參考參考吧 ...
- 浅谈 ZipArchive 类
Microsoft .NET Framework 4.5 新增了 ZipArchive 类 Microsoft Windows 8 Consumer Preview 操作系统已经内置了 Microso ...
- 说说Windows7 64bits下安装TensorFlow GPU版本会遇到的一些坑
不多说,直接上干货! 再写博文,回顾在Windows7上安装TensorFlow-GPU的一路坑 Windows7上安装TensorFlow的GPU版本后记 欢迎大家,加入我的微信公众号:大数据躺过的 ...