国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

.NET Core類庫System.Reflection.DispatchProxy實現簡易Aop的方法

2024-07-10 12:48:33
字體:
來源:轉載
供稿:網友

前言

aop即是面向切面編程,眾多Aop框架里Castle是最為人所知的,另外還有死去的Spring.NET,當然,.NET Core社區新秀AspectCore在性能與功能上都非常優秀,已經逐漸被社區推崇和有越來越多的人使用。感謝檸檬同學的禮物!

如果大家出于自身需求或者學習,想實現一個Aop,是不是覺得一來就要使用Emit去做?最近我了解到了System.Reflection.DispatchProxy這個corefx類庫,已經實現了動態代理功能。

1|1System.Reflection.DispatchProxy

下面演示一下它的使用方法:

class Program{ static void Main(string[] args) {  //創建代理類,并把SampleProxy作為攔截器注入  var sampleProxy = (targetInterface)SampleProxy.Create<targetInterface, SampleProxy>();  //執行接口方法  sampleProxy.Write("here is invoke by proxy"); }}//需要被生成代理實例的接口public interface targetInterface{ //這個方法會被代理類實現 void Write(string writesomeshing);}public class SampleProxy : DispatchProxy{ /// <summary> /// 攔截調用 /// </summary> /// <param name="method">所攔截的方法信息</param> /// <param name="parameters">所攔截方法被傳入的參數指</param> /// <returns></returns> protected override object Invoke(MethodInfo targetMethod, object[] args) {  Console.WriteLine(args[0]);  return null; }}

2|0改造成一款簡易AOP

2|1為什么?

System.Reflection.DispatchProxy只有一個Api,就是objecct Create<T,TProxy>() where TProxy:DispatchProxy,約束了只能傳入泛型參數,并不能從方法傳入類型,這就會帶來很多問題。而更可氣的是,給官方提了issue之后,還是不給增加這個api……

2|2改造方法

幸好,在那個issue下,issue作者提供了一個解決方案,就是用反射來構造這個泛型方法。我還在這基礎上,封裝了一下,加入了傳入攔截器實例和傳入攔截器構造方法參數的功能。

/// <summary>/// 攔截器接口/// </summary>public interface IInterceptor{ /// <summary> /// 攔截器調用 /// </summary> /// <param name="target">代理實例</param> /// <param name="method">所攔截的方法</param> /// <param name="parameters">所攔截方法傳入的參數值</param> /// <returns>返回值會傳遞給方法返回值</returns>  object Intercept(object target, MethodInfo method, object[] parameters);}

攔截器要實現這個接口,下面是對DispatchProxy的封裝,實現更多創建代理實例的方法

public class ProxyGenerator : DispatchProxy{ private IInterceptor interceptor { get; set; } /// <summary> /// 創建代理實例 /// </summary> /// <param name="targetType">所要代理的接口類型</param> /// <param name="interceptor">攔截器</param> /// <returns>代理實例</returns> public static object Create(Type targetType, IInterceptor interceptor) {  object proxy = GetProxy(targetType);  ((ProxyGenerator)proxy).CreateInstance(interceptor);  return proxy; } /// <summary> /// 創建代理實例 /// </summary> /// <param name="targetType">所要代理的接口類型</param> /// <param name="interceptorType">攔截器類型</param> /// <param name="parameters">攔截器構造函數參數值</param> /// <returns>代理實例</returns> public static object Create(Type targetType, Type interceptorType, params object[] parameters) {  object proxy = GetProxy(targetType);  ((ProxyGenerator)proxy).CreateInstance(interceptorType, parameters);  return proxy; } /// <summary> /// 創建代理實例 TTarget:所要代理的接口類型 TInterceptor:攔截器類型 /// </summary> /// <param name="parameters">攔截器構造函數參數值</param> /// <returns>代理實例</returns> public static TTarget Create<TTarget, TInterceptor>(params object[] parameters) where TInterceptor : IInterceptor {  var proxy = GetProxy(typeof(TTarget));  ((ProxyGenerator)proxy).CreateInstance(typeof(TInterceptor), parameters);  return (TTarget)proxy; } private static object GetProxy(Type targetType) {  var callexp = Expression.Call(typeof(DispatchProxy), nameof(DispatchProxy.Create), new[] { targetType, typeof(ProxyGenerator) });  return Expression.Lambda<Func<object>>(callexp).Compile()(); } private void CreateInstance(Type interceptorType, object[] parameters) {  var ctorParams = parameters.Select(x => x.GetType()).ToArray();  var paramsExp = parameters.Select(x => Expression.Constant(x));  var newExp = Expression.New(interceptorType.GetConstructor(ctorParams), paramsExp);  this.interceptor = Expression.Lambda<Func<IInterceptor>>(newExp).Compile()(); } private void CreateInstance(IInterceptor interceptor) {  this.interceptor = interceptor; } protected override object Invoke(MethodInfo method, object[] parameters) {  return this.interceptor.Intercept(method, parameters); }}            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 元阳县| 方城县| 岑溪市| 舟曲县| 根河市| 巴里| 明光市| 治多县| 郓城县| 贵阳市| 阳谷县| 汝城县| 蕲春县| 青岛市| 昭苏县| 乐平市| 太谷县| 大渡口区| 海南省| 潞城市| 内江市| 巴彦县| 东乌| 阳信县| 平乐县| 永德县| 西乡县| 甘谷县| 吴忠市| 嘉峪关市| 内江市| 樟树市| 沈阳市| 永靖县| 枣阳市| 嘉荫县| 兴化市| 噶尔县| 武邑县| 绥芬河市| 衢州市|