一、概念篇
Aspect-Oriented Programming(面向切面编程,AOP)
它允许开发者动态地修改静态的OO模型,构造出一个能够不断增长以满足新增需求的系统,就象现实世界中的对象会在其生命周期中不断改变自身,应用程序也可以在发展中拥有新的功能。AOP利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任,例如事务处理、日志管理、权限控制等,封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。
二、VB.NET实现过程
3.创建一个AOP是实现类,来实现Castle.Core的拦截接口
''' <summary>
''' 菜单拦截器
''' </summary>
Public Class BarMenuInterceptor
Implements IInterceptor
Private Sub IInterceptor_Intercept(invocation As IInvocation) Implements IInterceptor.Intercept
Dim isAuth As Boolean = invocation.MethodInvocationTarget.GetCustomAttributes(Of AopPermAttribute)().Any()
If isAuth Then
' MessageBox.Show("你无权限操作该功能")
invocation.ReturnValue = "你无权限操作该功能"
Return
End If
invocation.Proceed()
End Sub
End Class
4.创建一个自定义菜单接口
''' <summary>
''' 菜单接口
''' </summary>
Public Interface IBarMenuItems
Sub TestOne()
Function TestTwo() As String
End Interface
5.实现自定义菜单接口(注意:这里的方法或者函数前面必须加上Overridable关键字才能实现拦截)
''' <summary>
''' 菜单接口的实现,主意关键点,方法前添加 Overridable
''' </summary>
Public Class IBarMenuItemsImpl
Implements IBarMenuItems
Public Overridable Sub TestOne() Implements IBarMenuItems.TestOne
MessageBox.Show("无参方法测试")
End Sub
<AopPerm> Public Overridable Function TestTwo() As String Implements IBarMenuItems.TestTwo
Return "方法测试"
End Function
End Class
6.创建一个自定义注解,用来标记需要aop拦截的方法或函数
''' <summary>
''' 自定义注解
''' </summary>
Public Class AopPermAttribute
Inherits Attribute
Public Sub New()
End Sub
End Class
7.实列化AOP实现类
''' <summary>
''' 创建菜单接口AOP
''' </summary>
Public BarMenuItems As IBarMenuItems = New ProxyGenerator().CreateClassProxy(Of IBarMenuItemsImpl)(New BarMenuInterceptor())
8.创建两个测试按钮,用来调用接口方法
Public Class Form1
''' <summary>
''' 创建菜单接口AOP
''' </summary>
Public BarMenuItems As IBarMenuItems = New ProxyGenerator().CreateClassProxy(Of IBarMenuItemsImpl)(New BarMenuInterceptor())
''' <summary>
''' 测试按钮1
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
BarMenuItems.TestOne()
End Sub
''' <summary>
''' 测试按钮2
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
MessageBox.Show(BarMenuItems.TestTwo)
End Sub
End Class
好了,到此就结束了!!