日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

用代理技术实现简单的AOP框架

發布時間:2023/12/13 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用代理技术实现简单的AOP框架 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在許多的實現AOP框架的技術中,不管是靜態織入還是動態織入,關鍵點在于攔截方法,并在方法中加入預處理和后處理。而實現方法的攔截的一個簡單辦法就是 把類的實例委托給類的真實代理(RealProxy).這樣以來,方法的調用都會被轉換成消息(IMessage),同時該消息作為參數被送到真實代理的 Invoke方法。所以我們相應地改寫Invoke方法,加入預處理和后處理也就OK了。

根據這個思路,可以給出一個簡單的代碼實現:
一,定義方法攔截的接口
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Remoting.Messaging;

namespace LYG.Share.Interface
{
??? public interface IInterceptor
??? {
??????? void PreProcess(IMessage requestMSG);
??????? void PostProcess(IMessage requestMSG, IMessage returnMSG);
??? }
}
二,真實代理的實現
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Proxies;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Activation;
using System.Runtime.Remoting.Services;
using LYG.Share .Interface ;

namespace LYG.Share.AOP.Proxies
{
??? public abstract class AspectProxy : RealProxy, IInterceptor
??? {

??????? private MarshalByRefObject _target = null;

??????? public AspectProxy()
??????????? : base()
??????? {
??????? }
??????? public AspectProxy(Type serverType)
??????????? : base(serverType)
??????? {
??????? }
?????????????
??????? public void InitProxyTarget(MarshalByRefObject target)
??????? {
??????????? this._target = target;
??????? }
??????? public override IMessage Invoke(IMessage msg)
??????? {
??????????? bool useInterception = false;
??????????? IMethodCallMessage invoke = (IMethodCallMessage)msg;

??????????? foreach (InterceptionAttribute attr in invoke.MethodBase.GetCustomAttributes(false))
??????????? {
??????????????? if (attr != null)
??????????????? {
??????????????????? if (attr.UseInterception)
??????????????????? {
??????????????????????? useInterception = true;
??????????????????????? break;
??????????????????? }
??????????????? }
??????????? }

??????????? if (useInterception)
??????????? {
??????????????? this.PreProcess(msg);
??????????? }

??????????? IConstructionCallMessage ctorInvoke = invoke as IConstructionCallMessage;
??????????? if (ctorInvoke != null)
??????????? {
??????????????? RealProxy default_proxy = RemotingServices.GetRealProxy(this._target );
??????????????? default_proxy.InitializeServerObject(ctorInvoke);
??????????????? MarshalByRefObject tp = (MarshalByRefObject)this.GetTransparentProxy();
??????????????? return EnterpriseServicesHelper.CreateConstructionReturnMessage(ctorInvoke, tp);
??????????? }

??????????? IMethodReturnMessage returnMSG = RemotingServices.ExecuteMessage(this._target, invoke);
??????????? if (useInterception)
??????????? {
??????????????? this.PostProcess(msg, returnMSG);
??????????? }
??????????? return returnMSG;
??????? }

??????? #region implemente IInterceptor
??????? public abstract void PreProcess(IMessage requestMSG);
??????? public abstract void PostProcess(IMessage requestMSG, IMessage returnMSG);
??????? #endregion??????
??? }
}
三,代理特性的實現
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Remoting.Proxies;
using LYG.Share .Interface ;

namespace LYG.Share.AOP.Proxies
{
??? [AttributeUsage(AttributeTargets.Class, AllowMultiple = false,Inherited=false)]
??? public class AspectAttribute : ProxyAttribute
??? {
??????? private Type _proxyType = null;
??????? public AspectAttribute(Type proxyType)
??????????? :base()
??????? {
??????????? _proxyType = proxyType;
??????? }
??????? public override MarshalByRefObject CreateInstance(Type serverType)
??????? {
??????????? MarshalByRefObject mobj = base.CreateInstance(serverType);
??????????? AspectProxy proxyInstance = (AspectProxy)Activator.CreateInstance(_proxyType, new object[] { serverType});
??????????? proxyInstance.InitProxyTarget(mobj);
??????????? return proxyInstance.GetTransparentProxy() as MarshalByRefObject;
??????? }
??? }
}
四,方法攔截特性的實現
using System;
using System.Collections.Generic;
using System.Text;

