AOP的簡單示例
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Contexts;
using System.Runtime.Remoting.Proxies;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Services;
using System.Runtime.Remoting.Activation;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
BusinessHandler handler = new BusinessHandler();
handler.DoSomething();
}
}
}
//業務層的類和方法,讓它繼承自上下文繫結類的基類
[MyInterceptor]
public class BusinessHandler : ContextBoundObject
{
[MyInterceptorMethod]
public void DoSomething()
{
MessageBox.Show("執行了方法本身!");
}
}
//貼在方法上的標籤
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public sealed class MyInterceptorMethodAttribute : Attribute { }
//貼在類上的標籤
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public sealed class MyInterceptorAttribute : ContextAttribute, IContributeObjectSink
{
public MyInterceptorAttribute()
: base("MyInterceptor")
{ }
//實現IContributeObjectSink介面當中的訊息接收器介面
public IMessageSink GetObjectSink(MarshalByRefObject obj, IMessageSink next)
{
return new MyAopHandler(next);
}
}
//AOP方法處理類,實現了IMessageSink介面,以便返回給IContributeObjectSink介面的GetObjectSink方法
public sealed class MyAopHandler : IMessageSink
{
//下一個接收器
private IMessageSink nextSink;
public IMessageSink NextSink
{
get { return nextSink; }
}
public MyAopHandler(IMessageSink nextSink)
{
this.nextSink = nextSink;
}
//同步處理方法
public IMessage SyncProcessMessage(IMessage msg)
{
IMessage retMsg = null;
//方法呼叫訊息介面
IMethodCallMessage call = msg as IMethodCallMessage;
//如果被呼叫的方法沒打MyInterceptorMethodAttribute標籤
if (call == null || (Attribute.GetCustomAttribute(call.MethodBase, typeof(MyInterceptorMethodAttribute))) == null)
{
retMsg = nextSink.SyncProcessMessage(msg);
}
//如果打了MyInterceptorMethodAttribute標籤
else
{
MessageBox.Show("執行之前");
retMsg = nextSink.SyncProcessMessage(msg);
MessageBox.Show("執行之後");
}
return retMsg;
}
//非同步處理方法(不需要)
public IMessageCtrl AsyncProcessMessage(IMessage msg, IMessageSink replySink)
{
return null;
}
}
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Contexts;
using System.Runtime.Remoting.Proxies;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Services;
using System.Runtime.Remoting.Activation;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
BusinessHandler handler = new BusinessHandler();
handler.DoSomething();
}
}
}
//業務層的類和方法,讓它繼承自上下文繫結類的基類
[MyInterceptor]
public class BusinessHandler : ContextBoundObject
{
[MyInterceptorMethod]
public void DoSomething()
{
MessageBox.Show("執行了方法本身!");
}
}
//貼在方法上的標籤
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public sealed class MyInterceptorMethodAttribute : Attribute { }
//貼在類上的標籤
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public sealed class MyInterceptorAttribute : ContextAttribute, IContributeObjectSink
{
public MyInterceptorAttribute()
: base("MyInterceptor")
{ }
//實現IContributeObjectSink介面當中的訊息接收器介面
public IMessageSink GetObjectSink(MarshalByRefObject obj, IMessageSink next)
{
return new MyAopHandler(next);
}
}
//AOP方法處理類,實現了IMessageSink介面,以便返回給IContributeObjectSink介面的GetObjectSink方法
public sealed class MyAopHandler : IMessageSink
{
//下一個接收器
private IMessageSink nextSink;
public IMessageSink NextSink
{
get { return nextSink; }
}
public MyAopHandler(IMessageSink nextSink)
{
this.nextSink = nextSink;
}
//同步處理方法
public IMessage SyncProcessMessage(IMessage msg)
{
IMessage retMsg = null;
//方法呼叫訊息介面
IMethodCallMessage call = msg as IMethodCallMessage;
//如果被呼叫的方法沒打MyInterceptorMethodAttribute標籤
if (call == null || (Attribute.GetCustomAttribute(call.MethodBase, typeof(MyInterceptorMethodAttribute))) == null)
{
retMsg = nextSink.SyncProcessMessage(msg);
}
//如果打了MyInterceptorMethodAttribute標籤
else
{
MessageBox.Show("執行之前");
retMsg = nextSink.SyncProcessMessage(msg);
MessageBox.Show("執行之後");
}
return retMsg;
}
//非同步處理方法(不需要)
public IMessageCtrl AsyncProcessMessage(IMessage msg, IMessageSink replySink)
{
return null;
}
}
相關文章
- AOP的簡單實現
- SpringFramework中的AOP簡單使用SpringFramework
- Spring Aop簡單理解Spring
- oracle的訊息簡單示例Oracle
- jsoncpp簡單示例JSON
- Java使用ObjectMapper的簡單示例JavaObjectAPP
- 【GLSL教程】(四)shder的簡單示例
- spring之AOP的概念及簡單案例Spring
- C# superSocket簡單示例C#
- jquery驗證簡單示例jQuery
- oracle審計簡單示例Oracle
- Kafka實戰-簡單示例Kafka
- akka入門-簡單示例
- spring aop expression簡單說明SpringExpress
- SpringBoot切面Aop的demo簡單講解Spring Boot
- [譯]ViewModels:一個簡單的示例View
- arguments的應用示例簡單介紹
- Nginx簡單的負載均衡配置示例Nginx負載
- 一個簡單的狀態列示例
- 一個簡單的 indexedDB 應用示例Index
- Spring AOP就是這麼簡單啦Spring
- Spring【AOP模組】就是這麼簡單Spring
- sed命令簡單使用示例分享
- Windows守護程式簡單示例Windows
- Python函式簡單示例Python函式
- jquery函式$.proxy簡單示例jQuery函式
- Java - Apache Mina 簡單示例JavaApache
- [zz]makefile寫法簡單示例
- Spring Boot實際專案用簡單的AOPSpring Boot
- 簡易版的Spring框架之AOP簡單實現(對我來說不簡單啊)Spring框架
- 寫一個簡單的 Facade 示例
- 幾種常用設計模式的簡單示例設計模式
- linux下定時任務的簡單示例Linux
- shell的圖形化實現簡單示例
- Python 裝飾器簡單示例Python
- 超簡單入門Vuex小示例Vue
- flv.js簡單使用示例JS
- SQL server觸發器簡單示例SQLServer觸發器