.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 的全部方法都会跳转拦截器
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步