net core 3.1使用autofac及Castle實現Aop切面編程


構建基本項目及引入需要的包文件

autofac在net core 3.1的使用上與2.2有不同,所以在這里記錄一下。

先創建一個簡單的demo項目,控制台程序及api或者mvc模式都可以。

依次引入依賴包:

Autofac:提供容器控制
Autofac.Extensions.DependencyInjection:對autofac依賴注入進行擴展
Autofac.Extras.DynamicProxy:對autofac動態代理進行擴展
Castle.Core:使用動態代理的實現

  

 

版本有不一致沒關系,這里我加載的是對應的最新的包。

項目中使用

項目中使用有兩個地方要注意:

1.在Program.cs的程序入口要指定使用autofac容器

 public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .UseServiceProviderFactory(new AutofacServiceProviderFactory())  //指定使用autofac
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });

2.在Startup的啟動文件中新增容器入口ConfigureContainer,默認方法及參數不得修改

 

 在這里我創建了一個接口ISay及實現方法Say,注入到容器中。

對應代碼

public interface ISay
    {
        PeopleEntity SayHello(PeopleEntity peopleEntity);
    }

[Intercept(typeof(InjectInterceptor))]
    public class Say : ISay
    {
        public PeopleEntity SayHello(PeopleEntity peopleEntity)
        {
            peopleEntity.Name = $"hello {peopleEntity.Name}";
            return peopleEntity;
        }
    }

在這里我們使用的時候在控制器直接注入使用就行了

 

 

 在這里簡單的使用autofac的容器使用就完成了。

下面我們來使用Castle來實現aop的使用

新建一個攔截器類,名為InjectInterceptor,而且必須要實現IInterceptor(該接口在Castle.DynamicProxy中),即Intercept虛方法,該方法將傳遞IInvocation接口參數。

public class InjectInterceptor : IInterceptor
    {
        public virtual void Intercept(IInvocation invocation)
        {
            PreProceed(invocation);
            invocation.Proceed();
            Console.WriteLine(invocation.ReturnValue);
            PostProceed(invocation);
        }

        private void PreProceed(IInvocation invocation)
        {
            Console.WriteLine($"{DateTime.Now} interceptor invoke start");
        }

        private void PostProceed(IInvocation invocation)
        {
            Console.WriteLine($"{DateTime.Now} interceptor invoke end");
        }
    }

 

  在這里,我標記Say的方法,這里指明Intercept只能標記類或接口,不能標記特定的方法,所以你標記對應的類或接口時,內部的方法都會被攔截。

 [Intercept(typeof(InjectInterceptor))]
    public class Say : ISay

  在這里說明,這里是配合autofac使用的所以需要在Startup中的ConfigureContainer方法中注冊攔截方法及注冊這個Say方法時要開啟允許方法攔截。

builder.RegisterType<InjectInterceptor>();
builder.RegisterType<Say>().As<ISay>().EnableInterfaceInterceptors();

  嗯,就這樣。


免責聲明!

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



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