autofac通過aop對方法執行前後進行攔截(.net core)
阿新 • • 發佈:2022-05-08
.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()