本文主要是詳解一下在ASP.NET Core中,采用替換后的Autofac來實現AOP攔截
覺得有幫助的朋友~可以左上角點個關注,右下角點個推薦
這里就不詳細的贅述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度.
目錄
ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自帶的IOC容器)
ASP.NET Core中使用IOC三部曲(二.采用Autofac來替換IOC容器,並實現屬性注入)
ASP.NET Core中使用IOC三部曲(三.采用替換后的Autofac來實現AOP攔截)
上一篇我們講了如何將默認的容器替換為Autofac,並使用屬性注入.
那么這一篇我們就來講講如何利用Autofac實現我們的AOP(面向切面編程) .
1.引用正確的庫來實現AOP
既然是跨平台,那么在asp.net core因為采用了.net core來作為基礎庫(當然,其實你可以換成.NET4.6.).
新的.NET Core是基於.NET Standard的..所以我們在引用庫的時候特別要注意相關的兼容問題.
在傳統的ASP.NET中,使用過Autofac來進行AOP操作的,應該都知道這個庫.
Autofac.Extras.DynamicProxy
那么我們來看看它的依賴項.如圖:

在.NET Standard的情況下,他需要Autofac4.0+,這個就不多說了.關鍵在下面這個,他需要Castle.Core4.0+.
所以,當我們直接安裝這個庫的時候,Nuget會自動關聯並安裝最新的Castle.Core4.2.1版本..
那么問題就出現了..在項目的依賴項中,會發現很多警告:

我們進入警告會發現..都是提示缺少兼容的最新的類型轉換類.如圖:

而且Castle.Core是屬於AutoFac下面的..如圖:

我們直接通過Nuget查找Castle.Core.
可以發現,它需要System.ComponentModel.TypeConverter4.3..

我們直接安裝它,Nuget則會直接幫我們把System.ComponentModel.TypeConverter更新到4.3的版本..
然后重新通過Nuget安裝Autofac.Extras.DynamicProxy..就可以了.如圖:

其實這應該算一個Nuget的BUG..它會幫你引用庫的相關依賴..但是當依賴還有依賴需要更新的時候..它就不會更新..
這個時候我們換一種思維..返回來 一步步引用.就可以了..
2.采用Autofac來實現AOP
首先,我們創建一個攔截類,代碼如下:
public class AOPTest : IInterceptor { public void Intercept(IInvocation invocation) { System.Diagnostics.Debug.WriteLine("你正在調用方法 \"{0}\" 參數是 {1}... ", invocation.Method.Name, string.Join(", ", invocation.Arguments.Select(a => (a ?? "").ToString()).ToArray())); //在被攔截的方法執行完畢后 繼續執行 invocation.Proceed(); System.Diagnostics.Debug.WriteLine("方法執行完畢,返回結果:{0}", invocation.ReturnValue); } }
這里,需要繼承IInterceptor,然后實現它的Intercept方法..我們直接將攔截內容輸出到調試窗(正式項目..請根據業務來操作攔截)..
找到我們要攔截的服務.並設置攔截特性(有多種方式.用特性的方式作為例子..個人也覺得特性AOP攔截比較方便),代碼如下:
[Intercept(typeof(AOPTest))] public class TestService: ITestService { public TestService() { MyProperty = Guid.NewGuid(); } public Guid MyProperty { get; set; } public List<string> GetList(string a) { return new List<string>() { "LiLei", "ZhangSan", "LiSi" }; } }
然后在容器中注入我們的AOP攔截類,並開啟服務的攔截狀態.代碼如下:
public class DefaultModule : Module { protected override void Load(ContainerBuilder builder) { builder.Register(c => new AOPTest()); builder.RegisterType<TestService>().As<ITestService>().PropertiesAutowired().EnableInterfaceInterceptors(); } }
這里注意,一定要在你注入的服務后面加上EnableInterfaceInterceptors來開啟你的攔截.
然后在控制器中調用服務的方法,代碼如下:
public class AutoDIController : Controller { public ITestService _testService { get; set; } // GET: AutoDI public ActionResult Index() { ViewBag.date = _testService.GetList("Name"); return View(); } }
然后我們運行代碼.
效果如下:

這樣,我們就完成了使用Autofac進行AOP攔截..
Autofac的AOP攔截器還有很多功能與用法.我這里就不一一舉例了..請參考官網:http://docs.autofac.org/en/latest/advanced/interceptors.html
三部曲到此就結束了. 喜歡的請點個推薦和關注,~有問題也希望各位批評指正~.
