本文主要是詳解一下在ASP.NET Core中,採用替換後的Autofac來實現AOP攔截html
以爲有幫助的朋友~能夠左上角點個關注,右下角點個推薦編程
這裏就不詳細的贅述IOC是什麼 以及DI是什麼了.. emm..不懂的能夠自行百度.asp.net
ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自帶的IOC容器)ide
ASP.NET Core中使用IOC三部曲(二.採用Autofac來替換IOC容器,並實現屬性注入)post
ASP.NET Core中使用IOC三部曲(三.採用替換後的Autofac來實現AOP攔截)ui
上一篇咱們講了如何將默認的容器替換爲Autofac,並使用屬性注入.spa
那麼這一篇咱們就來說講如何利用Autofac實現咱們的AOP(面向切面編程) ..net
既然是跨平臺,那麼在asp.net core由於採用了.net core來做爲基礎庫(固然,其實你能夠換成.NET4.6.).調試
新的.NET Core是基於.NET Standard的..因此咱們在引用庫的時候特別要注意相關的兼容問題.code
在傳統的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..它會幫你引用庫的相關依賴..可是當依賴還有依賴須要更新的時候..它就不會更新..
這個時候咱們換一種思惟..返回來 一步步引用.就能夠了..
首先,咱們建立一個攔截類,代碼以下:
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
三部曲到此就結束了. 喜歡的請點個推薦和關注,~有問題也但願各位批評指正~.