微软中文和英文分别有两篇介绍

http://www.microsoft.com/china/MSDN/library/windev/COMponentdev/AspectOrientedProgrammingEnablesBetterCodeEncapsulationandReuse.mspx?pf=true

http://msdn.microsoft.com/msdnmag/issues/03/03/ContextsinNET/default.aspx

AOP 的观点,在 Dotnet 中显的更容易实现。我写了一个简单的来自,来log 对 Person 的所有调用

假设有这个的一个实体类。

<Log()> _ 
 Public Class PersonClass Person 
    Inherits ContextBoundObject 
 
    Sub New()Sub New(ByVal s As String) 
 
    End Sub 
 
    Public Function SayHello()Function SayHello(ByVal yourName As String) As String 
        Return "Hello: " + yourName 
    End Function 
End Class 

这里的对象跟普通的对象有一点不同:
1. 加上了一个从 CustomeAttribute 集成过来的属性
2. 从ContextBoundObject

后面就要实现这样的一个属性,这个属性主要是为对象的上下文环境中添加自己的属性,在属性中嵌入自己的sink

属性的写法:

Imports System.Runtime.Remoting.Contexts
Imports System.Runtime.Remoting.Activation
Imports System.Runtime.Remoting.Messaging

Public Class LogAttributeClass LogAttribute
    Inherits ContextAttribute
    Sub New()Sub New()
        MyBase.New("LogAttribute")
    End Sub
    Public Overrides Sub GetPropertiesForNewContext()Sub GetPropertiesForNewContext(ByVal ctorMsg As System.Runtime.Remoting.Activation.IConstructionCallMessage)

        ' 添加一个新的属性到上下文的属性中

        Dim myContextLogProperty As New ContextLogProperty
        ctorMsg.ContextProperties.Add(myContextLogProperty)

    End Sub

    Public Overrides Function IsContextOK()Function IsContextOK(ByVal ctx As System.Runtime.Remoting.Contexts.Context, ByVal ctorMsg As System.Runtime.Remoting.Activation.IConstructionCallMessage) As Boolean
        Return False
        ' false 表示还有新的属性要加进去
    End Function

End Class

然后就是property 和 SInk

Public Class ContextLogPropertyClass ContextLogProperty
    Implements IContextProperty, IContributeServerContextSink
    Public Sub Freeze()Sub Freeze(ByVal newContext As System.Runtime.Remoting.Contexts.Context) Implements System.Runtime.Remoting.Contexts.IContextProperty.Freeze

    End Sub

    Public Function IsNewContextOK()Function IsNewContextOK(ByVal newCtx As System.Runtime.Remoting.Contexts.Context) As Boolean Implements System.Runtime.Remoting.Contexts.IContextProperty.IsNewContextOK
        Return True
    End Function

    Public ReadOnly Property Name()Property Name() As String Implements System.Runtime.Remoting.Contexts.IContextProperty.Name
        Get
            Return "Logger"
        End Get
    End Property

    Public Function GetServerContextSink()Function GetServerContextSink(ByVal nextSink As IMessageSink) As IMessageSink Implements System.Runtime.Remoting.Contexts.IContributeServerContextSink.GetServerContextSink
        Dim sink As New LogSink(nextSink)
        Return sink
    End Function

End Class


Public Class LogSinkClass LogSink
    Implements IMessageSink
    Private _nextSink As IMessageSink
    Sub New()Sub New(ByVal nextSink As IMessageSink)
        _nextSink = nextSink
    End Sub
    Public Function AsyncProcessMessage()Function AsyncProcessMessage(ByVal msg As IMessage, ByVal replySink As IMessageSink) As IMessageCtrl Implements IMessageSink.AsyncProcessMessage
        'Debug.Assert(False)
        Return _nextSink.AsyncProcessMessage(msg, replySink)
    End Function

    Public ReadOnly Property NextSink()Property NextSink() As IMessageSink Implements IMessageSink.NextSink
        Get
            Return _nextSink
        End Get
    End Property

    Public Function SyncProcessMessage()Function SyncProcessMessage(ByVal msg As IMessage) As IMessage Implements IMessageSink.SyncProcessMessage
        LogMessage(msg)
        Return _nextSink.SyncProcessMessage(msg)
    End Function

    Public Sub LogMessage()Sub LogMessage(ByVal msg As IMessage)
        If TypeOf (msg) Is IConstructionCallMessage Then
            MessageBox.Show(String.Format("{0}的构造函数", CType(msg, IConstructionCallMessage).TypeName))
        End If
        If TypeOf (msg) Is IMethodMessage Then
            Dim msg1 As IMethodMessage = CType(msg, IMethodMessage)
            MessageBox.Show(String.Format("方法{0}参数个数{1}", msg1.MethodName, msg1.ArgCount))
        End If
    End Sub
End Class

然后调用person 的方法的时候,你会发现自定义sink 会按照 ImessageSink 的模型可以对流经该 sinnk 的msn 做自己的log 或者其他处理。

转载于:https://www.cnblogs.com/montaque/archive/2005/01/24/96484.html

