ASP.NET Core中使用IOC三部曲(三.采用替換后的Autofac來實現AOP攔截)


前言

本文主要是詳解一下在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

 

寫在最后

三部曲到此就結束了.  喜歡的請點個推薦和關注,~有問題也希望各位批評指正~.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM