.net core 3.1 添加攔截器(續)


之前提到添加全局攔截器LogInterceptor,但是有些時候想針對某個類或者某個方法做攔截時,就需要再改進一下。

LogInterceptor 是基於Autofac+Castle.DynamicProxy,Castle.Core 實現的 ,它存在一個問題,除了設置全局攔截外,最小只能針對接口或類做攔截,無法具體到某個方法。

針對這個問題,后面我 引用了AspectCore 解決這個問題。這篇文章先不展開,先接着上文展示如何基於接口或類攔截。

首先新建一個攔截器 MyInterceptor

public class MyInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
try
{
invocation.Proceed();
NLogHelper.logger.Info(invocation.Method.Name);
}
catch (Exception ex)
{
NLogHelper.logger.Error(invocation.Method.Name + " " + ex.ToString());
}
}
}

然后Startup.cs 中ConfigureContainer代碼如下

把LogInterceptor 代碼注釋,但是要保留接口攔截EnableInterfaceInterceptors() ,注入MyInterceptor

public void ConfigureContainer(ContainerBuilder builder)
{
//builder.RegisterType<LogInterceptor>();

builder.RegisterType<MyInterceptor>();

builder.RegisterType<DbFactory>().As<IDbFactory>();

//業務邏輯層所在程序集命名空間
Assembly service = Assembly.Load("Summer.Service"); //注:webapi要引用接口和類,不然這里讀不到
//接口層所在程序集命名空間
Assembly repository = Assembly.Load("Summer.IService");
//自動注入
builder.RegisterAssemblyTypes(service, repository)
.Where(t => t.Name.EndsWith("Service"))
.AsImplementedInterfaces()
.InstancePerLifetimeScope()
.EnableInterfaceInterceptors() //開啟接口攔截
//.InterceptedBy(typeof(LogInterceptor)) //設置全局攔截器,統一由LogInterceptor攔截所有接口的調用
;
}

然后在需要攔截的接口中添加以下代碼

 

 攔截器設置完畢,當調用ITestService 的全部方法都會跳轉攔截器

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM