nucleus.mockaop.net:opensource .net aop framework

Nucleus.MockAOP.Net簡介

一、功能

  • 基於配置文件,動態載入Aspects

  • 對不同的類,指定不同的Aspects (基於正則表達式或者繼承關係)

  • 對類的不同方法,指定不同的Aspects (基於正則表達式)

  • 指定Aspects的相對執行順序

  • 提供了一種ChainOfResponsbility模式的RealProxy實現,並提供了該RealProxy所需的Aspect的框架,及三個示例Aspect,分別用來計算執行時間、打印輸入參數和返回值、和捕捉所有異常

二、限制

  • 未找到好方法將Aspect變爲無狀態,導致每new一個正常對象,都會附帶若干Aspect對象,性能受影響

  • 未找到好方法最靈活的配置類、方法與Aspects的關聯,現在配置信息散落在各處,加大了對象之間的耦合,加重了Aspect對象的負擔,如現在每個Aspect對象都要判斷當前被調用的原始方法是否匹配在配置文件中的配置,若匹配才切入,否則不予理睬

  • 尚未實現RealProxy的動態配置(即不同的代理策略)

三、使用

  • 將希望被切入Aspect的類(即受AOP管理的類)從Nucleus.MockAOP.AspectManagedObject派生,則該類及其子類都將受AOP管理;如果某個個別子類希望脫離管理,則聲明時將AspectManaged屬性置爲false即可

Nucleus.MockAOP.AspectManagedObject定義

namespace Nucleus.MockAOP {

     [AspectManaged]

     public class AspectManagedObject : ContextBoundObject {

     }

}

希望受AOP管理的類定義

public class SomeBusinessClass : AspectManagedObject {

     public string SomeProperty {

         get{return "pone";}

     }

}

父類受AOP管理,某個子類希望脫離AOP管理

[AspectManaged(false)]

public class SomeFreeClass : BusinessClass {

}

  • IAspect接口

IAspect定義

namespace Nucleus.MockAOP {

     public interface IAspect {

         IMethodReturnMessage SyncExecuteMethod(IMethodCallMessage msg);

         IConstructionReturnMessage SyncExecuteConstructor(IConstructionCallMessage msg);

     }

}

定義新的Aspect

public class TerminatorAspect : IAspect {

     #region IAspect 成員

public IMethodReturnMessage SyncExecuteMethod(IMethodCallMessage msg) {

          return xxx;

     }

     public IConstructionReturnMessage SyncExecuteConstructor(IConstructionCallMessage msg) {

          return xxx;

     }

     #endregion

}

定義與ChainOfResponsbility模式的RealProxy實現合作的Aspect

public class ExceptionAspect : BaseChainNodeAspect {

     protected override IMethodReturnMessage xxxxxx(IMethodCallMessage msg) {

         return xxx;

     }

}

  • 在配置文件中爲類和方法指定Aspects和Aspects的相對執行順序;使用正則表達式(type_name_regex)或者繼承關係(instance_of),當在同一個type_name_pattern中同時使用時,以type_name_regex爲準

  <?xml version="1.0" encoding="utf-8" ?>
- <configuration>
- <configSections>
  <section name="aop_setting" type="Nucleus.MockAOP.AspectConfigHandler, Nucleus.MockAOP" />
  </configSections>
- <aop_setting>
- <type_name_pattern type_name_regex="Nucleus.MockAOP.Test.BusinessClass">
  <aspect type="Nucleus.MockAOP.AspectsChainImpl.DurationAspect" method_name_regex="(-)*" order="10" />
  <aspect type="Nucleus.MockAOP.AspectsChainImpl.MethodInfoAspect" method_name_regex="GetString" order="20" />
  <aspect type="Nucleus.MockAOP.AspectsChainImpl.ExceptionAspect" order="30" />
  </type_name_pattern>
- <type_name_pattern instance_of="Nucleus.MockAOP.Test.IBusiness, Nucleus.MockAOP.Test">
  <aspect type="Nucleus.MockAOP.AspectsChainImpl.DurationAspect" method_name_regex="(-)*" order="10" />
  <aspect type="Nucleus.MockAOP.AspectsChainImpl.MethodInfoAspect" method_name_regex="GetString" order="20" />
  <aspect type="Nucleus.MockAOP.AspectsChainImpl.ExceptionAspect" order="30" />
  </type_name_pattern>
- <type_name_pattern type_name_regex="(Class/*Not/*Exist){1}">
  <aspect type="Nucleus.MockAOP.AspectsChainImpl.DurationAspect" order="10" />
  <aspect type="Nucleus.MockAOP.AspectsChainImpl.MethodInfoAspect" order="20" />
  </type_name_pattern>
  </aop_setting>
  </configuration>

四、下載交流

五、參考資料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章