.NET 通过 Autofac 和 DynamicProxy 实现AOP

  什么是AOP?引用百度百科:AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。实现AOP主要由两种方式,一种是编译时静态植入,优点是效率高,缺点是缺乏灵活性,.net下postsharp为代表者(这个是收费的)。另一种方式是动态代理,优缺点与前者相反,动态为目标类型创建代理,通过代理调用实现拦截。AOP能做什么,常见的用例是事务处理、日志记录等等。下面就讲讲Autofac怎么实现AOP,Autofac是一个.net下非常优秀,性能非常好的IOC容器(.net下效率最高的容器),加上AOP简直是如虎添翼。Autofac的AOP是通过Castle(也是一个容器)项目的核心部分实现的,名为Autofac.Extras.DynamicProxy,顾名思义,其实现方式为动态代理。

  使用前的准备:

    通过Nuge安装程序包 :Autofac、Autofac.Extras.DynamicProxy,安装成功之后会增加三个引用

    

  下面正式开始了!

  第一步:创建拦截器

  下面是一个简单的拦截器示例,该拦截器的功能是显示被拦截的方法名称、参数列表和返回结果

  

 1  /// <summary>
 2     /// 拦截器 需要实现 IInterceptor接口 Intercept方法
 3     /// </summary>
 4     public class CallLogger: IInterceptor
 5     {
 6         TextWriter _output;
 7
 8         public CallLogger(TextWriter output)
 9         {
10             _output = output;
11         }
12
13         /// <summary>
14         /// 拦截方法 打印被拦截的方法执行前的名称、参数和方法执行后的 返回结果
15         /// </summary>
16         /// <param name="invocation">包含被拦截方法的信息</param>
17         public void Intercept(IInvocation invocation)
18         {
19
20             _output.WriteLine("你正在调用方法 \"{0}\"  参数是 {1}... ",
21               invocation.Method.Name,
22               string.Join(", ", invocation.Arguments.Select(a => (a ?? "").ToString()).ToArray()));
23
24             //在被拦截的方法执行完毕后 继续执行
25             invocation.Proceed();
26
27             _output.WriteLine("方法执行完毕,返回结果:{0}", invocation.ReturnValue);
28         }
29     }

  第二步:注册拦截器到Autofac容器

  拦截器必须注册到Aufofac容器中,可以通过拦截器类型或者命名注入,这两种方式会让使用拦截器的方法有所不同(后面会讲到)。

  

1             // 命名注入
2             builder.Register(c => new CallLogger(Console.Out))
3                    .Named<IInterceptor>("log-calls");
4
5             // 类型注入
6             builder.Register(c => new CallLogger(Console.Out));    

  第三步:启用拦截器

  启用拦截器主要有两个方法:EnableInterfaceInterceptors(),EnableClassInterceptors()。

  EnableInterfaceInterceptors方法会动态创建一个接口代理

  EnableClassInterceptors方法会创建一个目标类的子类代理类,这里需要注意的是只会拦截虚方法,重写方法

  启用拦截器示例代码:

  

            //启用类代理拦截
            builder.RegisterType<Circle>().EnableClassInterceptors();
            //启用接口代理拦截
            builder.RegisterType<Circle>().EnableInterfaceInterceptors();

  第四步:指明要拦截的类型

  有两种方法:

    第一种:给类型加上特性Attribute

    

    第二种:在注册类型到容器的时候动态注入拦截器

    

1             //动态注入拦截器CallLogger
2             builder.RegisterType<Circle>().InterceptedBy(typeof(CallLogger)).EnableClassInterceptors();

  第五步:测试效果了

    1.类代理拦截

    

    Circle类代码:

    

    2.接口代理拦截

    

    IShape接口代码:

    

1 public interface IShape
2     {
3         /// <summary>
4         /// 形状的面积
5         /// </summary>
6         void Area();
7
8     }

    Circle类代码:

    

1 public class Circle:IShape
2     {
3         //重写父类抽象方法
4         public void Area()
5         {
6             Console.WriteLine("你正在调用圆求面积的方法");
7         }
8     }

    如果有什么地方写得不对欢迎批评改正,如果有什么疑问,欢迎提问。

时间: 2024-10-21 08:10:27

.NET 通过 Autofac 和 DynamicProxy 实现AOP的相关文章

