在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是软件开发中的一个热点,利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性。

比如说三层的调用:UI => BLL => DAL,正常来说我们会在UI层调用BLL层某个类的某个方法,然后BLL层某个类的某个方法又会调用DAL层某个类的某个方法,可以说通常情况下我们都是这么干的;如果说UI调BLL、BLL调DAL是纵向的话,那么AOP就是横向的,AOP可以做到在调用BLL层或DAL层任意方法之前之后做一些统一的逻辑处理。

AOP的典型应用场景:日志记录、权限验证、异常处理、缓存等

目前,可以实现AOP的类库也有很多,如下:

AspectCore
Unity
Castle DynamicProxy
Dora.Interception

但是在.net core中有DispatchProxy类(命名空间:System.Reflection),提供实例化代理对象和处理其方法调度的机制,借助它我们可以自己实现AOP,直接看示例

定义一个消息接口IMessage,其中有一个发送消息Send和接收消息Receive的方法定义:

    public interface IMessage
{
void Send(string content);
void Receive(string content);
}

定义电子邮件类EmailMessage实现消息接口IMessage,实现使用电子邮件发送和接收消息:

    public class EmailMessage : IMessage
{
public void Send(string content)
{
Console.WriteLine("Send Email:" + content);
}
public void Receive(string content)
{
Console.WriteLine("Receive Email:" + content);
}
}

定义日志拦截器LogDispatchProxy 继承自DispatchProxy类,重写基类Invoke方法并在目标方法调用前后加上所需业务逻辑;然后定义TargetClass属性,该属性是目标方法所属类的实例

    public class LogDispatchProxy : DispatchProxy
{
public object TargetClass { get; set; }
protected override object Invoke(MethodInfo targetMethod, object[] args)
{
Write("方法执行前");
var result = targetMethod.Invoke(TargetClass, args);
Write("方法执行后");
return result;
} private void Write(string content)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(content);
Console.ResetColor();
}
}

使用:

    class Program
{
static void Main(string[] args)
{
//使用DispatchProxy类的静态方法Create生成代理类,其中Create是个泛型方法,泛型有两个值,第一个值必须是接口,第二个值必须是DispatchProxy的子类
IMessage messageDispatchProxy = DispatchProxy.Create<IMessage, LogDispatchProxy>();
//创建一个实现了IMessage接口的类的实例,并赋值给代理类的TargetClass属性
((LogDispatchProxy)messageDispatchProxy).TargetClass = new EmailMessage();
messageDispatchProxy.Send("早上好");
Console.WriteLine("=======================================");
messageDispatchProxy.Receive("中午好"); Console.ReadKey();
}
}

执行结果

我的理解:通过DispatchProxy.Create创建的代理类messageDispatchProxy 就是一个LogDispatchProxy类,并且利用我们提供的的实例实现了IMessage接口,所以messageDispatchProxy可以强转为LogDispatchProxy或IMessage

至此,我们没有通过任何第三方类库,自己实现了一个AOP

