采用AOP 的观点来 Log 所有方法的调用
2005-01-24 15:52
330 查看
微软中文和英文分别有两篇介绍
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()> _
Imports System.Runtime.Remoting.Contexts
Imports System.Runtime.Remoting.Activation
Imports System.Runtime.Remoting.Messaging
然后就是property 和 SInk
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 或者其他处理。
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()> _
Imports System.Runtime.Remoting.Contexts
Imports System.Runtime.Remoting.Activation
Imports System.Runtime.Remoting.Messaging
然后就是property 和 SInk
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 或者其他处理。
相关文章推荐
- 用 java.lang.reflect.Proxy 制作类似AOP 的方法调用 Log 层
- Spring AOP代理机制以及方法调用在同一个类的另一个方法的问题
- 循环中调用DAO时解决方案。(数据量比较大时应该采用的方法。)
- Android 采用AOP方式封装6.0权限管理的方法
- Aop 记录 方法被调用的时间 也可以做他用
- SpringBoot CGLIB AOP解决Spring事务,对象调用自己方法事务失效.
- Net下采用GET/POST/SOAP方式动态调用WebService的简易灵活方法(C#)
- 请写个方法来获取1-100间所有奇数的和。并在主函数中调用,打印出结果 class JiShuHe
- phpcms 列表页中调用其下的所有子栏目(或特定的子栏目)的方法
- Spring的Bean内部方法调用无法使用AOP切面(CacheAble注解失效)
- LogAOP计算每个接口的调用时间
- jsp调用applet以及采用js调用applet的方法
- Spring AOP不拦截从对象内部调用的方法原因
- linux采用编译内核的方法增加系统功能调用
- SpringMVC在Controller层实现aop,同类中方法调用问题
- 20110327-8.3-warning-如果程序崩溃了,则不会刷新缓冲区,最好的方法是保证所有的输出操作都显式地调用了flush或endl
- Filter之方法之间的递归调用——祝福所有的人圣诞快乐!
- 关于AOP无法切入同类调用方法的问题
- PHP采用自定义函数实现遍历目录下所有文件的方法
- 在Spring中采用声明式方法对Hibernate和JDBC进行统一的事务配置(AOP)