首页 > 其他分享 >在.framework框架下的winfrom中使用Castle.DynamicProxy实现AOP问题小记

在.framework框架下的winfrom中使用Castle.DynamicProxy实现AOP问题小记

时间:2024-01-25 11:11:48浏览次数:29  
标签:DynamicProxy 实现 winfrom PlcConnectProxy 代理 GetHslAOPProxy AOP new

1.需求:为项目中通讯PLC模块实现AOP,实现统一的日志打印,参数校验,方法执行时间统计

2.问题:①现有项目没有IOC容器,没法使用部分AOP库的方法注册到IOC,(注:如果要实现IOC对现有代码改动大,并且AOP只是针对部分模块实现)②要在尽量小的代码改动下实现

针对以上问题选择使用Castle.DynamicProxy

3.实现:

①项目中所有通讯PLC(西门子、三菱、汇川等)的类都实现了统一接口PlcConnect

②通过代理模式统一对外暴露一个代理类PlcConnectProxy 

③网上有许多关于Castle.DynamicProxy是怎么使用的,这里就不一一描述了,说一下我是怎么用的。

我是创建了一个Interceptor的类继承了StandardInterceptor,也可以实现IInterceptor,都没问题,StandardInterceptor也是实现IInterceptor这个接口。

 public class Interceptor : StandardInterceptor
 {
     protected override void PreProceed(IInvocation invocation)
     {
         // 方法执行前
     }

     protected override void PerformProceed(IInvocation invocation)
     {
         try
         {
             // 方法执行
             base.PerformProceed(invocation);
         }
         catch (Exception ex)
         {
             HandleException(ex);
         }
     }

     protected override void PostProceed(IInvocation invocation)
     {
         // 方法执行后
     }

     private void HandleException(Exception ex)
     {
         // 方法异常捕获
     }
 }

再定义一个静态类ProxyExtension创建拦截器

public static class ProxyExtension
{
    public static T GetHslAOPProxy<T>(this T t) where T : class
    {
        return new ProxyGenerator().CreateClassProxy<T>(new Interceptor());
    }
}

然后代理类在new的时候.GetHslAOPProxy()就可以

new PlcConnectProxy().GetHslAOPProxy()

4.带来问题

new PlcConnectProxy().GetHslAOPProxy()

PlcConnectProxy写成了单例但在创建时会初始化两个对象,导致被代理类有了两个,而我的需求是要保证被代理类是一个单例,破坏了单例模式。

原因:.GetHslAOPProxy()在调用时会生成一个子类继承父类方法来实现AOP。
解决:将所有通讯PLC(西门子、三菱、汇川等)的类写为单例,保证被代理类类只会生成一个(但又有个问题:虽然被代理类确实只有一个了,但PlcConnectProxy还会有两个,一个父类,一个子类)

标签:DynamicProxy,实现,winfrom,PlcConnectProxy,代理,GetHslAOPProxy,AOP,new
From: https://www.cnblogs.com/chenghaixiang/p/17986737

相关文章

  • Sping的AOP基本教程(使用注解方式)
    说明:使用注解方式实现AOP切面。什么是AOP?面向切面编程,利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。通俗描述:不通过修改源代码方式,在主干功能里面添加新功能。AOP底层使用动态代理。AOP术语......
  • 深入分析若依数据权限@datascope (注解+AOP+动态sql拼接) 【循序渐进,附分析过程】
    除了我们平时都知道的路由权限(即对接口的访问权限外),在日常生产开发中,我们还应该有对数据的访问权限。在若依这个框架中,通过角色中的数据范围这个属性来对数据权限进行控制。对应实体类:深入分析一个用户肯定是有一种角色的,也肯定是隶属于一个部门的。这里咱们就以用户在......
  • 利用aop、拦截器HandlerInterceptor来实现接口限流,日志收集
    前言:aop是面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。拦截器是web请求中一个请求周期中的一环就实现接口限流这个需求来说,用aop和HandlerInterceptor都可以来实现,就是在调用接口之前做一些约束而已。aop+自定义注解+Semaphore实现接口限流自......
  • 注解版的springaop实操讲解(赋完整测试代码)
    aop是个很强的东西,我们可以用来实现日志收集,鉴权,敏感词过滤等等功能。在说注解版的springaop使用之前,一些专业术语我用大白话来复述一遍,希望大家不要嫌弃。切面:切入点+通知连接点:目标对象中被增强的某个方法切点:连接点的集合目标对象:被增强的对象织入:把代理逻辑加入到目标对象的过......
  • 利用aop实现热拔插(类似于插件)
    现在有这么一个需求:就是我们日志的开与关是交给使用人员来控制的,而不是由我们开发人员固定写死的。大家都知道可以用aop来实现日志管理,但是如何动态的来实现日志管理呢?aop源码中的实现逻辑中有这么一个步骤,就是会依次扫描Advice的实现类,然后执行。我们要做的就是自定义一个advice的......
  • spring--AOP通知类型有哪些
    SpringAOP(Aspect-OrientedProgramming,面向切面编程)提供了五种类型的通知(advice),这些通知定义了切面(aspect)是在目标对象的方法执行的哪个点被应用。以下是这五种通知类型:前置通知(Beforeadvice):在目标方法执行之前执行的通知,无法阻止方法的继续执行(除非它抛出一个异常)。后置......
  • spring--AOP的实现原理
    SpringAOP(面向切面编程)是Spring框架的一个关键组成部分,它提供了一种将横切关注点(如日志记录、事务管理、安全等)与业务逻辑分离的方法。SpringAOP的实现主要依赖于代理模式,以下是其工作原理的简要概述:代理模式:SpringAOP通过创建目标对象的代理来应用横切逻辑。这些代......
  • AOP 编程
    AOP编程目录AOP编程1.AOP和OOP2.AOP中的一些概念术语通知类型3.AOP实现方式4.AOP使用1.添加依赖:在项目的pom.xml文件中添加SpringAOP依赖,以确保AOP模块可用。2.创建切面类:创建一个Java类,并使用@Aspect注解标记它,这个类将充当切面。1.AOP和OOPAOP为AspectOrie......
  • Spring AOP原来是这样实现的
    SpringAOP技术实现原理在Spring框架中,AOP(面向切面编程)是通过代理模式和反射机制来实现的。本文将详细介绍SpringAOP的技术实现原理,包括JDK动态代理和CGLIB代理的使用,并通过实例演示其在实际项目中的应用。1.AOP的实现原理概述SpringAOP的实现基于代理模式,通过代理对象来包......
  • Spring Boot入坑-AOP、Interceptor和Filter
    AOP概述面向切面编程(AspectOrientedProgramming),从不同的维度或角度给已有程序添加附加功能的一种技术实现的方式是Spring容器为程序创建代理,让调用方无感知的调用指定方法,在运行期间动态的“织入”其他逻辑主要目的是为了解耦弥补OOP中只能继承类或实现接口进行功......