使用.net core中的类DispatchProxy实现AOP的更多相关文章

  1. [译]如何在ASP.NET Core中实现面向切面编程(AOP)

    原文地址:ASPECT ORIENTED PROGRAMMING USING PROXIES IN ASP.NET CORE 原文作者:ZANID HAYTAM 译文地址:如何在ASP.NET Cor ...

  2. .NET Core中基类可以反射子类的成员

    我们定义一个类DemoA,再定义一个类DemoB继承DemoA.当构造一个DemoB类对象后,我们可以通过其调用基类DemoA中的方法来反射子类DemoB的成员. 新建一个.NET Core控制台项目 ...

  3. ASP.NET Core中,UseDeveloperExceptionPage扩展方法会吃掉异常

    在ASP.NET Core中Startup类的Configure方法中,有一个扩展方法叫UseDeveloperExceptionPage,如下所示: // This method gets call ...

  4. C# 中一些类关系的判定方法 C#中关于增强类功能的几种方式 Asp.Net Core 轻松学-多线程之取消令牌

    1.  IsAssignableFrom实例方法 判断一个类或者接口是否继承自另一个指定的类或者接口. public interface IAnimal { } public interface ID ...

  5. 在.NET Core中使用DispatchProxy“实现”非公开的接口

    原文地址:"Implementing" a non-public interface in .NET Core with DispatchProxy 原文作者:Filip W. 译 ...

  6. EF Core中,通过实体类向SQL Server数据库表中插入数据后,实体对象是如何得到数据库表中的默认值的

    我们使用EF Core的实体类向SQL Server数据库表中插入数据后,如果数据库表中有自增列或默认值列,那么EF Core的实体对象也会返回插入到数据库表中的默认值. 下面我们通过例子来展示,EF ...

  7. 在ASP.NET Core的startup类中如何使用MemoryCache

    问: 下面的代码,在ASP.NET Core的startup类中创建了一个MemoryCache并且存储了三个键值“entryA”,“entryB”,“entryC”,之后想在Controller中再 ...

  8. .NET Core中的认证管理解析

    .NET Core中的认证管理解析 0x00 问题来源 在新建.NET Core的Web项目时选择“使用个人用户账户”就可以创建一个带有用户和权限管理的项目,已经准备好了用户注册.登录等很多页面,也可 ...

  9. ASP.NET Core 中的那些认证中间件及一些重要知识点

    前言 在读这篇文章之间,建议先看一下我的 ASP.NET Core 之 Identity 入门系列(一,二,三)奠定一下基础. 有关于 Authentication 的知识太广,所以本篇介绍几个在 A ...

随机推荐

  1. Java类和对象动手动脑

    动手动脑1 以下代码为何无法通过编译?哪儿出错了?

  2. UDP方式的传输

    UDP 部分内容需要查文档学习,我们需要了解下面的两个类:java.net.DatagramSocket和java.net.DatagramPacket java.net.DatagramSocket ...

  3. Int类的129为什么转成byte就变成-127了?

    作为一个java开发人员,接触的基本都是上层的,都是以应用为主,根据业务实现功能,但今天无意间发现了一个小问题,int类型的129转成byte类型变成了-127,我知道是因为位数截取的原因,但是还没有 ...

  4. 设计模式常见面试知识点总结(Java版)

    设计模式 这篇总结主要是基于我设计模式系列的文章而形成的的.主要是把重要的知识点用自己的话说了一遍,可能会有一些错误,还望见谅和指点.谢谢 更多详细内容可以到我的cdsn博客上查看: https:// ...

  5. icon font在sketch中的下载与安装

    icon font的下载安装: 1.首先打开sketch--插件--管理插件--获取插件--搜索 icon font--点击icon font--clone or download--下载的是一个sk ...

  6. CS184.1X 计算机图形学导论L3V2和L3V3(部分)

    组合变换 连接矩阵的优点是可以使用这些矩阵单独操作. 多个变换依然是一个矩阵. 连接矩阵不可交换,因为矩阵乘法不具有交换性. X3=RX2 X2=SX1 X3=R(SX1)=(RS)X1 X3≠SRX ...

  7. RAID5 配置,3块磁盘,2快备份

    1. 在虚拟机中再添加5块硬盘: 2. 用fdisk -l 可以查看当前虚拟机磁盘情况. 3. 使用mdadm命令创建RAID5,名称为”/dev/md0″. -C代表创建操作,-v显示创建过程,-n ...

  8. 基于vue组件,发布npm包

    亲测好用,如出错,请留言 1.项目初始化 使用vue脚手架创建,但vuecli太重,我们使用简单的工程脚手架进行处理,输入命令 vue init webpack-simple my-project n ...

  9. DM7经常使用的命令汇总

    由于DM7兼容oracle ,所以当你不知道某个命令时,大抵就是可以参照oracle的命令及语法,当然有极少的情况会不一样.常用命令如下: 1.连接登录 disql SYSDBA/SYSDBA@223 ...

  10. HTTP使用get,post方式连接

    在项目中使用了http的get和post方式连接,发送传输数据: public static String doGet(String httpUrl) { HttpURLConnection conn ...