之前提到添加全局攔截器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 的全部方法都會跳轉攔截器