namespace LYG.Share.AOP.Proxies
{
??? [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
??? public class InterceptionAttribute:Attribute
??? {
??????? private bool _useInterception = false;

??????? public InterceptionAttribute(bool useInterception)
??????? {
??????????? this._useInterception = useInterception;
??????? }

??????? public bool UseInterception
??????? {
??????????? get
??????????? {
??????????????? return this._useInterception;
??????????? }
??????? }
??? }
}
五,測試用例
?public class AspectServiceProxy : AspectProxy
??? {
??????
??????? public AspectServiceProxy(Type serverType)
??????????? : base(serverType)
??????? {
??????? }
?????
??????? public override void PreProcess(IMessage requestMSG)
??????? {
????????? //對攔截方法的預處理 ?????????
??????? }
??????? public override void PostProcess(IMessage requestMSG, IMessage returnMSG)
??????? {
??????????? //對攔截方法的后處理
??????? }
??????
??? }

[Aspect(typeof(AspectServiceProxy))]
??? public class AspectServiceClass : ContextBoundObject
??? {
??????? private int _value = 0;
??????? public AspectServiceClass(int value)
??????? {
??????????? _value = value;
??????? }
??????? [Interception(true)]
??????? public int Add(int value)
??????? {
??????????? _value += value;
??????????? return _value;
??????? }????
??????
??? }


....
?????? AspectServiceClass asc=new AspectServiceClass(5);
?????? asc.Add(6);
......

總結

???? 這個AOP框架的主要優點在于當我們要為一個已經寫好的類的方法植入新的處理時,我們不需要對該類的方法實現做修改。只需要實現一個類的攔截代理(如 AspectServiceProxy),并對類加[Aspect(typeof(AspectServiceProxy))]特性,對要被攔截的方法加 [Interception(true)]特性。最重要的是被攔截的類的調用方式沒有任何的改變,AspectServiceClass asc=new AspectServiceClass(5)這樣的調用可能散布在系統的許多地方。如果被經過AOP改造后的類的調用方式發生改變那么就必須修改系統中每 一個調用改類的地方,這樣造成的代碼的變動可能不是我們所期望的,也于AOP理念的初衷是不相符合的(實現上許多的AOP框架都存在這個遺憾)。當然這個 AOP框架的缺點也是顯而易見的,首先,所有要被代理的類都必須繼承自ContextBoundObject,而事實上許多的類可能要實現其他的繼承,一 個愚蠢的辦法就是把ContextBoundObject作為系統中所有類的基類。其次,就是不能實現方法的多重攔截。

轉載于:https://www.cnblogs.com/Aokoo/archive/2007/06/25/794266.html

總結

以上是生活随笔為你收集整理的用代理技术实现简单的AOP框架的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 免费福利视频在线观看 | 欧美日韩亚洲高清 | 中文字幕1页 | av福利在线播放 | 亚洲av中文无码乱人伦在线视色 | 91色九色| av成人动漫 | 日韩在线一卡二卡 | 久久精品这里 | 午夜视频日韩 | 日韩美女少妇 | 国产精品日韩无码 | 狠狠精品干练久久久无码中文字幕 | 久久一 | 熟女高潮一区二区三区视频 | 一级一片免费看 | 亚洲精品亚洲 | 91在线播放视频 | 自由成熟xxxx色视频 | 超碰公开免费 | 精品三级在线 | 亚洲色图狠狠干 | 亚洲一区二区中文 | 五月天一区二区三区 | 欧美午夜精品久久久 | 97狠狠| 国产乱码77777777 | 成人少妇影院yyyy | 青青草成人网 | 欧美一级片在线免费观看 | 欧美性猛交ⅹxx | 在线观看亚洲精品视频 | 亚洲三区在线 | 欧美性色网站 | 最近最新mv字幕观看 | 欧美性天堂 | 少妇特黄a一区二区三区 | 亚洲欧美日韩成人在线 | 色77777| 欧美日韩精选 | 美女被变态侵犯 | 久久精品2019中文字幕 | 欧美xxx视频 | 日韩精品专区 | 在线观看91av | 成人黄色小说视频 | 91精产国品一二三区在线观看 | 中国大陆高清aⅴ毛片 | 久久久国产片 | 日韩成人区 | 亚洲精品www久久久 一级aaa毛片 | www日韩| a级在线观看视频 | 成人免费毛片观看 | 国产h片在线观看 | 中文字幕精品亚洲 | 国产欧美三级 | 国产精品国语自产拍在线观看 | 依人成人| 夜夜撸| 激情五月婷婷综合网 | 亚洲国产丝袜 | 欧美色影院| 双女主黄文 | 放荡闺蜜高h苏桃情事h | 国产精品99久久久久久大便 | 欧美激精品 | 永久免费看成人av的动态图 | 大尺度做爰呻吟舌吻情头 | 成人区视频 | 麻豆视频官网 | 欧美一级做性受免费大片免费 | 婷婷精品进入 | 97超碰精品| 特级黄毛片 | 在线免费看av网站 | 在线看v片 | 黄瓜视频污在线观看 | 秘密的基地| 欧美xxxx69| 中文字幕免费高清视频 | 亚洲婷婷丁香 | 99久久婷婷国产综合精品草原 | 免费看一级黄色片 | 综合久久综合久久 | 97福利影院 | 亚洲男人天堂影院 | 欧美一区二区三区四 | 在线视频日本 | 在线爱情大片免费观看大全 | 国产无毛片 | 激情宗合网| 免费大片黄在线观看 | 精品一区二区三区在线观看 | 人人草人人爱 | jjzz国产| 在线精品福利 | 成年人网站免费视频 | 91精品网|