免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
ASP.NET Core 3.0 使用AspectCore-Framework實現(xiàn)AOP

AspectCore是適用于Asp.Net Core 平臺的輕量級Aop(Aspect-oriented programming)解決方案,它更好的遵循Asp.Net Core的模塊化開發(fā)理念,使用AspectCore可以更容易構建低耦合、易擴展的Web應用程序。

在使用過程中,由于相關文檔、博客還未更新到.Net Core 3.0,本文操作參考了使用.Net Core 3.0的EasyCaching,并對其中公用的方法進行封裝簡化。

安裝Aspectcore

此處配合微軟自家的DI實現(xiàn),安裝Nuget包AspectCore.Extensions.DependencyInjection,其中包含AspectCore.Core和Microsoft.Extensions.DependencyInjection兩個依賴。

Install-Package AspectCore.Extensions.DependencyInjection -Version 1.3.0

攔截器

  • 特性攔截器
    新建一個特性攔截器TestInterceptorAttribute,繼承AbstractInterceptorAttribute,并重寫Invoke方法,在方法中實現(xiàn)攔截相關業(yè)務。
public class TestInterceptorAttribute : AbstractInterceptorAttribute{    public override Task Invoke(AspectContext context, AspectDelegate next)    {        return context.Invoke(next);    }}
  • 全局攔截器
    新建一個全局攔截器TestInterceptor,繼承AbstractInterceptor,并重寫Invoke方法,在方法中實現(xiàn)攔截相關業(yè)務。
public class TestInterceptor : AbstractInterceptor{    public override Task Invoke(AspectContext context, AspectDelegate next)    {        return context.Invoke(next);    }}

注冊服務

以下注冊方式僅適用于asp.net core 3.0(目前只到3.0),已知在2.2版本中,需要在ConfigureServices方法中返回IServiceProvider,并且program.cs中也不再需要替換ServiceProviderFactory。
1.創(chuàng)建AspectCoreEctensions.cs擴展IServiceCollection

public static class AspectCoreExtensions{	public static void ConfigAspectCore(this IServiceCollection services)	{        services.ConfigureDynamicProxy(config =>		{            //TestInterceptor攔截器類            //攔截代理所有Service結(jié)尾的類			config.Interceptors.AddTyped<TestInterceptor>(Predicates.ForService("*Service"));		});		services.BuildAspectInjectorProvider();	}}

2.在Startup.cs中注冊服務

public void ConfigureServices(IServiceCollection services){       services.ConfigAspectCore();}

3.在Program.cs中替換ServiceProviderFactory

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

被攔截方法編寫

  • 代理接口:在接口上標注Attribute
public interface ITestService{	[TestInterceptor]	void Test();}
  • 代理類(方法):在方法上標注Attribute,并且標注virtual
public class TestService{    [TestInterceptor]    public virtual void Test()    {        //業(yè)務代碼    }}

攔截器業(yè)務編寫

  • 執(zhí)行被攔截方法
private async Task<object> RunAndGetReturn(){	await Context.Invoke(Next);	return Context.IsAsync()		? await Context.UnwrapAsyncReturnValue()		: Context.ReturnValue;}
  • 攔截器中的依賴注入
[FromContainer]private RedisClient RedisClient { get; set; }
  • 獲取被攔截方法的Attribute
private static readonly ConcurrentDictionary<MethodInfo, object[]>					MethodAttributes = new ConcurrentDictionary<MethodInfo, object[]>();public static T GetAttribute<T>(this AspectContext context) where T : Attribute{	MethodInfo method = context.ServiceMethod;	var attributes = MethodAttributes.GetOrAdd(method, method.GetCustomAttributes(true));	var attribute = attributes.FirstOrDefault(x => typeof(T).IsAssignableFrom(x.GetType()));	if (attribute is T)	{		return (T)attribute;	}	return null;}
  • 獲取被攔截方法返回值類型
public static Type GetReturnType(this AspectContext context){	return context.IsAsync()		? context.ServiceMethod.ReturnType.GetGenericArguments()First()		: context.ServiceMethod.ReturnType;}
  • 處理攔截器返回結(jié)果
private static readonly ConcurrentDictionary<Type, MethodInfo>				   TypeofTaskResultMethod = new ConcurrentDictionary<Type, MethodInfo>();public object ResultFactory(this AspectContext context,object result){	var returnType = context.GetReturnType();    //異步方法返回Task<T>類型結(jié)果	if (context.IsAsync())	{		return TypeofTaskResultMethod				.GetOrAdd(returnType, t => typeof(Task)				.GetMethods()				.First(p => p.Name == "FromResult" && p.ContainsGenericParameters)				.MakeGenericMethod(returnType))				.Invoke(null, new object[] { result });	}	else	{		return result;	}}

相關鏈接

本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
一文說通Dotnet Core的中間件
Dotnet Core Public API的安全實踐
CXF客戶端請求服務流程,cxf客戶端服務流程
XFire客戶端流程分析
spring boot-實現(xiàn)WebService(CXF實現(xiàn))的攔截器(Interceptor)
使用ThreadLocal結(jié)合struts2的攔截器實現(xiàn)分頁
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服