翼度科技»论坛 编程开发 .net 查看内容

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

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
1.需求:为项目中通讯PLC模块实现AOP,实现统一的日志打印,参数校验,方法执行时间统计
2.问题:①现有项目没有IOC容器,没法使用部分AOP库的方法注册到IOC,(注:如果要实现IOC对现有代码改动大,并且AOP只是针对部分模块实现)②要在尽量小的代码改动下实现
针对以上问题选择使用Castle.DynamicProxy
3.实现:
①项目中所有通讯PLC(西门子、三菱、汇川等)的类都实现了统一接口PlcConnect
②通过代理模式统一对外暴露一个代理类PlcConnectProxy 
③网上有许多关于Castle.DynamicProxy是怎么使用的,这里就不一一描述了,说一下我是怎么用的。
我是创建了一个Interceptor的类继承了StandardInterceptor,也可以实现IInterceptor,都没问题,StandardInterceptor也是实现IInterceptor这个接口。
  1. public class Interceptor : StandardInterceptor
  2. {
  3.      protected override void PreProceed(IInvocation invocation)
  4.      {
  5.          // 方法执行前
  6.      }
  7.      protected override void PerformProceed(IInvocation invocation)
  8.      {
  9.          try
  10.          {
  11.              // 方法执行
  12.              base.PerformProceed(invocation);
  13.          }
  14.          catch (Exception ex)
  15.          {
  16.              HandleException(ex);
  17.          }
  18.      }
  19.      protected override void PostProceed(IInvocation invocation)
  20.      {
  21.          // 方法执行后
  22.      }
  23.      private void HandleException(Exception ex)
  24.      {
  25.          // 方法异常捕获
  26.      }
  27. }
复制代码
再定义一个静态类ProxyExtension创建拦截器
  1. public static class ProxyExtension
  2. {
  3.     public static T GetHslAOPProxy<T>(this T t) where T : class
  4.     {
  5.         return new ProxyGenerator().CreateClassProxy<T>(new Interceptor());
  6.     }
  7. }
复制代码
然后代理类在new的时候.GetHslAOPProxy()就可以
  1. new PlcConnectProxy().GetHslAOPProxy()
复制代码
4.带来问题
  1. new PlcConnectProxy().GetHslAOPProxy()
复制代码
PlcConnectProxy写成了单例但在创建时会初始化两个对象,导致被代理类有了两个,而我的需求是要保证被代理类是一个单例,破坏了单例模式。
原因:.GetHslAOPProxy()在调用时会生成一个子类继承父类方法来实现AOP。
解决:将所有通讯PLC(西门子、三菱、汇川等)的类写为单例,保证被代理类类只会生成一个(但又有个问题:虽然被代理类确实只有一个了,但PlcConnectProxy还会有两个,一个父类,一个子类)

来源:https://www.cnblogs.com/chenghaixiang/p/17986737
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具