.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 的全部方法都会跳转拦截器