一、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编程的框架的更多相关文章

  1. .NET Core中实现AOP编程

    AOP全称Aspect Oriented Progarmming(面向切面编程),其实AOP对ASP.NET程序员来说一点都不神秘,你也许早就通过Filter来完成一些通用的功能,例如你使用Autho ...

  2. (转).NET Core中实现AOP编程

    原文地址:https://www.cnblogs.com/xiandnc/p/10088159.html AOP全称Aspect Oriented Progarmming(面向切面编程),其实AOP对 ...

  3. 聊Javascript中的AOP编程

    Duck punch 我们先不谈AOP编程,先从duck punch编程谈起. 如果你去wikipedia中查找duck punch,你查阅到的应该是monkey patch这个词条.根据解释,Mon ...

  4. 聊聊Javascript中的AOP编程

    Duck punch 我们先不谈AOP编程,先从duck punch编程谈起. 如果你去wikipedia中查找duck punch,你查阅到的应该是monkey patch这个词条.根据解释,Mon ...

  5. JavaEE开发之Spring中的依赖注入与AOP编程

    上篇博客我们系统的聊了<JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建>,并在之前的博客中我们聊了依赖注入的相关东西,并且使用Objective-C的R ...

  6. Aop编程--注解与xml的实现

    一.注解方式 1.首先引入spring对于aop编程的jar支持包,spring框架没有的包请自行在网上下载. aopalliance-alpha1.jar aspectjrt.jar aspectj ...

  7. Spring入门3.AOP编程

    Spring入门3.AOP编程 代码下载: 链接: http://pan.baidu.com/s/11mYEO 密码: x7wa 前言: 前面学习的知识是Spring在Java项目中的IoC或DJ,这 ...

  8. 在.NET Core中三种实现“可插拔”AOP编程方式(附源码)

    一看标题肯定会联想到使用动态编织的方式实现AOP编程,不过这不是作者本文讨论的重点. 本文讨论另外三种在netcore中可实现的方式,Filter(过滤器,严格意义上它算是AOP方式),Dynamic ...

  9. 利用多态,实现一般处理程序(ashx)中的AOP(切面编程)

    本文是对工作中的项目进行代码优化(完善登陆验证的AOP切面编程)时,所遇到的各种解决方案思考过程. 项目背景:由ashx+nvelocity构建的简单B/S问卷系统,现需要优化登录验证环节(时隔若干个 ...

随机推荐

  1. [LeetCode][Java] Subsets

    题目: Given a set of distinct integers, nums, return all possible subsets. Note: Elements in a subset ...

  2. 【Facebook的UI开发框架React入门之八】Image的使用简单介绍(iOS平台)-goodmao

    --------------------------------------------------------------------------------------------------- ...

  3. 输入年份,然后打印出该年的万年历,以及标识出当天日期。相似于linux下的cal -y结果。

    public class Permanent { public static boolean isLeapYear(int year){//能被4整除但不能被100整除.或者能被400整除 boole ...

  4. Codeforces 104C Cthulhu dfs暴力 || 点双连通缩点

    题目链接:点击打开链接 题意: 给定n个点m条边的无向图 问图中是否存在 有且仅有一个简单环和一些树,且这些树的root都在这个简单环上. 瞎写了个点双. . == #include <stdi ...

  5. Lnixu Bash

    一.简单命令 1.创建文件(vi) vi hellowold.txt2.创建目录(mkdir) mkdir linux_bash3.删除文件(rm) rm helloworld.txt4.复制文件(c ...

  6. mouseout和mouseover、mouseenter和mouseleave

          在前端开发中经常会碰到当鼠标放到一个元素上时会弹出你一个元素,鼠标离开那个弹出元素后隐藏.这类效果一般要用到一些鼠标事件,一类是mouseout和mouseover,另一类是mouseen ...

  7. Android 封装实现各种样式对话框

    先上图 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/disso ...

  8. Java SE之break和continue标签

    文是学习网络上的文章时的总结,感谢大家无私的分享. Java没有提供goto功能,可是保留了gotokeyword. 在java中能够使用break标签和continue标签功能实现简版的goto功能 ...

  9. /etc/profile与/etc/bashrc、交互式与非交互式、login与non-login shell的差别

    线上的memcached又挂了.仍然没有得到core文件. 排查原因,同事发现启动memcached的脚本存在可疑问题. 问题一:没有设置memcached工作文件夹,有可能core dump时没有工 ...

  10. Activity动态添加Fragment时遇到的问题

    1.Activity动态调用代码 TitleFragement a = new TitleFragement();        getFragmentManager().beginTransacti ...