采用AOP 的观点来 Log 所有方法的调用相关推荐

  1. aop统计请求数量_使用SpringAOP获取一次请求流经方法的调用次数和调用耗时

    引语### 作为工程师,不能仅仅满足于实现了现有的功能逻辑,还必须深入认识系统.一次请求,流经了哪些方法,执行了多少次DB操作,访问了多少次文件操作,调用多少次API操作,总共有多少次IO操作,多少C ...

  2. java aop注解日志记录_springMVC自定义注解,用AOP来实现日志记录的方法

    需求背景 最近的一个项目,在项目基本完工的阶段,客户提出要将所有业务操作的日志记录到数据库中,并且要提取一些业务的关键信息(比如交易单号)体现在日志中. 为了保证工期,在查阅了资料以后,决定用AOP+ ...

  3. java切点配置_Spring AOP中定义切点的实现方法示例

    本文实例讲述了Spring AOP中定义切点的实现方法.分享给大家供大家参考,具体如下: 一 配置 xmlns:xsi="http://www.w3.org/2001/XMLSchema-i ...

  4. java方法设置切点_java相关:Spring AOP中定义切点的实现方法示例

    java相关:Spring AOP中定义切点的实现方法示例 发布于 2020-6-6| 复制链接 摘记: 本文实例讲述了Spring AOP中定义切点的实现方法.分享给大家供大家参考,具体如下:一 配 ...

  5. java args例子_Spring AOP中使用args表达式的方法示例

    本文实例讲述了Spring AOP中使用args表达式的方法.分享给大家供大家参考,具体如下: 一 配置 xmlns:xsi="http://www.w3.org/2001/XMLSchem ...

  6. Android系统(118)---Android抓取各种log的方法

    Android抓取各种log的方法 转自 http://blog.csdn.net/matthewei6/article/details/50596983 1.logcat (四类log buffer ...

  7. Android 系统(38)---Android抓取各种log的方法

    Android抓取各种log的方法 http://blog.csdn.net/matthewei6/article/details/50596983 1.logcat (四类log buffer是ma ...

  8. 【软件项目管理】用例分析方法采用一种面向对象的情景分析方法

    用例分析方法采用一种面向对象的情景分析方法. 传统的结构化分析方法是面向功能的,而面向对象的视点是将系统看作一组服务,将问题看作相互作用的实体.用例分析方法采用面向对象的方法,将现实世界的" ...

  9. mysql 开启 slow log,mysql 5.5 开启慢日志slow log的方法(log_slow_queries)

    mysql 5.5 开启慢日志slow log的方法(log_slow_queries) 1.MySQL 5.5命令行里面 复制代码 代码如下: set global log_slow_queries ...

  10. 抓取MBIM PCAP LOG的方法

    现在市面上已经有好些带modem模块的Windows系统笔记本,如联想笔记本小新Air LTE版 和 小米笔记本Air 4G版. 为了实现移动宽带设备(即上面提到的modem模块) 和 PC端的通信, ...

最新文章

  1. css中margin-top/margin-bottom失效
  2. SimpleAdapter理解
  3. 【SSM框架系列】Mybatis映射配置文件与核心配置文件深入
  4. 有逼格的产品经理都用什么样的杯子?
  5. 网络延迟造成插入多条重复数据
  6. Windows和Linux双启动,并用在Windows下配置CoLinux启动
  7. linux下手动删除数据库实例
  8. hadoop中如何动态更新集群队列和容量
  9. prefuse学习(一)用非数据库连接和xml的方式读入数据
  10. java synchronized 静态_Java之Synchronized修饰实例方法和静态方法
  11. js 字符串替换_正则精要:玩转JS正则表达式,也许只需这一篇(建议收藏)
  12. iPhone近两个财季为苹果带来1135亿美元营收 同比增长33%
  13. 网站的基本功能:RBAC
  14. ubuntu 10.04下vmware tools安装和一些应用
  15. oracle sql 分区查询语句_Oracle分区表跨分区查询数据为空
  16. python毕业设计作品基于django框架外卖点餐系统毕设成品(6)开题答辩PPT
  17. 视频追踪meanshift
  18. Android JOSON应用及详解
  19. php布道师,百度智能小程序布道师计划发布,打造全链条导师服务
  20. PHP开发的CRM客户关系管理系统

热门文章

  1. html添加兄弟元素,jquery插入兄弟节点的操作方法
  2. cad相对坐标快捷键_CAD里面绝对、相对、极坐标是什么?如何区别
  3. java runnable 匿名_Java 开发者最困惑的四件事
  4. 传统的6d位姿估计fangfa1_基于视觉的机器人抓取从物体定位、位姿估计到抓取位姿估计 | 公开课预告...
  5. ad20如何画出pcb板大小_PCB板过孔对高频信号传输的影响,一定要重视
  6. java中bean的作用域有哪些_深入了解Spring中Bean的作用域和生命周期
  7. CS224N笔记——反向传播
  8. linux基础学习【6】
  9. 回溯法和树的先序遍历
  10. angularjs 资源集合