第一步,添加程序集引用
在Nuget中搜索autofac找到Autofac.Extras.DynamicProxy並安裝。
第二步:添加攔截器
/// <summary> /// 攔截器(實現 Castle.DynamicProxy.IInterceptor)接口 /// </summary> public class CustomAutoFacAOPInterception : IInterceptor { public void Intercept(IInvocation invocation) { Console.WriteLine("執行之前可以寫日志、參數檢查……");
//可以捕獲異常 invocation.Proceed(); Console.WriteLine("執行之后可以寫日志……"); } } /// <summary> /// person服務接口 /// </summary> public interface IPerson { string Speak(); } /// <summary> /// 接口的實現類 /// 注意,與Unity實現aop不同,autofac是作用於實現類而不是接口 /// </summary> [Intercept(typeof(CustomAutoFacAOPInterception))] public class Person : IPerson { public string Speak() { return "你好,我是一個Person"; } }
第三步,在注冊模塊注冊攔截器並啟用AOP攔截
/// <summary> /// AutoFac注冊模塊 /// </summary> public class CustomAutoFacModule: Autofac.Module { /// <summary> /// 重寫父類的Load方法 /// </summary> /// <param name="builder"></param> protected override void Load(ContainerBuilder builder) { //1、注冊攔截器 builder.Register(a => new CustomAutoFacAOPInterception()); //2、設置該類型允許AOP攔截 builder.RegisterType<Person>().As<IPerson>().EnableInterfaceInterceptors().SingleInstance(); builder.RegisterType<UserProvider>().As<IUserService>().SingleInstance();//感嘆,這語法,真的是不能再爽了 //后面可以注冊好多類型…… //后面可以注冊好多類型…… //后面可以注冊好多類型…… //后面可以注冊好多類型…… } }
第四步,調用
public class InterceptDemoController : Controller { private IPerson _personService = null; /// <summary> /// 構造注入 /// </summary> /// <param name="person"></param> public InterceptDemoController(IPerson person) { _personService = person; } public IActionResult Index() { string rel = _personService.Speak(); return Content(rel); } }