用.net4中的DynamicObject实现简单AOP
???????? 在.net framework 4中有一個DynamicObject 類型,我們通過重寫 TryInvokeMember 方法實現簡單的AOP。
首先看類圖:
看下面的代碼:
public class DynamicWrapper : DynamicObject { private readonly object source;? public DynamicWrapper(object source) { this.source = source; }? public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) { var methodInfo = source.GetType().GetMethod(binder.Name); if (methodInfo != null) { Func<object, object[], object> func = (s, a) => methodInfo.Invoke(s, a);? result = MethodCall(func, source, args);? return true; }? result = null;? return false; }? protected virtual object MethodCall(Func<object, object[], object> func, object src, object[] args) { return func(src, args); } }我們在上面代碼繼承下加上一個TRY CATCH實現一個TryCatchDynamicWrapper:
public class TryCatchDynamicWrapper : DynamicWrapper { public TryCatchDynamicWrapper(object source) : base(source) { } ? protected override object MethodCall(Func<object, object[], object> func, object src, object[] args) { try { return base.MethodCall(func, src, args); } catch (Exception ex) { Console.WriteLine(ex); throw; } ? } }?? 然后我們寫一個簡單的測試方法,輸入兩個數相除,類圖如下:
代碼是這樣的,這里我們增一個擴展方法,這樣使我們的代碼更加簡潔,您會在后面的Unit Test中看到:
1: public interface ITestObject 2: { 3: int Div(int num1, int num2); 4: } 5: ? 6: public class TestObject : ITestObject 7: { 8: ? 9: #region ITestObject Members 10: ? 11: public int Div(int num1,int num2) 12: { 13: return num1 / num2; 14: } 15: ? 16: #endregion 17: ? 18: public ITestObject WrapDynamicConsoleLogging 19: { 20: get 21: { 22: return this.WithMethodConsoleLogging(); 23: } 24: } 25: } 26: ? 27: public static class Extenstions 28: { 29: public static dynamic WithMethodConsoleLogging(this ITestObject testobject) 30: { 31: return new DynamicLoggingWrapper(Activator.CreateInstance<TestObject>(), ConsoleLogger.Instance); 32: } 33: ? 34: public static dynamic WrapWith<T>(this ITestObject testobject) where T : DynamicWrapper 35: { 36: return Activator.CreateInstance(typeof(T), new object[] { Activator.CreateInstance<TestObject>() }); 37: } 38: }Unit Test,如何使用呢:
1: [Test] 2: [ExpectedException(typeof(TargetInvocationException))] 3: public void TestTryCatchDynamicWrapper() 4: { 5: dynamic proxy = new TryCatchDynamicWrapper(new TestObject()); 6: var ll = proxy.Div(6, 0); 7: } 8: ? 9: [Test] 10: [ExpectedException(typeof(TargetInvocationException))] 11: public void TestTryCatchDynamicWrapper2() 12: { 13: dynamic proxy = new TestObject().WrapWith<TryCatchDynamicWrapper>(); 14: var ll = proxy.Div(6, 0); 15: }注意到代碼故意產生Exception來檢測AOP是否有效。第二個方法使用擴展方法看上去更加簡潔。當我們還可以寫一個泛型版本的,看類圖:
代碼是這樣的:
public class DynamicGenericWrapper<T> : DynamicObject where T : class { public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) { var methodInfo = typeof(T).GetMethod(binder.Name); if (methodInfo != null) { Func<object, object[], object> func = (s, a) => methodInfo.Invoke(s, a);? result = MethodCall<T>(func, args);? return true; }? result = null;? return false; }? protected virtual object MethodCall<T>(Func<object, object[], object> func, object[] args) { var targetclass = Activator.CreateInstance<T>(); return func(targetclass, args); } }? public class TryCatchDynamicWrapper : DynamicWrapper { public TryCatchDynamicWrapper(object source) : base(source) { }? protected override object MethodCall(Func<object, object[], object> func, object src, object[] args) { try { return base.MethodCall(func, src, args); } catch (Exception ex) { Console.WriteLine(ex); throw; }? } }UnitTest:
1: [Test] 2: [ExpectedException(typeof(TargetInvocationException))] 3: public void TestTryCatchDynamicGenericWrapper() 4: { 5: dynamic proxy = new TryCatchDynamicGenericWrapper<TestObject>(); 6: var ll = proxy.Div(6, 0); 7: }這樣我們實現.NET4 了簡單的異常處理。您還可以繼承DynamicWrapper實現事務,日志等功能。
您可以感興趣文章:
使用Unity2.0的Interceptor實現簡單AOP
使用EnterpriseLibrary的PIAB與Unity搭建簡單AOP框架
希望這篇POST對您開發有幫助!
作者:Petter Liu
出處:http://www.cnblogs.com/wintersun/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
該文章也同時發布在我的獨立博客中-Petter Liu Blog。
轉載于:https://www.cnblogs.com/wintersun/archive/2011/06/19/2084755.html
總結
以上是生活随笔為你收集整理的用.net4中的DynamicObject实现简单AOP的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LCA 练习总结
- 下一篇: Appium python adb命令