net core 3.1使用autofac及Castle实现Aop切面编程

构建基本项目及引入需要的包文件 autofac在net core 3.1的使用上与2.2有不同,所以在这里记录一下. 先创建一个简单的demo项目,控制台程序及api或者mvc模式都可以. 依次引入依赖包: Autofac:提供容器控制 Autofac.Extensions.DependencyInjection:对autofac依赖注入进行扩展 Autofac.Extras.DynamicProxy:对autofac动态代理进行扩展 Castle.Core:使用动态代理的实现 版本有不一致没关

基于Autofac, Castle.DynamicProxy的动态WCF解决方案(原创)

本方案解决了下面3个主要的问题: 1.减少配置,为了避免每次新增service都需要去修改配置文件,包括服务器端跟各个客户端的. 2.能够使用函数重载,泛型函数,以及泛型类. 3.使项目能够快速地在wcf与直接调用dll之间切换. 整个解决方案分为四块内容:1.客户端,2.契约层,3.服务端,4.实现层 1.客户端:只能看到契约层,而看不到具体的实现:但也可以通过直接引用实现层,从而脱离wcf(需要修改工厂方法,也可以改进一下,通过配置文件来做这个事情,但这个不是本解决方案的重点,有兴趣的可以自

基于ef core 2.0的数据库增删改审计系统

1.首先是建审计存储表 CREATE TABLE [dbo].[Audit] ( [Id] [uniqueidentifier] NOT NULL, [EntityName] [nvarchar](100), [OldValue] [nvarchar](max), [NewValue] [nvarchar](max), [StateName] [nvarchar](255), [CreatedBy] [nvarchar](255), [CreatedDate] [datetime] NOT NU

Autofac的AOP面向切面编程研究

*:first-child { margin-top: 0 !important; } .markdown-body>*:last-child { margin-bottom: 0 !important; } .markdown-body a:not([href]) { color: inherit; text-decoration: none; } .markdown-body .anchor { float: left; padding-right: 4px; margin-left: -2

Autofac实现AOP拦截

本文主要是详解一下在ASP.NET Core中,采用替换后的Autofac来实现AOP拦截. Aspect Oriented Programming(AOP),面向切面编程,是一个比较热门的话题.AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果. 引入类库 nuget命令如下: Install-Package Autofac.Extras.DynamicProxy -Version 4.5.0 复制代码

netcore使用AutoFac实现AOP

原文:netcore使用AutoFac实现AOP 第一步,添加程序集引用 在Nuget中搜索autofac找到Autofac.Extras.DynamicProxy并安装. 第二步:添加拦截器 /// <summary> /// 拦截器(实现 Castle.DynamicProxy.IInterceptor)接口 /// </summary> public class CustomAutoFacAOPInterception : IInterceptor { public void

Autofac与AOP功能例子

using Autofac.Extras.DynamicProxy; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace aopTest { [Intercept(typeof(CallLogger))] public interface IProduct { string Title { get;

NET Core 3.1 基于Autofac 的缓存AOP

缓存功能,一般咱们都是将数据获取到以后,定义缓存,然后在其他地方使用的时候,在根据key去获取当前数据,然后再操作等等,平时都是在API接口层获取数据后进行缓存,今天咱们可以试试,在接口之前就缓存下来. 1.定义 Memory 缓存类和接口 /// <summary> /// 简单的缓存接口,只有查询和添加,以后会进行扩展 /// </summary> public interface ICaching { object Get(string cacheKey); void Set

从壹开始前后端分离【 .NET Core2.0 Api + Vue 3.0 + AOP + 分布式】框架之九 || 依赖注入IoC学习 + AOP界面编程初探

代码已上传Github,文末有地址 说接上文,上回说到了<从壹开始前后端分离[ .NET Core2.0 Api + Vue 2.0 + AOP + 分布式]框架之八 || API项目整体搭建 6.3 异步泛型+依赖注入初探>,后来的标题中,我把仓储两个字给去掉了,因为好像大家对这个模式很有不同的看法,嗯~可能还是我学艺不精,没有说到其中的好处,现在在学DDD领域驱动设计相关资料,有了好的灵感再给大家分享吧. 到目前为止我们的项目已经有了基本的雏形,后端其实已经可以搭建自己的接口列表了,框架已