構建基本項目及引入需要的包文件
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();
嗯,就這樣。