autofac通过aop对方法执行前后进行拦截(.net core)
.net core中,如果想要在控制器请求前和请求后输出日志,是非常好实现的,直接使用拦截器就能达到目的。但是如果想要对服务层的方法进行拦截该如何实现呢?这里介绍使用autofac的方式实现。如果对autofac的使用不熟悉可以参考:https://www.cnblogs.com/duanjt/p/16246546.html。
引入nuget包
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="7.0.0" /> <PackageReference Include="Autofac.Extras.DynamicProxy" Version="6.0.1" />
定义接口类和实现类
// 注意Intercept是核心,CacheInterception表示拦截类,后面会创建该类 [Intercept(typeof(CacheInterception))] public interface IUsersBLL { public List<Users> GetAll(); } public class UsersBLL : IUsersBLL { public virtual List<Users> GetAll() { return new List<Users>() { new Users(){Name="张三"}, new Users(){Name="李四"} }; } }
定义拦截类CacheInterception
/// <summary> /// 缓存拦截器,必须实现IInterceptor接口 /// </summary> public class CacheInterception : IInterceptor { public void Intercept(IInvocation invocation) { Console.WriteLine("执行前:" + invocation.Method.ReflectedType.FullName); invocation.Proceed();//执行 Console.WriteLine("执行后:" + JsonConvert.SerializeObject(invocation.ReturnValue)); } }
最后就是在注入方法ConfigureContainer中修改
public void ConfigureContainer(ContainerBuilder builder) { //EnableInterfaceInterceptors表示启用接口拦截 builder.RegisterType<UsersBLL>().As<IUsersBLL>().EnableInterfaceInterceptors(); //将拦截类注入到容器中 builder.Register(c => new CacheInterception()); }
注意:
1.UsersBLL中的方法必须是虚方法
2.[Intercept(typeof(CacheInterception))]也有另外一种写法,就是在注入时直接加上builder.RegisterType<UsersBLL>().As<IUsersBLL>().InterceptedBy(typeof(CacheInterception)).EnableInterfaceInterceptors()