.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问卷系统,现需要优化登录验证环节(时隔若干个 ...
随机推荐
- LUA协程复用
-----协程复用根函数 local function routine(fun, args) while (fun) do fun, args = coroutine.yield(fun(table. ...
- Activity调用isDestroyed()方法报出,java.lang.NoSuchMethodError
在測试App的过程中,Activity调用了isDestroyed()方法,报出了java.lang.NoSuchMethodError错误. 自己手机MI 2S,版本号4.1.1. 事实上原因就是i ...
- Selenium系列之--测试框架断言【转】
selenium提供了三种模式的断言:assert .verify.waitfor 1)Assert(断言) 失败时,该测试将终止. 2)Verify(验证) 失败时,该测试将继续执行,并将错误记入日 ...
- jquery获取input值的各种情况
jQuery获取多种input值的方法 获取input的checked值是否为true: 第一种: if($("input[name=item][value='val']").at ...
- devres in linux driver
写 driver 时, probe 中常常要为设备分配一些资源, 如 内存 / irq / gpio / iomap 等. 而在 probe 中失败时又要小心的释放掉这些资源. 底层驱动开发人员可能会 ...
- SQL Server中一些有用的日期sql语句
SQL Server中一些有用的日期sql语句 1.一个月第一天的 SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) 2.本周的星期一 SELECT DA ...
- servlet,RMI,webservice之间的区别
最近项目中有提供或者调用别的接口,在纠结中到底是用servlet还是用webservice,所以上网查看了下他们以及RMI之间的区别,方便加深了解. 首先比较下servlet和webservice下 ...
- ABAP JSON
1 DATA: lv_em TYPE string, lv_em1 TYPE string. DATA: lt_but021 TYPE TABLE OF but021, lt_but0211 TYPE ...
- SoapUI中Code多行显示设置
你们的SoapUI 有设置下面的选项吗? Before adding your project, we recommend that you enable the following ReadyAPI ...
- [Usaco2017 Feb]Why Did the Cow Cross the RoadII
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4993 [算法] 动态规划 转移类似于求LCS [代码] #include<bi ...