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

前言

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

1.引用正確的庫來實現AOP

既然是跨平臺,那麼在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..它會幫你引用庫的相關依賴..可是當依賴還有依賴須要更新的時候..它就不會更新..

這個時候咱們換一種思惟..返回來 一步步引用.就能夠了..

 

 

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

 

寫在最後

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

相關文章
相關標籤/搜索