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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

NCoreCoder.Aop详解

發布時間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NCoreCoder.Aop详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

于今天,功能終于完善度到比較滿意的程度了

準備好好寫一篇文章,而不是之前的流水賬,分享一下最近這些天的踩坑


?

一開始AOP選的微軟提供的DispatchProxy

關于這個,有大佬的文章,可以看看,了解一下

https://www.cnblogs.com/ElderJames/p/implement-simple-Aop-using-a-dotnet-core-library-System-Reflection-DispatchProxy.html

初步完成后,發現幾個大問題,異步不支持,不支持構造器注入,代理類必須是繼承DispatchProxy的公開類

我就想到我偶像Lemon大佬的著作AspectCore了,依稀記得是Emit構建的代理類

也有代碼可以參考學習,那就開干,前后四天多的時間,終于完工

下面介紹一下我的AOP組件?NCoreCoder.Aop的使用以及高級應用


?

簡單的使用NCoreCoder.Aop

NCoreCoder.Aop支持依賴注入,用依賴注入的方式完成代理類和接口的關聯

支持.Net Core 3.0以及以下的依賴注入方式

示例

public interface IMyClass{void TestVoid();int TestInt();Task TestAsync();Task<int> TestIntAsync();}[JitInject]internal class MyClass : IMyClass{public void TestVoid(){Console.WriteLine("TestVoid");}public int TestInt(){Console.WriteLine("TestInt");return 100;}public Task TestAsync(){Console.WriteLine("TestAsync");return Task.CompletedTask;}public Task<int> TestIntAsync(){Console.WriteLine("TestIntAsync");return Task.FromResult(100);}}

打上JitInject特性是證明這個類需要實現代理

這里就只是構建代理類,沒有方法并走代理流程,代理支持 同步API、異步無返回值API、異步有返回值API

要攔截的方法,默認是繼承JitAopAttribute,打特性方式完成攔截器注入

打在繼承的實現類上

比如

[AttributeUsage(AttributeTargets.Method)]internal class TestJitAttribute : JitAopAttribute{public override void Before(MethodReflector method, object instance, params object[] param){}public override void After(MethodReflector method, object instance, params object[] param){}public override Task BeforeAsync(MethodReflector method, object instance, params object[] param){return Task.CompletedTask;}public override Task AfterAsync(MethodReflector method, object instance, params object[] param){return Task.CompletedTask;}}

在需要攔截的方法上,打上TestJit即可

[TestJit]public void TestVoid(){Console.WriteLine("TestVoid");}public int TestInt(){Console.WriteLine("TestInt");return 100;}public Task TestAsync(){Console.WriteLine("TestAsync");return Task.CompletedTask;}public Task<int> TestIntAsync(){Console.WriteLine("TestIntAsync");return Task.FromResult(100);}}

這樣TestVoid方法就要走AOP流程了

Asp.Net Core 3.0以下

因為Asp.Net Core 3.0以下的Startup.ConfigService方法支持直接修改返回值變成IServiceProvider

所以在Asp.Net Core 3.0以下,依賴注入都是在Startup.ConfigService里面修改IServiceProvider到自定義的IServiceProvider完成替換依賴注入容器和流程的效果,比如Autofac

public void ConfigureServices(IServiceCollection services){services.AddMvc();//略略略}

改為

public IServiceProvider ConfigureServices(IServiceCollection services){services.AddMvc();//略略略service.AddSingleton<IMyClass, MyClass>();//修改Ioc容器流程return service.BuilderJit();}

Asp.Net Core 3.0

Asp.Net Core 3.0的替換依賴注入流程變了

無法再修改Startup.ConfigService返回值了,只要不是void,運行就拋出異常

查看的Program.CreateHostBuilder

public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseStartup<Startup>();});

改為

public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).UseServiceProviderFactory(new JitServiceProviderFactory()) //新增.ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseStartup<Startup>();});

這里可以保持原有依賴注入,也可以增加一個方法

public void ConfigureContainer(JitAopBuilder builder){builder.Add<IMyClass, MyClass>(ServiceLifetime.Singleton);}

測試Aop

var service = new ServiceCollection();service.AddSingleton<IMyClass, MyClass>();var serviceProvider = service.BuilderJit();TypeBuilderFactory.Instance.Save();var myclass = serviceProvider.GetRequiredService<IMyClass>();Task.Factory.StartNew(async () =>{myclass.TestVoid();var result1 = myclass.TestInt();await myclass.TestAsync();var result2 = await myclass.TestIntAsync();});Console.ReadLine();

我們運行看看myclass對象是什么~

?

不是原有的MyClass對象


高級擴展

我們現在如果要針對不同流程,而不是默認的Before->After

那么我們就需要自定義一個IAopActors了

我們默認的JitAopAttribute的流程就是一個默認DefaultAopActors

?

編寫一個公開的類,繼承自IAopActors

IAopActors接口如下

?

然后再接口上打上特性AopActorsAttribute

特性的構造參數是Type對應了自定義的AopActors的Type

public class TestActors : IAopActors{public object Execute(AopContext context){throw new NotImplementedException();}public Task<TResult> ExecuteAsync<TResult>(AopContext context){throw new NotImplementedException();}public Task InvokeAsync(AopContext context){throw new NotImplementedException();}} [AopActors(typeof(TestActors))]public interface IMyClass{void TestVoid();int TestInt();Task TestAsync();Task<int> TestIntAsync();}

個人文筆不好,如有疑問,可以加“.Net應用程序框架交流” 群號386092459 歡迎到群里和我反饋Bug或者建議、交流Aop設計和Emit的知識

轉載于:https://www.cnblogs.com/NCoreCoder/p/11597788.html

總結

以上是生活随笔為你收集整理的NCoreCoder.Aop详解的全部內容,希望文章能夠幫你解決所遇到的問題。

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